Кастомный шаблон URL элементов инфоблока

35
Алексей,
Кастомный шаблон URL элементов инфоблока
Кастомный шаблон URL элементов инфоблока

Возникла задача: сформировать URL элемента из его символьного кода и символьного кода связанного элемента другого инфоблока. Грубо говоря шаблон должен быть таким: #PROPERTY_BRAND.CODE#/#ELEMENT_CODE#/, где PROPERTY_BRAND.CODE и будет символьный код из свойства привязки. Сразу скажу, так сделать нельзя, только если кастомить методы ядра.

Возникла задача: сформировать URL элемента из его символьного кода и символьного кода связанного элемента другого инфоблока. Грубо говоря шаблон должен быть таким: #PROPERTY_BRAND.CODE#/#ELEMENT_CODE#/, где PROPERTY_BRAND.CODE и будет символьный код из свойства привязки. Сразу скажу, так сделать нельзя, только если кастомить методы ядра.

Проблема в ограниченности метода \CAllIBlock::ReplaceDetailUrl() И его невозможно как-то расширить. Обсуждается это с 2013 года, вот тема https://idea.1c-bitrix.ru/ciblockreplacedetailurl-is-it-possible-to-intrude-into/

Эту задачу частично можно решить с помощью костыля. Шаблон оставляем прежним #ELEMENT_CODE#/, а в символьный код элемента добавляем код "связанного" через слэш, примерно так:

Пример символьного кода битрикс со слешем

И всё, это просто работает. Что бы не заполнять символьный код вручную, можно добавить скрипт, который будет работать при сохранении элементов инфоблока:

скрипт, который будет работать при сохранении элементов инфоблока
if ($_REQUEST) {
	if (strpos($_REQUEST["CODE"], '/') !== false) { // символьный код текущего элемента
		$arCodes = explode('/', $_REQUEST["CODE"]);
		$sCode = end($arCodes);
	} else {
		$sCode = $_REQUEST["CODE"];
	}

	if ($arProp = CIBlockProperty::GetList( // свойство привязки
		[],
		['IBLOCK_ID' => $_REQUEST["IBLOCK_ID"], 'CODE' => 'BRAND']
	)->Fetch()) {
		if ($brandId = current($_REQUEST["PROP"][$arProp["ID"]])) {
			if ($arBrand = CIBlockElement::GetList( // достаем символьный код связанного элемента
				[],
				['ID' => $brandId, 'IBLOCK_ID' => $arProp['LINK_IBLOCK_ID']],
				false,
				['nTopCount' => 1],
				['CODE']
			)->Fetch()) {
				$_POST['CODE'] = $arBrand['CODE'].'/'.$sCode; // меняем символьный код
			}
		}
	}
}
Опубликовано 27 апреля 2022
костыли, примеры кода, готовый код, разработчику
Поделиться
Похожие статьи
Как скрыть неактивные инфоблоки в админке
На большом сайте количество инфоблоков быстро растёт, многие из них служебные и не предназначены для...
Читать дальше » 0
Алексей,
Замена функций в коде на мультибайтовые аналоги (mb_)
В php 7.2 ini-настройка mbstring.func_overload объявлена устаревшей. К тому же битрикс решил её выкл...
Читать дальше » 0
Алексей,
Комментарии
Авторизуйтесь чтобы получать уведомления об ответе
Возникла задача: сформировать URL элемента из его символьного кода и символьного кода связанного элемента другого инфоблока. Грубо говоря шаблон должен быть таким: #PROPERTY_BRAND.CODE#/#ELEMENT_CODE#/, где PROPERTY_BRAND.CODE и будет символьный код из свойства привязки. Сразу скажу, так сделать нельзя, только если кастомить методы ядра.