Данный материал является вспомогательным для серии статей «Список хуков». Здесь рассмотрены оптимальные варианты подключения и вызова хуков в модификациях для 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__); // Обратите внимание на символ # после названия метода
}
Скачивайте шаблоны для создания модификаций, меняйте на свое усмотрение, творите.