22.11.2011 г.

Решение для многоуровневого ЧПУ в один редирект

Понадобился многоуровневый ЧПУ. Сначала, конечно, обратились к «коллективному опыту», который дал такие результаты:

  1. http://www.1c-bitrix.ru/products/cms/projects/projects/231168/?sphrase_id=843002
  2. http://dev.1c-bitrix.ru/community/forums/messages/forum7/topic38174/message208845/#message208845

Что, очевидно, не есть удобное решение. Хотелось все-же получить результат не в виде «подпорки», а такой, который и на других проектах можно использовать.

В результате «Задача многоуровневых ЧПУ» была решена при следующих ограничениях:

  1. Если на конце "/" это URL раздел.
  2. Если на конце нет "/", то URL продукт.
  3. Если на одном уровне иерархии есть два раздела с одинаковым символьным кодом — возникает неоднозначность.
  4. Если два продукта имеют одинаковый символьный код — возникает неоднозначность.

Далее «Обработчике адресов» Битрикс пишется условие вида:
#^/products(/.*/)([^/\?]*)\?*([^/?]*)$#
/products/section.php
HAU=$1&HAU_ELEMENT_CODE=$2&$3
где:
  • products — папка на сайте в которой находится отображение многоуровневого каталога.
  • HAU ($1) — собственно ЧПУ любого количества уровней.
  • HAU_ELEMENT_CODE ($2) — код элемента, если он есть.
  • $3 — передача управляющих параметров скрипта, чтобы, например, работала версия для печати заданная так: /products/section_1/section_2/product_code_1?print=Y

Файл section.php принимает на вход HAU как параметр и производит разбор строки с целью получить ID конечного раздела. Когда ID раздела получен — выводится его содержимое. Если же передан еще и HAU_ELEMENT_CODE, то выводим содержимое элемента, а содержимое раздела НЕ выводим. В общем, как использовать расшифрованное ЧПУ это уже вопрос конкретного проекта.

Более удобно получение последнего ID и построение навигационной цепочки оформить функциями и добавить в init.php. Тогда результат их работы можно записать в глобальные переменные и вызывать везде где надо.

Приложения:
Кодирование в ЧПУ пути к товару в каталоге

Пусть товар с кодом Х лежит в разделах Y и Z. Тогда путь к товару будет таким: site.ru/Y/Z/X. Если написать site.ru/Y/Z/X/ т.е. на конце присутствует слеш, то это уже будет расценено как ссылка на раздел.

Путь строится так:  берется код продукта и рекурсивно отматывается весь путь по вложенным разделам до корня. Для этого написана специальная функция и размещена в init.php. Реализацию можно посмотреть здесь: http://variscite.ru/.

Замечательно, что работает и так:
http://variscite.ru/products/som/legacy/var-som-om35
и так:
http://variscite.ru/products/som/var-som-om35
Т.е. к товару можно всегда обратится как по полной ссылке со всеми вложенными разделами, так и по короткой прямой ссылке.

Вид файла обработчика адресов сайта variscite.ru в части обработки адресов каталога
   array(
      "CONDITION"   =>   "#^/products(/.*/)([^/\\?]*)\\?*([^/?]*)$#",
      "RULE"   =>   "HAU=$1&HAU_ELEMENT_CODE=$2&$3",
      "ID"   =>   "",
      "PATH"   =>   "/products/section.php",
   ),
   array(
      "CONDITION"   =>   "#^/products(/[^/?]+)\\?*([^/?]*)$#",
      "RULE"   =>   "HAU=$1&HAU_ELEMENT_CODE=$1&$3",
      "ID"   =>   "",
      "PATH"   =>   "/products/section.php",
   ),

Опубликовано на сайте:
22.11.11