Главный сервис-класс

Это центральный элемент компонента ZoomX. Он отвечает за управление процессом обработки запроса и подготовки ответа. Т.е. он перехватывает управление у главного класса системы с помощью подмены стандарных классов MODX на свои собственные, используя встроенные возможности расширения. Объект сервиса можно получить двумя способами:

# Способ 1.
$zoomx = Zoomx\Service::getInstance();
# Способ 2.
$zoomx = zoomx();

Главный сервис хранит ссылки на важные объекты ядра системы в свойствах класса:

  • $modx - главный объект системы MODX.
  • $parser - текущий парсер.
  • $request - объект обработки запроса.
  • $response - объект подготовки ответа.
  • $elementService - объект сервиса управления элементами MODX (чанками и сниппетами). Заменяет встроенный функционал MODX.

Получить их можно с помощью соответствующих гетеров ("get" + имя свойства) или с помощью хелпера zoomx(), передавая имя свойства в параметре:

$request = zoomx()->getRequest();
// или
$request = zoomx('request');

Основные методы:

  • isAjax() — проверяет наличие заголовка HTTP_X_REQUESTED_WITH.
  • $router->get('users/{id}', function($id) use($modx) {
        $user = $modx->getObject('modUser', ['id' => (int)$id]);
        // Если запрос Ajax, то вернуть json
        if (zoomx()->isAjax()) {
            return jsonx($user->toArray());
        }
        // Вывести страницу профиля
        return viewx('profile.tpl', $user->toArray());
    });
    
  • shouldBeJson() — проверяет заголовки HTTP_ACCEPT и Content-Type. Возвращает true, если хоть один из них содержит значение "application/json". Используется при инициализации главного сервиса для подгрузки соответствующих классов.
  • autoloadResource() — переключает системную настройку zoomx_autoload_resource для текущего запроса. В параметре необходимо передать true или false.
  • $router->get('api/users/{id}', function($id) use($modx) {
        // Отключаем автозагрузку ресурса по указанному URI
        zoomx()->autoloadResource(false);
        // Вывести виртуальную страницу
        return viewx('profile.tpl', $user->toArray());
    });
    
  • config() — выводит указанную системную настройку MODX, если передан строковый ключ. Если передан массив в формате ['key' => 'value'], то в массив системных настроек будет добавлена системная настройка с указанным ключом и указанным значением.
  • Аргументы:

    • $key - ключ системной настройки (чтобы получить значение) или ассоциативный массив (чтобы сохранить значение).
    • $default - значение по-умолчанию.
  • getChunk() — вызывает чанк по аналогии со стандартным modX::getChunk(). Этот метод всего лишь алиас метода Zoomx\ElementService::getChunk().
  • Аргументы:

    • $name - название чанка. Можно указывать байндинги @INLINE и @FILE. Файловые чанки указываются относительно пути, указанного в системных настройках zoomx_template_dir и zoomx_theme.
    • $properties - массив параметров.
    $content = zoomx()->getChunk('@FILE profile.tpl', $user->toArray());
    // Под капотом работает так
    $content = zoomx()->getElementService()->getChunk('@FILE profile.tpl', $user->toArray());
    
  • runSnippet() — вызывает стандартный сниппет. По аналогии с предыдущим методом он также представляет собой алиас метода Zoomx\ElementService::runSnippet().
    • $name - название сниппета.
    • $properties - массив параметров.
    $result = zoomx()->runSnippet('usual_snippet', $properties);
    
  • runFileSnippet() — вызывает файловый сниппет. Является алиасом одноимённого метода класса Zoomx\ElementService.
    • $name - название файла. Указывается путь к файлу, относительно пути, указанного в системной настройке zoomx_snippet_path.
    • $properties - массив параметров.
    $result = zoomx()->runFileSnippet('file_snippet.php', $properties);
    

    Расширение .php можно не указывать.

Расширение класса

В данный класс можно добавлять свои методы. Делается это с помощью макросов как в Laravel. Для этого необходимо в плагине на событие OnZoomxInit добавить название метода и функцию, содержащую код метода. Ниже пример создания метода message() объекта главного сервиса.

// Плагин
// Событие OnZoomxInit
Zoomx\Service::macro('message', function () {
    return 'Это сообщение из добавленного метода.';
});

Соответственно, теперь можно вызывать созданный метод главного сервиса.

return zoomx()->message();

А так как объект $zoomx доступен в шаблонах Smarty, то этот метод можно использовать и там.

<div class="alert">{$zoomx->message()}>/div>
Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.