Библиотеки в хаках реализуют функцию доступа к данным и выполняют роль прослойки между модулями и базой данных или сторонними сервисами. В рамках MVC-модели они больше всего похожи на "модели".

Создание библиотеки

Работа с библиотеками осуществляется в разделе "Библиотеки" по кнопке "Файлы". Сами файлы библиотек располагаются в папке lib вашего хака. Название файла с библиотекой может состоять из маленьких латинских букв и цифр. Оно обязательно должно начинаться с буквы, а не цифры. Нельзя использовать заглавные буквы и спецсимволы, в том числе дефис или знак подчёркивания.

В момент создания библиотеки, в файле автоматически создаётся соответствующий класс. Название класса состоит из слова hack, названия хака и названия библиотеки, разделенных знаком подчёркивания, например: hack_proxy_items.

class hack_proxy_items { … }

В библиотеку обязательно включить следующий конструктор:

private $core;
public function __construct( $core ) {
  $this->core = $core;
  // Остальной код инициализации
}

Использование $core требуется практически для всех задач в работе с системой. Вызов конструктора библиотеки всегда производится с параметром $core.

Подключение и использование библиотек

Библиотека автоматически загружается и инициализируются при первом вызове. Вызов библиотеки осуществляется кодом:

$core->hack->(name)->(library)

Например, для обращения к библиотеке items модуля proxy будет использоваться вызов:

$core->hack->proxy->items

Рекомендуется сразу же обращаться к вложенным функциям или полям самой библиотеки, например:

$core->hack->proxy->items->add( $item );
$core->hack->proxy->items->mode = 10;

Переопределение системных библиотек

Не рекомендуется это делать. Но в исключительных случаях, вы можете расширить системные библиотеки с помощью хаков. Делать это можно только с огромной осторожностью.

Файл должен носить то же название, что и оригинальная библиотека. В нём располагается класс с названием hack_name, унаследованный от name, где name - название исходной библиотеки.

Например:

class hack_address extends address {
  public function check( $geo, $i, $a, $c, $s, $h ) { 
    if ( $geo == 'kz' ) return $core->hack->cisaddr->kz->check( $i, $a, $c, $s, $h );
    if ( $geo == 'kg' ) return $core->hack->cisaddr->kg->check( $i, $a, $c, $s, $h );
    return parent::check( $geo, $i, $a, $c, $s, $h );
  }
}

Список переопределенных библиотек указывается в массиве инициализации с ключом lib. В нём должны быть названия файлов библиотек без расширения.

Например:

return [
  /* другие команды инициализации */
  'lib' => [ 'address' ]
];