Использование package-info.xml в модах SMF
В этой статье мы разберем структуру файла package-info.xml и его роль в модификациях для SMF 2.1.
Прежде чем читать дальше, вы должны знать некоторые определения, используемые в этой документации:
- Элемент (aka тег): инструкция, используемая для указания менеджеру пакетов, что делать, например
<install></install>. - Атрибут (aka свойство): дополнительное значение, используемое для описания элемента.
- Inline: код или текст, написанный непосредственно в этом файле, а не из внешнего источника.
- File: имя или расположение файла, используемого вместо
inline. - Location (aka path): расположение на компьютере директории и/или файла.
Также есть переменные, которые могут использоваться вместо пути:
$sourcedir: директория, где находятся исходные файлы (например,Post.php,Admin.phpи т. д.).$boarddir: директория, где находится файлSSI.php. Обычно на один уровень выше, чем директория с исходными файлами.$avatardir: директория, где находятся аватары.$themedir: директория, где расположены директории шаблонов.$imagesdir: директория изображений для каждого шаблона.$languagedir: расположение директорий языковых файлов.$smileysdir: расположение директории смайликов.
Файл package-info.xml является одним из ключевых — это «метафайл», который определяет свойства мода, его совместимость с версиями SMF и действия по установке, обновлению или удалению. Без правильной структуры этого файла менеджер пакетов SMF не сможет корректно обработать мод.
Совет
Подробнее о создании модов, работающих на хуках, без правок файлов движка, читайте в статье Как подключать хуки.
Назначение файла package-info.xml⚓︎
Файл package-info.xml служит «инструкцией» для менеджера пакетов SMF. Он:
- Определяет идентичность мода: Уникальный ID, название и версию.
- Указывает тип пакета: Для модов это всегда “modification”.
- Описывает совместимость: С какими версиями SMF мод работает (например, 2.1.0–2.1.99).
- Список действий: Что делать при установке (
<install>), обновлении (<upgrade>) или удалении (<uninstall>). - Управляет файлами и кодом: Копирование файлов, выполнение PHP-кода или SQL-запросов.
В SMF 2.1 этот файл особенно важен, так как система стала более строгой к совместимости, чтобы избежать конфликтов при обновлениях.
Основная структура файла⚓︎
Файл package-info.xml — это XML-документ с обязательным DOCTYPE и пространством имен SMF. Вот базовый шаблон:
<?xml version="1.0"?>
<!DOCTYPE package-info SYSTEM "http://www.simplemachines.org/xml/package-info">
<package-info xmlns="http://www.simplemachines.org/xml/package-info" xmlns:smf="http://www.simplemachines.org/">
<!-- Основные свойства мода -->
<id>unique:mod_name</id> <!-- Уникальный ID, например, "developer:MyMod" -->
<name>Название мода</name>
<version>1.0</version> <!-- Версия мода -->
<type>modification</type> <!-- Тип: modification для модов -->
<!-- Установка для SMF 2.1 -->
<install for="2.1.0-2.1.99">
<!-- Действия: копирование файлов, моды XML и т. д. -->
<modification file="install.xml" /> <!-- Ссылка на файл с инструкциями по изменениям -->
<code file="setup.php" /> <!-- Выполнение PHP-кода -->
<database file="database.sql" /> <!-- SQL-запросы -->
<hook hook="integrate_pre_load" function="some_function" file="$sourcedir/some_file.php"/> <!-- «Прописка» хуков (только в SMF 2.1) -->
<require-dir name="some_dir" destination="$themes_dir" /> <!-- Копирование директорий -->
<require-file name="some.php" destination="$sourcedir" /> <!-- Копирование файлов -->
<readme file="readme.txt" parsebbc="true" /> <!-- Показ readme -->
</install>
<!-- Обновление -->
<upgrade from="2.0.0-2.0.99" for="2.1.0-2.1.99">
<!-- Действия по обновлению -->
</upgrade>
<!-- Удаление -->
<uninstall for="2.1.0-2.1.99">
<modification file="install.xml" reverse="true" /> <!-- Обратные изменения -->
<hook hook="integrate_pre_load" function="some_function" file="$sourcedir/some_file.php" reverse="true" /> <!-- «Выписка» хуков (только в SMF 2.1) -->
<remove-dir name="$sourcedir/MyMod" /> <!-- Удаление директорий -->
<remove-file name="$sourcedir/source.php" /> <!-- Удаление файлов -->
</uninstall>
</package-info>
Основные элементы⚓︎
<id>: Уникальный идентификатор мода в формате «разработчик:имя_мода» (например,john_doe:MyCoolMod). Обязателен для избежания конфликтов.<name>: Название мода, отображаемое в менеджере пакетов.<version>: Версия мода (например,1.0).<type>: Для модификаций —modification. Другие типы:theme,language,avatar.<install for="...">: Блок для установки мода. Атрибутforзадает диапазон совместимых версий SMF (например,2.1.0-2.1.99).<modification>: Ссылка на XML-файл с инструкциями по редактированию кода (например,install.xml).<code>: Выполняет PHP-код (атрибутfileдля файла илиtype="inline"для встроенного кода).<database>: Выполняет SQL-запросы из указанного файла. Атрибуты:type(inline или file, по умолчанию file).<hook>: Регистрирует хуки в базе данных. Поддерживается только в SMF 2.1 и выше.<require-file>: Указывает файлы для установки. Атрибуты:from(путь к файлу внутри пакета),name(имя файла),destination(куда установить).<require-dir>: Указывает директории для установки. Атрибуты:from(путь к директории внутри пакета),name(имя директории),destination(куда установить).<remove-file>: Указывает файлы для удаления.<remove-dir>: Указывает директории для удаления.<create-dir>: Создает новую директорию. Атрибуты:name(имя директории),destination(где создать).<create-file>: Создает пустой файл. Атрибуты:name(имя файла),destination(где создать).<move-dir>: Перемещает директорию. Может использоваться для переименования. Атрибуты:from(путь исходной директории),name(имя директории),destination(куда переместить).<move-file>: Перемещает файл. Может использоваться для переименования. Атрибуты:from(путь исходного файла),name(имя файла),destination(куда переместить).<readme>: Отображает инструкции для пользователя. Атрибуты:lang(язык readme),parsebbc(парсить BBCode, по умолчанию false),type(inline или file, по умолчанию file).<redirect>: Перенаправляет пользователя после установки. Атрибуты:url(обязательный, принимает “$boardurl”, “$scripturl”, “$session_id”),timeout(время до перенаправления, по умолчанию 5 секунд).<uninstall>: Блок для удаления мода. Используетreverse="true"для отмены изменений в файлах.<upgrade>: Блок для обновления мода (например, миграция данных при переходе с версии1.0на1.1). Атрибуты:for(диапазон версий),from(версии, с которых обновляется).<operation>,<search>,<add>: Используются для inline-изменений кода (редактирование файлов без отдельного XML).
Использование в модификациях SMF 2.1⚓︎
Создание мода⚓︎
1) Создайте файлы мода:
package-info.xml: Основной файл с метаинформацией.install.xml: Инструкции по изменению исходного кода SMF (необязательно, если у вас мод на хуках).
2) Дополнительные файлы: PHP-скрипты, SQL-запросы, языковые файлы, изображения.
3) Задайте совместимость: В <install for="2.1.0-2.1.99"> укажите действия, специфичные для SMF 2.1 (например, использование хуков).
4) Тестирование: Загрузите мод через менеджер пакетов в админ-панели SMF. Если возникают ошибки, проверьте пути к файлам и версии.
5) Обновление: Для поддержки обновлений добавьте блок <upgrade> с инструкциями по миграции.
Пример⚓︎
Предположим, вы создаете мод, добавляющий поддержку внешнего поиска (например, Sphinx). Блоки install и uninstall в package-info.xml могут выглядеть так:
<install for="2.1.0-2.1.99">
<require-file name="SearchAPI-Sphinxql.php" destination="$sourcedir/" />
<require-file name="Admin-Sphinx.english.php" destination="$themes_dir/default/languages/" />
<database file="install_sphinx.sql" />
<redirect url="?action=admin;area=managesearch;sa=method" timeout="3" />
</install>
<uninstall for="2.1.0-2.1.99">
<remove-file name="$sourcedir/SearchAPI-Sphinxql.php" />
<remove-file name="$themes_dir/default/languages/Admin-Sphinx.english.php" />
<database file="uninstall_sphinx.sql" />
</uninstall>
Этот код копирует PHP-файлы, добавляет языковые файлы и выполняет SQL-запросы для настройки поиска, а после установки перенаправляет администратора в настройки поиска.
Как выполнить код при установке мода⚓︎
Добавьте в package-info.xml в секцию install строку <code type="inline"><!-- ваш php-код в виде одной строки --></code>:
Например, вот так можно проверить используемую версию PHP и прекратить дальнейшую установку:
<install>
<code type="inline"><![CDATA[<?php
define('REQUIRED_PHP_VERSION', '7.4.0');
if (version_compare(PHP_VERSION, REQUIRED_PHP_VERSION, '<'))
fatal_error(
sprintf(
'This mod requires a minimum of PHP %s in order to function. (You are currently running PHP %s)',
REQUIRED_PHP_VERSION,
PHP_VERSION
),
false
);
?>]]></code>
</install>
Кроме того, можно запустить на выполнение целый файл:
Лучшие практики⚓︎
- Совместимость: Используйте диапазоны версий
(2.1.0-2.1.99)для покрытия всех минорных обновлений SMF 2.1. - Безопасное удаление: В
<uninstall>всегда добавляйтеreverse="true"для модификаций и аккуратно удаляйте файлы, чтобы не повредить систему. - Документация: Включите
<readme>с понятными инструкциями для пользователей. - Ошибки установки: Если мод не устанавливается, используйте функцию «Эмуляция версии» в менеджере пакетов для проверки совместимости.
- Сохранение данных: Избегайте удаления таблиц базы данных в
<uninstall>, чтобы пользователи не потеряли данные. - Тестирование: Проверяйте мод на чистой установке SMF 2.1, чтобы избежать конфликтов с другими модами.
Частые ошибки и их решения⚓︎
- Ошибка «Invalid package»: Проверьте синтаксис XML и наличие DOCTYPE.
- Несовместимость версий: Убедитесь, что атрибут for включает нужные версии SMF.
- Файлы не копируются: Проверьте правильность путей и плейсхолдеров (
$sourcedir/,$themedir/). - Конфликты модов: Уникальный
<id>предотвращает пересечения. Используйте форматваш_ник:имя_мода.
Памятка о подстановках, используемых в package-info.xml⚓︎
<?php
'\\' => '/',
'$boarddir' => $boarddir,
'$sourcedir' => $sourcedir,
'$avatardir' => $modSettings['avatar_directory'],
'$avatars_dir' => $modSettings['avatar_directory'],
'$themedir' => $settings['default_theme_dir'],
'$imagesdir' => $settings['default_theme_dir'] . '/' . basename($settings['default_images_url']),
'$themes_dir' => $boarddir . '/Themes',
'$languagedir' => $settings['default_theme_dir'] . '/languages',
'$languages_dir' => $settings['default_theme_dir'] . '/languages',
'$smileysdir' => $modSettings['smileys_dir'],
'$smileys_dir' => $modSettings['smileys_dir']
Заключение⚓︎
Файл package-info.xml — это основа любой модификации для SMF 2.1, обеспечивающая автоматизацию установки, обновления и удаления. Правильная структура файла делает моды надёжными и удобными для пользователей. Для углубленного изучения обратитесь к официальной документации SMF или изучите примеры популярных модификаций. Начните с шаблона, следуйте лучшим практикам — и ваш мод станет полезным дополнением к любому форуму на SMF 2.1!