Router
Общее
Маршрутизация на списки и детальные карточки в "старом" API осуществляется с помощью комплексных компонентов.
На каждый тип сущности есть физическая страница, где лежит комплексный компонент, привязанный к этому типу сущности.
Комплексный компонент парсит адрес / запрос и достает оттуда набор "переменных".
Далее на основе типа сущности и значении переменных определялось, какой компонент необходимо получить.
В настройки комплексного компонента можно передать шаблоны ссылок на страницы.
При этом во всех вложенных компонентах приходилось передавать шаблоны ссылок из компонента в компонент, что порождало довольно много дублирующего кода.
В новом API используется другой подход.
В корне (файл /crm/type/index.php
) подключается только один компонент crm.router.
У этого компонента есть следующие параметры:
- isSefMode если передано n, то маршрутизация будет работать в режиме без ЧПУ;
- root - путь к файлу, где подключен компонент, относительно корня сайта.
Эти параметры конфигурируют Service\Router
. Сервис парсит запрос и возвращает данные о том, какой компонент с какими параметрами надо подключить.
В шаблоне компонента crm.router подключается нужный компонент с параметрами.
Во всех новых компонентах ссылки на страницы получаются через этот же сервис. Таким образом обеспечивается полное единообразие шаблонов ссылок и способа их обработки.
На стороне фронтенда работу с шаблонами осуществляет js-экстеншн crm.router.
На данный момент сервис позволяет генерировать ссылки на любые типы сущностей.
За переключение правил формирования адресов отвечают методы фабрики:
Factory::isNewRoutingForDetailEnabled
Factory::isNewRoutingForListEnabled
Factory::isNewRoutingForAutomationEnabled
Как работает "показ вне CRM"
Благодаря единому механизму формирования и обработки ссылок появилась возможность вынести смарт-процессы целиком в отдельные разделы.
Режимы работы роутера
Роутер может работать в двух режимах - с ЧПУ и без ЧПУ.
Режим работы с ЧПУ подразумевает, что ссылки формируются по шаблонам, часть параметров в которых указана в пути, а не в запросе.
Например, если шаблон страницы настроек смарт-процесса выглядит как crm/type/#entityTypeId#/, то ссылка на настройки типа с идентификатором 130 будет выглядеть как /crm/type/130/.
Если роутер работает в режиме без ЧПУ, то ссылки формируются и парсятся следующим образом:
- В параметре с передается название компонента.
- В параметре cp передаются параметры компонента.
- В параметре cpt передается шаблон компонента.
Принцип формирования полных ссылок
Полные ссылки в режиме ЧПУ строятся следующим образом:
{siteFolder}/{root}/{path}/?{parameters}
- siteFolder - корневая папка сайта, в котором работает роутер;
- root - корень, от которого работает роутер;
- path - путь, полученный из шаблона ссылки;
- parameters - набор дополнительных get-параметров.
Методы
Методы, возвращающие шаблоны ссылок, отдают их в виде строки.
Методы, возвращающие обработанные ссылки, отдают их в виде объекта \Bitrix\Main\Web\Uri
.
Метод | Описание | С версии |
---|---|---|
public function reInit(): self |
Заново инициализирует шаблоны ссылок с учетом кастомных разделов. | |
public function getUserPersonalUrlTemplate(): ?string |
Вернет шаблон ссылки на профиль пользователя. | |
public function getUserPersonalUrl(int $userId): Uri |
Вернет ссылку на профиль пользователя с идентификатором $userId. | |
public function setRoot(string $root): Router |
Установит новый корень. | |
public function getRoot(): string |
Вернет корень. | |
public function setSefMode(bool $isSefMode): Router |
Управляет режимом роутинга. Если $isSefMode = true, то роутер работает в режиме ЧПУ. Если false, то в режиме без ЧПУ. | |
public function isSefMode(): bool |
Вернет true, если роутер работает в режиме ЧПУ. По умолчанию этот режим всегда включен. | |
public function setSiteId(string $siteId): Router |
Установит идентификатор сайта $siteId, который используется для генерации ссылок. | |
public function getSiteId(): ?string |
Вернет идентификатор сайта. | |
public function getDefaultUrlTemplates(): array |
Вернет шаблоны ссылок по умолчанию. Ключ - это название компонента, а значение - шаблон ссылки. | |
public function saveCustomUrlTemplates(array $templates): void |
Сохранит кастомные шаблоны ссылок $templates в опциях. При определении адресов в первую очередь берутся кастомные шаблоны. Если нет кастомного шаблона, то используется шаблон по умолчанию. | |
public function getCustomUrlTemplates(): array |
Вернет кастомные шаблоны ссылок. | |
public function getPreparedTemplates(): array |
Вернет сформированные шаблоны ссылок с учетом корня роутера и корня идентификатора сайта. | |
public function getTemplatesForJsRouter(): array |
Вернет сформированный набор шаблонов для передачи в crm.router. | |
public function parseRequest (HttpRequest $httpRequest = null): ParseResult |
Распарсит запрос $httpRequest с учетом своей конфигурации и вернет объект ParseResult .
Если $httpRequest не передан, будет использован текущий запрос из \Bitrix\Main\Application::getInstance->getContext()->getRequest() . | |
public function getTypeListUrl(): ?Uri |
Вернет ссылку на список смарт-процессов. | |
public function getTypeDetailUrl (int $entityTypeId): ?Uri |
Вернет ссылку на страницу настроек смарт-процесса с идентификатором типа CRM $entityTypeId. | |
public function getItemListUrl (int $entityTypeId, int $categoryId = null): ?Uri |
Вернет ссылку на список элементов сущности с идентификатором типа CRM $entityTypeId направления $categoryId в представлении типа "Список". | |
public function getKanbanUrl (int $entityTypeId, int $categoryId = null): ?Uri |
Вернет ссылку на список элементов сущности с идентификатором типа CRM $entityTypeId направления $categoryId в представлении типа "Канбан". | |
public function getItemDetailUrlCompatibleTemplate (int $entityTypeId): ?string |
Вернет шаблон ссылки на детальную страницу элемента сущности с идентификатором $entityTypeId. | |
public function getItemDetailUrl (int $entityTypeId, int $id = 0, int $categoryId = null, ?ItemIdentifier $parentItemIdentifier = null): ?Uri
|
Вернет ссылку на детальную страницу элемента. | |
public function isNewRoutingForListEnabled (int $entityTypeId): bool |
Вернет true, если для типа с идентификатором $entityTypeId включен новый роутинг страниц в представлении "Список". | |
public function isNewRoutingForDetailEnabled (int $entityTypeId): bool |
Вернет true, если для типа с идентификатором $entityTypeId включен новый роутинг детальных страниц. | |
public function isNewRoutingForAutomationEnabled (int $entityTypeId): bool |
Вернет true, если для типа с идентификатором $entityTypeId включен новый роутинг страниц с роботами. | |
public function getItemCopyUrl (int $entityTypeId, int $id = 0, int $categoryId = null): ?Uri |
Вернет ссылку на копирование элемента $id типа с идентификатором CRM $entityTypeId направления $categoryId. | |
public function getUserFieldListUrl(int $entityTypeId): ?Uri |
Вернет ссылку на список с настройками пользовательских полей типа с идентификатором $entityTypeId. | |
public function getUserFieldDetailUrl (int $entityTypeId, int $fieldId): ?Uri |
Вернет ссылку на детальную страницу настройками пользовательских полей типа с идентификатором $fieldId типа $entityTypeId. | |
public function getCategoryListUrl(int $entityTypeId): ?Uri |
Вернет ссылку на страницу туннелей продаж типа с идентификатором $entityTypeId. | |
public function getProductDetailUrlTemplate(): string |
Вернет шаблон ссылки на детальную карточку товара. | |
public function getProductDetailUrl (int $productId = 0): Uri |
Вернет ссылку на детальную карточку товара с идентификатором $productId. | |
public function getQuotePrintUrl (int $quoteId, bool $isBlank): Uri |
Вернет ссылку на печать коммерческого предложения с идентификатором $quoteId. | |
public function getQuotePdfUrl (int $quoteId, bool $isBlank): Uri |
Вернет ссылку на скачивание печатной формы коммерческого предложения с идентификатором $quoteId. | |
public function getItemListUrlInCurrentView (int $entityTypeId, int $categoryId = null): ?Uri |
Вернет ссылку на список элементов типа $entityTypeId направления $categoryId в последнем использованном представлении. | |
public function setCurrentListView (int $entityTypeId, string $view): Router |
Сохранит тип представления $view списка элементов типа $entityTypeId.
$view может принимать значение либо KANBAN либо LIST. | |
public function getCurrentListView (int $entityTypeId): string |
Вернет сохраненный тип представления списка элементов типа $entityTypeId. | |
public function getDefaultListView (int $entityTypeId): string |
Вернет тип представления списка элементов типа $entityTypeId по умолчанию. | |
public function setDefaultListView (int $entityTypeId, string $view): void |
Установит тип представления по умолчанию $view для списка элементов типа $entityTypeId. | |
public function getAutomationUrlTemplate (int $entityTypeId): ?string |
Вернет шаблон ссылки на настройки роботов типа $entityTypeId. | |
public function getAutomationUrl (int $entityTypeId, int $categoryId = null): ?Uri |
Вернет ссылку на настройки роботов типа $entityTypeId направления $categoryId. | |
public function getFileUrl (int $entityTypeId, int $id, string $fieldName, int $fileId): Uri
|
Вернет ссылку на файл. | |
public function getDefaultComponent(): string |
Вернет компонент по умолчанию, который должен быть подключен, если не удалось определить компонент из запроса. | |
public function setDefaultComponent (string $defaultComponent): self |
Установит компонент по умолчанию. | |
public function getDefaultComponentParameters(): array |
Вернет набор параметров компонента по умолчанию. | |
public function setDefaultComponentParameters (array $defaultComponentParameters): self |
Установит набор параметров компонента по умолчанию. | |
public function getConsistentUrlFromPartlyDefined (string $currentUrl): ?Uri |
Метод попытается определить корректный адрес по его части. | |
public function getChildrenItemsListUrl (int $entityTypeId, int $parentEntityTypeId, int $parentEntityId): ?Uri |
Вернет ссылку на список дочерних элементов типа $entityTypeId, отфильтрованных по родителю типа $parentEntityTypeId с ид $parentEntityId. | |
public function getItemDetailComponentName (int $entityTypeId): ?string |
Вернет название шаблона компонента детальной страницы элемента типа $parentEntityTypeId. |