Перейти к основному содержанию
Тема: Хуки (Прочитано 8897 раз) предыдущая тема - следующая тема

Хуки

При помощи хуков можно создать лунапарк с блэк джеком и шлюхами модуль, который абсолютно не будет изменять код файлов smf.

Hooks (англ.) - крючки

Хуки используются в разных движках - drupal, vbulletin, smf, phpbb, ...

Во многих функциях форума есть переменные, которые и приходится изменять модописателям.
При помощи хуков эти самые переменные передаются по ссылке(или принимают новое значение из вызываемого хука) в ваши функции или методы классов в файлах вашего модуля.
Хуки могут не передавать переменные, а просто вызываться, - в таком случае вам следует использовать глобальные переменные или, например, подключать языковые файлы.

Преимущества:
Моды пишутся быстрее, аккуратней, в отдельных файлах и не изменяют код форума.



Ссылки:
http://wiki.simplemachines.org/smf/Integration_hooks
http://www.simplemachines.org/community/index.php?topic=173483.0
http://www.simplemachines.ru/index.php?topic=12037.0



Пример:
(данный хук позволяет подключать собственные страницы)
./index.php
   // Allow modifying $actionArray easily.
   call_integration_hook('integrate_actions', array(&$actionArray));

Чтобы внести изменения в переменную $actionArray нужно создать функцию в вашем моде и связать её с БД:

Добавляем названия ваших хуков и их расположение в БД форума:

В файле package-info.xml добавляем название файла для установки хуков в базу данных при установке вашего мода:
...
    <install for="1.0.1 - 1.0.99">
        ...
        <code>Hooks.php</code>
        ...
    </install>
...

<?php
// Hooks.php
add_integration_function('integrate_pre_include', 'Ваш_файл.php'); // Ваш файл с хуками, будет подключаться автоматически после установки вашего мода
add_integration_function('integrate_actions', 'my_action_hook'); // my_action_hook это ваш хук, который будет вызван хуком форума integrate_actions

Описание хука integrate_actions

Пример для вашей функции:
// Ваш_файл.php

function my_action_hook(&$actionArray)
{
$actionArray += ['адрес_страницы' => ['my_mod.php', 'my_action_function']];
}

Теперь при переходе по адресу http://вашфорум/index.php?action=адрес_страницы будет вызваться my_action_function из my_mod.php, благодаря вызову хука integrate_actions, который вызовет my_action_hook.