@bitrixweb
Вечно молодой, вечно пьяный

Как перезаписать правило ЧПУ для собственнего компонента Битрикс при сохранении настроек?

Добрый день, друзья! Пожалуйста, поделитесь опытом в решении проблемы.

Есть собственный комплексный компонент с ЧПУ.
Он обрабатывает адреса вида:
  • /somedir/element_code/
  • /somedir/element_code/subdir1/
  • /somedir/element_code/subdir2/
  • /somedir/element_code/subdir3/


Проблема:
При редактировании и сохранении настроек компонента (даже если не затрагивать параметры относительно ЧПУ) происходит перезапись правила обработки адресов и ЧПУ перестает работать - приходится идти и вручную править правило обработки до прежних рабочих значений. ТП битрикса ничем помочь не может

Настройки компонента:
  • Каталог ЧПУ (относительно корня сайта): /somedir/
  • Шаблон ссылки детальной страницы: #CODE#/
  • Шаблон ссылки детальной страницы (подраздел №1): #CODE#/subdir1/
  • Шаблон ссылки детальной страницы (подраздел №2): #CODE#/subdir2/
  • Шаблон ссылки детальной страницы (подраздел №3): #CODE#/subdir3/


Правило обработки адресов ДО СОХРАНЕНИЯ настроек компонента::
  • Условие: #^/somedir/([^/]+)/([^/]+)?/?(.*)$#
  • Компонент: custom:mycatalog
  • Файл: /somedir/index.php
  • Правило: element_code=$1&subdir=$2


Правило обработки адресов ПОСЛЕ СОХРАНЕНИЯ настроек компонента:
  • Условие: #^/somedir/#
  • Компонент: custom:mycatalog
  • Файл: /somedir/index.php
  • Правило: _пустое_


Об этом в документации: (больше по данной теме ничего не найдено)
5f3950ec35ed9129466173.png

Знаете ли Вы какие-то способы решить эту проблему? Буду рад любой наводке! Спасибо!
  • Вопрос задан
  • 684 просмотра
Решения вопроса 1
@PetrPo
У тебя комплексный компонент, он все правильно переписывает urlrewrite. Когда включаешь SEF_MODE у тебя есть доп. параметр SEF_URL_TEMPLATES, вот он и будет твоими правилами, которые ты хочешь вот так записать #^/somedir/([^/]+)/([^/]+)?/?(.*)$#
Сохрани свой компонент через визуальный редактор, потом вручную (пока что) замени в индексном файле
"SEF_URL_TEMPLATES" => array(
	"element" => "#CODE#/",
	"articles" => "#CODE#/articles/",
	"articles2" => "#CODE#/articles2/",
	"articles3" => "#CODE#/articles3/",
),

Теперь по запросу /somedir/#CODE#/articles/ у тебя будет подключаться страница articles.php (остальные соответственно - /somedir/#CODE#/articles2/ будет articles2.php ), которую тебе надо создать в шаблоне комплексного компонента. в $arResult['VARIABLES']['CODE'] у тебя будет код твоего элемента, можешь доставать нужные связи - тут уже как считаешь правильным, хоть тут запросы делай, хоть на уровень комплексного компонента это выноси, я бы для таких связей написал еще простой компонент.

Ну и остается сделать, чтобы твои SEF_URL_TEMPLATES можно было через визуальный редактор редактировать, в любом комплексном компоненте в файле .parameters.php можешь посмотреть (ориентир, все что с SEF_MODE связано)

Примерчик на основе компонента news:
5f3a8ffb3d32e894639962.jpeg
стандартный битриксовый eshop, раздел новости, компонент news, все работает как надо

Правки в файле .parameters.php компонента, раздел SEF_MODE
// ...............
"SEF_MODE" => Array(
	"element" => array(
		"NAME" => GetMessage("T_IBLOCK_SEF_PAGE_NEWS_DETAIL"),
		"DEFAULT" => "#CODE#/",
		"VARIABLES" => array("CODE"),
	),
	"articles" => array(
		"NAME" => "Страница связанных articles",
		"DEFAULT" => "search/",
		"VARIABLES" => array(),
	),

	"articles2" => array(
		"NAME" => "Страница связанных articles2",
		"DEFAULT" => "search/",
		"VARIABLES" => array(),
	),

	"articles3" => array(
		"NAME" => "Страница связанных articles3",
		"DEFAULT" => "search/",
		"VARIABLES" => array(),
	),

),
// ................

в конце по вкусу можно добавить, что-то типа
if($arCurrentValues["SEF_MODE"]=="Y")
{
	$arComponentParameters["PARAMETERS"]["VARIABLE_ALIASES"] = array();
	$arComponentParameters["PARAMETERS"]["VARIABLE_ALIASES"]["CODE"] = array(
		"NAME" => GetMessage("CP_BC_VARIABLE_ALIASES_ELEMENT_ID"),
		"TEMPLATE" => "#CODE#",
	);
}


В файле component.php можно добавить
$arDefaultUrlTemplates404 = array(
	"news" => "",
	"element" => "#CODE#/",
);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы