Просмотров: 8183 (Статистика ведётся с 06.02.2017)
Роберт Басыров
Сложность урока:
4 уровень - сложно, требуется сосредоточится, внимание деталям и точному следованию инструкции.
1
2
3
4
5
Недоступно в редакциях:
Ограничений нет

Рассмотрим частые примеры

Нужно, чтобы страница вида:
/gospel/pericope/?ELEMENT_ID=545&SECTION_ID=208

откликалась на адрес вида:

/gospel/pericope/545/208/

Создайте правило с параметрами:

  • Условие: #^/gospel/pericope/([0-9]+)/([0-9]+)/#
  • Компонент:
  • Файл: /gospel/pericope/index.php
  • Правило: ELEMENT_ID=$1&SECTION_ID=$2

Как можно вручную настроить ЧПУ, используя символьный код разделов инфоблока.

Например, для ЧПУ-пути /some_sef_folder/section_code/, где section_code - символьный код секции. ЧПУ-правило будет:

   array(
      "CONDITION"   =>   "#^/some_sef_folder/([0-9a-zA-Z-]+)/.*#",
      "RULE"   =>   "SECTION_CODE=$1",
      "ID"   =>   "",
      "PATH"   =>   "/real_script_path/index.php",
   ),

В скрипте /real_script_path/index.php в настройках компонента параметру символьного кода секции нужно указывать $_REQUEST['SECTION_CODE']

Для ЧПУ-пути /some_sef_folder/section_code/element_id.php, где section_code - символьный код секции, а element_id - целочисленный код элемента. ЧПУ-правило будет:

   array(
      "CONDITION"   =>  "#^/some_sef_folder/([0-9a-zA-Z-]+)/([0-9]+)\.php.*#" ,
      "RULE"   =>  "SECTION_CODE=$1&ELEMENT_ID=$2" ,
      "ID"   =>   "",
      "PATH"   =>  "/real_script_path/index.php" ,
   ),

В скрипте /real_script_path/index.php компоненту нужно передавать $_REQUEST['SECTION_CODE'] и $_REQUEST['ELEMENT_ID'] соответственно.

some_sef_folder - ЧПУ-путь, может не существовать реально на сервере.
real_script_path - путь к реальному скрипту-обработичку на сайте, который будет генерировать результат.


Для случаев:
  1. Один из разделов каталога (site.ru/каталог/название_раздела1/) выводить по адресу site.ru/другое_название_раздела1/
  2. Одну из статей (site.ru/статьи/название_статьи1/) выводить по адресу site.ru/другое_название_статьи1/
  3. Один из подразделов (site/раздел/подраздел/) выводить по адресу site.ru/новое_название/
  4. Одну из статей (site.ru/раздел/статьи/название_статьи2/) выводить по адресу site.ru/другое_название_статьи2/

Подойдёт правило:

  • Условие: /другое_название_раздела1/
  • Компонент:
  • Файл: #^/каталог/название_раздела1/#
  • Правило:

Пример приведёт для первого случая, остальные варианты аналогичны.


Есть правило:
  • Условие: #^/([^/]*)-([^-]*)#
  • Компонент:
  • Файл: /catalog/index.php
  • Правило: PARENT_SECTION_CODE=$1&SECTION_CODE=$2&

Пути вида: http://site.com/код раздела_код подраздела не обрабатываются этим правилом.

Причина: знак минус в выражении [^-] воспринимается как служебный, обозначающий диапазон, а служебные символы нужно предварять знаком "\", т.е. писать вместо минуса "\-". Однако этого недостаточно если код подраздела состоит не только из символов, например: "1-xxxx", "2-xxxx".

Причина в первом квантификаторе в первых круглых скобках, действие которого нужно ограничить знаком "?". Конечное условие: #^/(R.*?)\-(.*)/#


Два правила.

Правило:

  • Условие: #^/cat/([a-z0-9\_]+)/([a-z0-9\_]+)*#
  • Компонент:
  • Файл: /cat/test.php
  • Правило: SECTION_CODE=$1&ELEMENT_ID=$2

для site.ru/cat/razdel/element/ откроет тоже самое, что и для site.ru/cat/razdel/

