Кастомизация маршрутизации путей в системе
Актуально для версии 20
Задача
Иногда появляется необходимость, что-бы по определенному пути открывалась определенная страница или вызывался определенный макрос.
Например сделать чтобы по адресу site.ru/order/ открывалось "Оформление заказа в один клик" site.ru/emarket/purchasing_one_step/
Решение
Эту задачу можно решить при помощи кастомизации роутинга (маршрутизации) в системе. Для этого мы воспользуемся событием 'routing'.
Создать слушатель этого события можно в любом модуле, но лучше создавать его в рамках того модуля для которого необходимо выполнить маршрутизацию.
Создадим слушатель в модуле Интернет-магазин (emarket), для этого в директории /classes/components/emarket/ добавим файл custom_events.php со следующим содержимым:
<?php
new umiEventListener("routing", "emarket", "route");
?>
В файл customMacros.php добавляем метод для обработки события и класс FakeRouter с методом analyzePath для обработки адреса:
<?php
use UmiCms\Service;
/**
* Класс пользовательских макросов
*/
class EmarketCustomMacros {
/**
* @var emarket $module
*/
public $module;
public function route(iUmiEventPoint $eventPoint) {
if (Service::Request()->isAdmin() || $eventPoint->getMode() !== 'before') {
return;
}
$request = Service::Request();
$path = $request->getPath();
if ($path == 'order') {
$router = new FakeRouter('emarket','purchasing_one_step');
$eventPoint->setParam('router', $router);
}
}
}
class FakeRouter {
private $module;
private $method;
private $elementId;
function __construct($module, $method, $elementId = false) {
$this->module = $module;
$this->method = $method;
$this->elementId = $elementId;
}
public function analyzePath() {
$cmsController = cmsController::getInstance();
$cmsController->setCurrentModule($this->module);
$cmsController->setCurrentMethod($this->method);
$cmsController->setCurrentElementId($this->elementId);
}
}
?>
Теперь при переходе по адресу site.ru/order/ будет открываться страница "Оформление заказа в один клик".