Модули в хаках реализуют основной функционал - обработку страниц, реализацию задач планировщика и 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' );
}