Лучше сделать два правила. (Использование двух правил допускается системой).

Первое:

  • Условие: #^/cat/([a-z0-9\_]+)/(\d+)/\?(.*)?#
  • Компонент:
  • Файл: /cat/test.php
  • Правило: SECTION_CODE=$1&ELEMENT_ID=$2&$3

Второе:

  • Условие: #^/cat/([a-z0-9\_]+)/([a-zA-Z]{1}[a-zA-Z0-9]*)/\?(.*)?#
  • Компонент:
  • Файл: /cat/test.php
  • Правило: SECTION_CODE=$1&ELEMENT_CODE=$2&$3


Надо сократить урл. Например, вместо http://epic.tm/catalog/men/ выводить http://epic.tm/men/.

1) Создайте файл /catalog/list.php следующего вида:

<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("Показ раздела");
?>

<pre><?print_r($_REQUEST);?></pre>

<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>

2) Добавьте правило в /urlrewrite.php:

   array(
      "CONDITION"   =>  "#^/([^\\/]+)/($|index\\.php|\\?.*)#" ,
      "RULE"   =>  "SECTION_CODE=$1" ,
      "ID"   =>   "",
      "PATH"   =>  "/catalog/list.php" ,
   ),

3) Откройте в браузере страницу http://epic.tm/men/. Если у вас показывается страница /catalog/list.php, значит, всё сделано правильно. Разместите на этой странице вызов компонента bitrix:catalog.section и настройте компонент.

4) Поправьте поле "URL страницы раздела" в настройках соответствующего инфоблока.


Как настроить ЧПУ если используется catalog:sections и element:detail вместо комплексного компонента. Ссылки на разделы каталога должны иметь вид /catalog/section-name/, а на товары /catalog/section-name/element-name/.

1) Создайте два правила:

  • Условие: #^/catalog/([\w,-]+)/([^/]*)#
  • Компонент:
  • Файл: /catalog/index.php (в этом файле у вас вызов компонента catalog.sections)
  • Правило: SECTION_CODE=$1
и
  • Условие: #^/catalog/([\w,-]+)/([\w,-]+)/([^/]*)#
  • Компонент:
  • Файл: /catalog/detail.php (в этом файле у вас вызов компонента element.detail)
  • Правило: SECTION_CODE=$1&ELEMENT_CODE=$2

2) В настройках инфоблока каталога укажите:
URL страницы раздела: #SITE_DIR#/catalog/#SECTION_CODE#/
URL страницы детального просмотра: #SITE_DIR#/catalog/#SECTION_CODE#/#ELEMENT_CODE#/

3) В настройках компонентов укажите:
Код раздела: ={$_REQUEST["SECTION_CODE"]} (для компонента catalog.sections) Код раздела: ={$_REQUEST["ELEMENT_CODE"]} (для компонента element.detail)


  • Обработка адресов поддерживает регулярные замены. Пример объединения трех правил (для трех языков) в одно:
    • Условие: #^/([de|ru|ua]+)/products/test/([0-9]+)(.*)#
    • Компонент:
    • Файл: /$1/products/test/index.php
    • Правило: SECTION_CODE=$2


  • Если в системе обработки адресов зарегистрировано правило:
    • Условие: #^/gallery/#
    • Компонент:
    • Файл: /max/images/index.php
    • Правило:

    и пользователем запрошена страница /gallery/38.php, которая физически не существует, то система обработки адресов подключит скрипт /max/images/index.php.


    Если в системе обработки адресов зарегистрировано правило:
    • Условие: #^/index/([0-9]+)/([0-9]+)/#
    • Компонент:
    • Файл: /newforum/index.php
    • Правило: mode=read&CID=$1&GID=$2

    и пользователем запрошена страница /index/5/48/, то будет подключен скрипт /newforum/index.php?mode=read&CID=5&GID=48.


    Если в системе обработки адресов зарегистрировано правило:
    • Условие: #(.+?)\\.html(.*)#
    • Компонент:
    • Файл:
    • Правило: $1.php$2

    и пользователем запрошена страница /about/company.html?show, то будет подключен скрипт /about/company.php?show.

    Документация по теме:


    27


    Курсы разработаны в компании «1С-Битрикс»