ЧПУ компонентов. Добавление динамических правил

1 Июля 2018
79

ЧПУ

(человеко-понятный URL) из себя представляет набор правил составленных с помощью PERL-совместимых регулярных выражений (почитать о них), они расположены в файле urlrewrite.php корня сайта.

Примерно такого содержания:

$APPLICATION->IncludeComponent("bitrix:news", "", array(
	...
	"SEF_URL_TEMPLATES" => array(
		"detail" => "#ELEMENT_ID#/",
		//соответствует файлу "detail.php" в папке шаблона компонента 
		"news" => "",
		//соответствует файлу "news.php" 
		"rss" => "rss/",
		//соответствует файлу "rss.php" 
		"my_section" => "my/",
		//соответствует файлу "my_section.php"
		//"my/" - ЧПУ адрес раздела 
		...
	),
	...
));

При добавлении некого правила в параметры компонента в раздел ЧПУ при сохранении у нас обновляется содержимое файла urlrewrite.php. Правила при этом сортируются по длине строки 'CONDITION' (в данном случае #^/services/#), по принципу чем длиннее правило тем раньше оно добавляется, т.к. предполагается, что оно более детальное. Поэтому стоит создавать правила в единообразной форме.

В процессе перехода на сайта по некому адресу (физически которого не существует!), мы практически сразу попадаем на проверку соответствует ли адрес какому-либо правилу в urlrewrite.php, как только находится соответствие выдается соответствующая страница 'PATH'

Через административную панель можно редактировать правила в разделе Настройки > Настройки продукта > Обработка адресов > Правила

Следует помнить, что в случае самостоятельно редактирования urlrewrite.php сортировка не происходит, условия проверяются в той последовательности в которой они записаны.

Более подробно можно почитать о ЧПУ на сайте перейти

Добавление динамических разделов

У разработчиков часто возникает необходимость в создании динамических разделов, т.е. без существующей физической папки на диске, соответствующей данному разделу. Решить эту проблему можно с помощью следующих методов:

  1. Через параметры компонента:

    Стоит просто добавить в массив параметра "SEF_URL_TEMPLATES", передаваемого компоненту, свои разделы:

    $APPLICATION->IncludeComponent("bitrix:news", "", array(
    	...
    	"SEF_URL_TEMPLATES" => array(
    		"detail" => "#ELEMENT_ID#/",
    		//соответствует файлу "detail.php" в папке шаблона компонента 
    		"news" => "",
    		//соответствует файлу "news.php" 
    		"rss" => "rss/",
    		//соответствует файлу "rss.php" 
    		"my_section" => "my/"
    		//соответствует файлу "my_section.php",
    		//"my/" - ЧПУ адрес раздела
    		...
    	),
    	...
    ));

    После этого стоит создать файл "my_section.php" в папке шаблона компонента, на который мы будем попадать по примерно такому адресу "http://site.ru/my/".

    Следует создать (изменить) в папке шаблона файл ".parameters.php" добавив:

    $arTemplateParameters['SEF_MODE']["my_section"] = array(
    	"NAME" => "Мой раздел",
    	"DEFAULT" => "my/",
    	"VARIABLES" => array(),
    );

    Также стоит не забыть добавить уже существующий разделы, т.к. массив $arTemplateParameters['SEF_MODE'] переопределяет существующие значения.

    $arTemplateParameters['SEF_MODE']["news"] = array(
    	"NAME" => "News",
    	"DEFAULT" => "news/",
    	"VARIABLES" => array(),
    );
    $arTemplateParameters['SEF_MODE']["section"] = array(
    	"NAME" => "Разделы",
    	"DEFAULT" => "",
    	"VARIABLES" => array("SECTION_ID"),
    );
    и т.д.

  2. Через добавление правила ЧПУ

    Добавив следующее:

    $APPLICATION->IncludeComponent("bitrix:news", "", array(
    	... 
    	"SEF_URL_TEMPLATES" => array(
    		...
    		"news" => "news1/|news2/",
    		//соответствует файлу "news.php" 
    		...
    	),
    	...
    ));

    Мы будем направляться на файл "news.php" со следующих адресов "http://site.ru/news1/" и "http://site.ru/news2/". А далее уже разбирая адрес динамически менять содержимое страницы.