Кастомизация маршрутизации путей в системе

Материал из Umicms
Версия от 13:19, 28 августа 2019; Aposio (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к:навигация, поиск

Актуально для версии 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/ будет открываться страница "Оформление заказа в один клик".