Как подключать хуки

Данный материал является вспомогательным для серии статей «Список хуков». Здесь рассмотрены оптимальные варианты подключения и вызова хуков в модификациях для SMF.

Основы

Когда вы используете хуки в своих модификациях, их требуется добавлять в базу данных при установке. Например, укажем список нужных хуков в файле hooks.php:

$hooks = array(
    'integrate_pre_include' => '$sourcedir/Class-YourModName.php',
    'integrate_pre_load' => 'Class-YourModName::hooks'
);

if (!empty($context['uninstalling']))
    $call = 'remove_integration_function'; // При удалении модификации информация о хуке удаляется из базы
else
    $call = 'add_integration_function'; // При установке модификации информации о хуке добавляется в базу

foreach ($hooks as $hook => $function)
    $call($hook, $function);

Не забудьте указать запуск hooks.php в package-info.xml (и в секции install, и в секции uninstall):

<install for="2.0 - 2.0.99">
    <require-file name="Class-YourModName.php" destination="$sourcedir">Core file</require-file>
    <code>hooks.php</code>
</install>

<uninstall for="2.0 - 2.0.99">
    <code>hooks.php</code>
    <remove-file name="$sourcedir/Class-YourModName.php">OK</remove-file>
</uninstall>

Конечно, можно перечислить все используемые вами хуки в hooks.php. Но есть и другой вариант — указать некую публичную статическую функцию для запуска через хук integrate_pre_load, а затем уже в этой функции перечислить нужные хуки:

public static function hooks()
{
    add_integration_function('НАЗВАНИЕ_ХУКА', 'НАЗВАНИЕ_МЕТОДА_В_ТЕКУЩЕМ_ФАЙЛЕ', false);
}

Возможности SMF 2.1

В SMF 2.1 появилась возможность указывать используемые хуки непосредственно в package-info.xml:

<install for="2.1.*">
    <require-file name="Class-YourModName.php" destination="$sourcedir">Core file</require-file>
    <hook hook="integrate_pre_load" function="YourModName::hooks" file="$sourcedir/Class-YourModName.php" />
</install>

<uninstall for="2.1.*">
    <hook hook="integrate_pre_load" function="YourModName::hooks" file="$sourcedir/Class-YourModName.php" reverse="true" />
    <remove-file name="$sourcedir/Class-YourModName.php">OK</remove-file>
</uninstall>

Подключение хуков в файле осуществляется так же, как и для SMF 2.0. Только добавляется 4-й параметр, определяющий путь к файлу, в котором находится нужная функция:

public static function hooks()
{
    add_integration_function('НАЗВАНИЕ_ХУКА', 'НАЗВАНИЕ_МЕТОДА', false, __FILE__);
}

Если вы не хотите использовать статические методы, добавьте символ # после имени вызываемой функции:

<install for="2.1.*">
    <require-file name="Class-YourModName.php" destination="$sourcedir">Core file</require-file>
    <hook hook="integrate_pre_load" function="YourModName::hooks#" file="$sourcedir/Class-YourModName.php" />
</install>

<uninstall for="2.1.*">
    <hook hook="integrate_pre_load" function="YourModName::hooks#" file="$sourcedir/Class-YourModName.php" reverse="true" />
    <remove-file name="$sourcedir/Class-YourModName.php">OK</remove-file>
</uninstall>
public function hooks()
{
    add_integration_function('НАЗВАНИЕ_ХУКА', 'НАЗВАНИЕ_МЕТОДА#', false, __FILE__); // Обратите внимание на символ # после названия метода
}

Скачивайте шаблоны для создания модификаций, меняйте на свое усмотрение, творите.

Универсальный шаблон Шаблон модификации для SMF 2.1