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

ЧПУ
(человеко-понятный 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 сортировка не происходит, условия проверяются в той последовательности в которой они записаны.
Более подробно можно почитать о ЧПУ на сайте перейти
Добавление динамических разделов
У разработчиков часто возникает необходимость в создании динамических разделов, т.е. без существующей физической папки на диске, соответствующей данному разделу. Решить эту проблему можно с помощью следующих методов:
- Через параметры компонента:
Стоит просто добавить в массив параметра "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"), ); и т.д.
-
Через добавление правила ЧПУ
Добавив следующее:
$APPLICATION->IncludeComponent("bitrix:news", "", array( ... "SEF_URL_TEMPLATES" => array( ... "news" => "news1/|news2/", //соответствует файлу "news.php" ... ), ... ));
Мы будем направляться на файл "news.php" со следующих адресов "http://site.ru/news1/" и "http://site.ru/news2/". А далее уже разбирая адрес динамически менять содержимое страницы.