Модули в хаках реализуют основной функционал — обработку страниц, реализацию задач планировщика и API-функций. В рамках MVC-модели они больше всего похожи на «контроллеры».
Создание модуля
Работа с модулями осуществляется из раздела «Модули» в меню «Файлы». Сами файлы модулей располагаются в папке mod вашего хака. Название файла с модулем может состоять из маленьких латинских букв, цифр и дефиса. Нельзя использовать заглавные буквы и спецсимволы, в том числе знак подчёркивания.
В момент создания модуля, в файле автоматически вписывается его «стандартная» функция с рекомендуемым названием. Рекомендуется составлять название функции из слова hack, названия модуля и названия самой функции, разделённых знаком подчёркивания, например: hack_proxy_list.
Загрузка модуля происходит с помощью функции mod основного класса хака:
$core->hack->(name)->mod( $module )
Например, подключение модуля listing в хаке proxy будет выглядеть так:
$core->hack->proxy->mod( 'listing' );
В момент подключения модуля, можно сразу же вызвать какую-либо содержащуюся в нём функцию. Это удобно для организации роутинга и быстрого запуска модулей. Вызываемая функция должна принимать только один обязательный параметр — $core.
Подключение модуля с вызовом функции:
$core->hack->(name)->mod( $module, $func )
Например, вызов функции hack_proxy_list в модуле listing хака proxy:
$core->hack->proxy->mod( 'listing', 'hack_proxy_list' );
При вызове модуля с названием функции, возвращается результат выполнения этой функции.
Возможные применения
Модули применяются в трёх основных задачах:
- Обработчики страниц и разделов. Используются для реализации роутинга, о котором рассказано ниже.
- Периодические задачи для планировщика в файлах
cron-name.php. О них рассказано в разделе «Планировщик». - Приложения для API-интерфейса в файлах
api-name.php. О них рассказано в разделе «API».
Организация роутинга
Модули оптимальны для организации роутинга в приложении. В файле start.php создайте функцию, которая будет заниматься маршрутизацией. Она принимает на вход параметр $core и должна вызывать нужный модуль при необходимости.
Текущий путь по сайту разбивается на несколько частей:
https://network.domain/div/item/subdiv/subitem
Эти элементы доступны для работы через $core->app:
$core->app->div— текущий раздел на сайте.$core->app->item— элемент в выбранном разделе.$core->app->id— целочисленное значение от$core->app->item.$core->app->subdiv— вложенный раздел элемента.$core->app->subitem— вложенный элемент вложенного раздела.$core->app->subid— целочисленное значение от$core->app->subitem.$core->app->action— значение из GET-параметра action, соответствует выбранному действию.$core->app->message— значение из GET-параметра message, соответствует сообщению об успехе или ошибке действия.
В работе функции удобно применять значение $core->app->div, которое соответствует первому пункту в текущем пути сайта. Пример реализации роутинга выглядит так:
function hack_proxy_route( $core ) {
switch ( $core->app->div ) {
case 'proxy-list': $core->hack->proxy->mod( 'listing', 'hack_proxy_list' );
case 'proxy-check': $core->hack->proxy->mod( 'listing', 'hack_proxy_check' );
case 'proxy-stats': $core->hack->proxy->mod( 'stats’, 'hack_proxy_stats' );
}
}
При инициализации хака, эту функцию нужно указать в обработчике modules. Это реализуется с помощью функции $core->handle( 'modules', $handlename ), где в $handlename указывается ваша функция.
Пример инициализации хака с роутингом:
function hack_proxy_init( $core ) {
$core->handle( 'modules', 'hack_proxy_route' );
}