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. |
Пользовательские комментарии
Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.Для этого нужно всего лишь авторизоваться на сайте
Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.
Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.