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

2k
Алексей,
Кастомный шаблон 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
костыли, примеры кода, готовый код, разработчику
Поделиться
Похожие статьи
Замена функций в коде на мультибайтовые аналоги (mb_)
В php 7.2 ini-настройка mbstring.func_overload объявлена устаревшей. К тому же битрикс решил её выкл...
Читать дальше » 0
Алексей,
Как получить ограничения доставки по платежным системам
Понадобилось вне компонента оформления заказа показать какие способы оплаты доступны для той или ино...
Читать дальше » 0
Алексей,
Комментарии
❮…❯
Авторизуйтесь чтобы получать уведомления об ответе
1 июн 2022
Я бы пошел по другому пути, изменил бы шаблон вывода ссылок на детальные страницы, где формировал бы ссылку как нужно. + Нужна проверка на детальной странице, чтобы помимо ELEMENT_CODE проверялось также PROPERTY_BRAND.CODE + При необходимости не забыть поколдовать над выгрузками товаров (в яндекс например), чтобы в xml также ссылки нужные подставлялись.
Алексей
1 июн 2022
max22, это сложный путь, помимо изменения текущих ссылок на сайте, вам нужно будет поддерживать эту логику в будущем. А так же будут проблемы при выводе ссылок ядром (например когда битрикс подтягивает ссылку на элемент по свойству "привязка к элементам").
Алексей
1 июн 2022
max22, а еще это доп. запросы к БД на каждом участке. Вам же нужно получать символьный код связанного элемента.
Возникла задача: сформировать URL элемента из его символьного кода и символьного кода связанного элемента другого инфоблока. Грубо говоря шаблон должен быть таким: #PROPERTY_BRAND.CODE#/#ELEMENT_CODE#/, где PROPERTY_BRAND.CODE и будет символьный код из свойства привязки. Сразу скажу, так сделать нельзя, только если кастомить методы ядра.