6 августа 2010 г.

Как я делал ЧПУ в Битриксе

Сегодня по долгу работу мне понадобилось на сайте сделать ЧПУ для статей на сайте под CMS Bitrix. Причина - это предоставить "прямую" ссылку на статью поисковику, а не параметрическую , как по умолчанию в Битриксе.
Рис. 1 Диалог задания символьного кода 
Такая возможность появляется если для каждой статьи задавать свой уникальный символьный код (Рис. 1) .

Введение
На сайте отображение списка статей/новостей  (любых других вариантов данных из инфоблоков) делается в виде группы сочетаний текст + картинка + ссылка "подробнее".
Картинка связана с содержанием. А ссылка ведет на другую страницу. Правильнее сказать, извлекается из базы и подается под "правильным" URL. В Битриксе хранение данных в БД и последующее извлечение с помощью компонентов организуется в Инфоблоках. Для реализации такой модели на сайте понадобятся:
  • стандартные компоненты Битрикса "Новость детально" и "список новостей";
  • данные в Инфоблоках.
Хоть ЧПУ и задается в отдельном разделе Админки. Подстановка адреса в необходимом формате происходит непосредственно в компонентах отвечающих за отображение данных. А необходимый для этого символьный код задается в самом элементе инфоблока.

Настройка Инфоблока
Первым делом необходимо настроить информационный блок который будет использоваться для статей: Панель управления=> настроки=> информационный блоки=> необходимый инфоблок (Рис. 2).
Во вкладке "Инфоблок в поле" в поле "URL страницы детального просмотра:"
указываем путь ЧПУ до страницы с инфоблоком детального описания:
#SITE_DIR#/kredit_v_banke/#ELEMENT_CODE#/
Т.е. адрес статьи будет выглядеть, как www.site.ru/kredit_v_banke/code_elementa/ где /kredit_v_banke/ - под каталог, будет описан при настройке ЧПУ
Рис. 2
Настройка списка новостей
Вторым шагом будет настройка компонента "список новостей". После размещения на странице этого компонента Битрикса:
1) переходим в параметры компонента и указываем следующие настройки:
"Тип информационного блока" и "Код информационного блока" выбираем созданный на предыдущем шаге инфоблок.
2) в поле "URL страницы детального просмотра (по умолчанию - из настроек инфоблока):" дублируем значение:
/kredit_v_banke/#ELEMENT_CODE#/

Настройка страницы отображения
Третий шаг - настройка компонента "новость детально". На заранее созданной странице размещаем компонент Битрикса "новость детально". В параметрах компонента
"Тип информационного блока" => указываем тип созданного инфоблока
"Код новости" => вводим: ={$_REQUEST["code"]} где code - это параметр, который будет использоваться при настройки ЧПУ, а все значение  выражения будет содержать символьный код элемента инфоблока.

Настройка ЧПУ в Админке
Четвертым шагом настраиваем ЧПУ. Переходим Панель управления=> настройки=>обработка адресов => новая запись (Рис. 3)


Рис. 3
В поле "условие" указываем регулярное выражение для url:
#^/kredit_v_banke/([\w\d]+)(/)?#
где ([\w\d]+)(/)? означает что
\w - можно использовать символы A-Z, a-z, _
\d - числа,
[...]+ - всего знаков должно быть >=1
(/)? - в конце должен быть слэш, но не обязательно
Фрагмент заключенный в круглые скобки, потом предстанет в поле "Правило" под значением  параметра $1.

В поле "Файл:" указываем путь до страницы с компонентом детального описания:
/content/article_detail_1.php

Поле "Компонент" оставляем пустым

В поле "Правило:" прописываем: code=$1 где:  
code - GET параметр URL запроса ,
$1  - первый параметр из регулярного выражения url.

По умолчанию путь до статьи должен быть
/content/article_detail_1.php?code=element_code
где code это заданный в настройках параметр, а element_code символьный код эл-та в этой последовательности символьный код 1-й параметр по этому $1. Благодаря ЧПУ путь до статьи будет:
/kredit_v_banke/element_code/
Теперь "применяем" и сохраняем. теперь все должно работать.

27 комментариев:

  1. Спасибо за рецептик... помогло... но есть нюанс.. если в адресную строку приходит любой доппараметр... скажем "?clear_cache=Y"... то получаем сакраментальное "Элемент не найден!"... что не есть приятно... можно как нибудь это вылечить?

    ОтветитьУдалить
  2. изменил условие на #^/articles/(.*).html(.*)# проблема "Элемент не найден!" - пофиксилась... но такое регвыражение пропускает все подряд... подскажите что можно туда написать чтоб обрабатывались числа, латиница и дефисы?

    ОтветитьУдалить
  3. В #^/articles/(.*).html(.*)#
    Второй "(.*)" в выражении действительно обрабатывает ("?clear_cache=Y"), но и обработает любую другую комбинацию.
    Я думаю это слишком "агрессивное" решение проблемы. Обработка только параметров GET запросов будет нормальным.
    Поэтому его можно заменить на: (?:\?.*)?
    Первый "(.*)" в выражении пропускает все подряд.
    Вариант решения:
    #^/articles/([\w\d\-_]+).html(?:\?.*)?#
    или
    #^/articles/([a-zA-Z0-9\-_]+).html(?:\?.*)?#
    где
    [...]+ - символьный класс
    \w - буквенные символы ( аналог a-zA-Z )
    \d - цифры (аналог 0-9)
    \- - экранированный символ дефиса
    _ - символ нижнего подчеркивания (если Вы его используете)

    ОтветитьУдалить
  4. Спасибо за ответ! Работает!

    ОтветитьУдалить
  5. Приветствую!
    Если мы не используем подразделы в инфоблоке, то ЧПУ работает просто на ура (вот уж и не ждал что у битрикса оно хоть когда нибудь заработает)!
    Но, как только появляются разделы, и не дай бог подразделы, то не фига не получается (((
    Скажем есть инфоблок КАТАЛОГ, в нем раздел ТЕЛЕФОНЫ, в нем подраздел НОКИЯ, вот как в обработке адресов правильно написать условие, если мы не используем стандартные битриксовые убогие айди-чпу для комплексного компонента? Если подскажите и направите на верный путь, буду считать что чудеса существуют и дед мороз услышал в этом году мою просьбу))

    ОтветитьУдалить
  6. Попробовал сделать как написано и для Новостной связки и для связки компонентов bitrix:catalog.section и bitrix:catalog.element - не получается и все тут.

    Нет в строку заголовка все передается и получается, если для товара например выходит:

    http://www.vremyaigr.ru/catalog/game/1618/darkness_2_PC/

    но пишет что элемент не найден.

    Если изменить условия к виду:

    Условие: #^/catalog/game/([0-9]+)/([0-9]+)/#
    Файл: /mgn/detail.php
    Правило: SECTION_ID=$1&ELEMENT_ID=$2

    то все начинает бегать, но вызов уже выходит не символьный а числовой, вида:

    http://www.vremyaigr.ru/catalog/game/1618/19150/ - что уже не очень красиво.

    Но работает зараза, а хочется все таки, что бы попадали символы.

    Не подскажете куда копать и почему с числами все работает, а с символами нет.

    ОтветитьУдалить
  7. уф, в новостях запустил :) буду теперь пытаться в товарах повторить :)

    ОтветитьУдалить
  8. Если я вас правильно понял. То Ваш пример работает потому что составлен корректно:
    "Условие: #^/catalog/game/([0-9]+)/([0-9]+)/#
    Файл: /mgn/detail.php
    Правило: SECTION_ID=$1&ELEMENT_ID=$2"
    Здесь параметры SECTION_ID и ELEMENT_ID - принимают числовые значения ([0-9]+).
    Для примера http://www.vremyaigr.ru/catalog/game/1618/darkness_2_PC/
    Потребуется заменить ELEMENT_ID на #ELEMENT_CODE# (Символьный код, предварительно должен быть задан для каждого элемента) и условие на что то вроде #^/catalog/game/([0-9]+)/([\w\d\-_]+)/#

    ОтветитьУдалить
  9. Нет, не работало по другой причине, в компоненте в поле:

    ID элемента: усиленно пытался ввести:

    ={$_REQUEST["code"]}

    Хотя ниже есть специальное прекрасное поле: Код элемента:

    Перенес значение туда и все стало ок (вот что значит заниматься ЧПУ несколько часов, в первые, поле не видел и не осознавал).

    В процессе настроек я пошел дальше, кроме подключения ЧПУ к детальному описанию, например тут уже работает:

    http://www.vremyaigr.ru/catalog/buy/pc_game/Darkness_2_PC/

    Я решил настроит ЧПУ и в компоненте:

    bitrix:catalog.section

    Вот временная страничка для экспериментов:

    http://www.vremyaigr.ru/catalog/buy/pc_game/

    Как бы все сработало и отображается и вроде и переходы работают с нее и на нее, но возникают казусы которые все портят.

    Например вы перешли на эту страничку как залогиненый пользователь сайта, а потом решили разлогинится, в УРЛЕ после этого появляется следующий текст:

    http://www.vremyaigr.ru/catalog/buy/pc_game/index.php?SECTION_CODE=pc_game&x=3&y=6&code=index

    Который выводит ошибку: Элемент не найден.

    Но это бы была ерунда, вероятность возникновения желания разлогинится находясь именно на страничке со списком каталога не велика, но такая проблема возникает и в обратной последовательности.

    Вы заходите на страничку без авторизации (по рекламе, по ссылке друга и т.д., то есть вероятность велика), а потом находясь на ней, пожелали залогинится, и получили похожую проблему, правда несколько с другим видом УРЛА:

    http://www.vremyaigr.ru/bitrix/urlrewrite.php?SEF_APPLICATION_CUR_PAGE_URL=%2Fcatalog%2Fbuy%2Fpc_game%2Findex.php

    Но с тем же результатом: Элемент не найден.

    Что самое интересное, таких проблем не возникает на странице с детальным описанием товара, то есть можно разлогиневаться, логинется, обновляться и т.д. все ок, появляются всякие дополнения в виде значений в конце, например ?clear_cache=Y и тому подобное, но все работает.

    А вот на странице списка каталогов не в какую, поэтому пока не вывожу в работу данную часть.

    В настройках обработки адресов стоят следующие значения для проблемного места, может в нем что не так:

    Условие: #^/catalog/buy/([\w\d]+)(\\?(.*))?#
    Файл: /mgn/list_.php
    Правило: SECTION_CODE=$1

    Что вы думаете по поводу этой проблемы, в чем может она быть.

    По поводу опасения человека с вложенностями в каталоге, то же нет не каких проблем пока, у нас каталог сделан условно:

    Товар с цифровой доставкой
    - игры
    - программы
    - антивирусы
    - операционные системы
    - Карты оплаты
    - ПСН
    - Лайв

    Расставили везде текстовые идентификаторы в каталоге и все ок, бегает по всему каталогу, либо пока не столкнулись со сложностями и опасениями предположенными выше.

    ОтветитьУдалить
  10. Блин в комментарии выше убило отступы в представление каталога в конце, там 3 уровня вложенности. Если в строку:

    /Товар с цифровой доставкой/программы/антивирусы
    /Товар с цифровой доставкой/программы/операционные системы

    Читал ваш второй пост как раз про каталог.

    ОтветитьУдалить
  11. Подскажите как сделать ЧПУ такого вида, /123/aaa.php

    Включаю ЧПУ в настройках, прписываю элемент #ELEMENT_CODE# пишет не найдены элементы, а если добавляю \ тоесть поулчается #ELEMENT_CODE#\ то всё работает но ссылка выглядет так, /123/aaa.php/

    Как убрать слеш? В каждой статье ставлю код например аааа.php, может можно сделать чтобы он автоматом приписывал .php к названию? Это нужно чтобы со старго сайта ссылки не изменились. Заранее спасибо!

    ОтветитьУдалить
  12. Но это бы была ерунда, вероятность возникновения желания разлогинится находясь именно на страничке со списком каталога не велика, но такая проблема возникает и в обратной последовательности.

    Вы заходите на страничку без авторизации (по рекламе, по ссылке друга и т.д., то есть вероятность велика), а потом находясь на ней, пожелали залогинится, и получили похожую проблему, правда несколько с другим видом УРЛА:
    kuzgrad.ru

    ОтветитьУдалить
  13. Здравствуйте. Руководствуясь вашей статьёй, без труда заменил ссылки вида /products/114/1082/ на ЧПУ. Однако после включения ЧПУ перестала работать форма заказа (внизу раздела каталога, под списком товаров. А также в карточке товара) - она просто исчезла! Чего ей не хватает, чтобы нормально работать?

    ОтветитьУдалить
  14. Долбаёб блять, тупой ты задрот, все что надо сделать чтобы в битриксе было красивое ЧПУ это поставить во-первых комплексный компонент новости, в админке в инфоблоке только галочку ="создаватьь символьный код из названия" отметить надо мудак ты этакий, далее в настройках компонента установить 1)Каталог ЧПУ (относительно корня сайта), 2)Страница раздела, 3)Страница детального просмотра - такие значения 1) /articles/ 2) #SECTION_CODE#/ 3) #ELEMENT_CODE#/

    и будет тебе /articles/football/za_ovechkina/

    P.S. читай документацию дебил!!!

    ОтветитьУдалить
    Ответы
    1. Да ну? прям долбаеб?
      А если на сайте был самописный фильтр новостей и можно пользоваться ТОЛЬКО компонентами "Список новостей", и "Новость детально", тогда что ты скажешь?
      переписывать половину сайта? Или воспользоваться этим решением?

      Удалить
  15. Хотя не, не извиняюсь, ты всё таки долбаёб! не могу долго идиотизм читать, но люблю обсирать такое)

    ОтветитьУдалить
  16. как перенаправить старую ссылки на новые которые мы сделали? к примеру c /mobile/detail.php?diagnostika/&lang=ru на /mobile/diagnostika

    ОтветитьУдалить
  17. Блин, ну не фига не понятно...
    Вот получил я сайт на битриксе. Открываю админку.
    Читаю вашу статью и пытаюсь настроить чпу для раздела со статьями:
    1. Настройка Инфоблока - вроде сделал. Получилось так, как у вас на картинке
    2. Настройка списка новостей. Цитата:
    "Вторым шагом будет настройка компонента "список новостей". После размещения на странице этого компонента Битрикса:"
    Сразу же вопрос: Как разместить этот компонент на странице?????
    Ну вроде что то сделал, но не понятно правильно ли...
    3. Настройка страницы отображения. Опять цитата: "На заранее созданной странице размещаем компонент Битрикса "новость детально"."
    Что значит на заранее созданной странице, когда и где её надо было создать заранее и откуда взять компонент "Новость детально", если на предыдущих шагах его не создавали???????

    ОтветитьУдалить
  18. в догонку: когда где и, самое главное, КАК создать страницу и разместить компонент....

    ОтветитьУдалить
  19. Сделал все по инструкции, но у меня #ELEMENT_CODE# не преобразуется в символьный код элемента. В результате, на странице списка новостей, ссылки на все новости имеют вид site.com/news/#ELEMENT_CODE#/
    Может это из-за старой версии Битрикса? У меня 7.0.6

    ОтветитьУдалить
  20. сделала для #ELEMENT_CODE#.
    Стояла задача такова-каталог товаров без разделов.
    Создаем папочку в которой у нас будет размещатся в файле index.php catalog.section.В нем же создадим файл detail.php где будет находится компонента catalog.element.Теперь по настройкам
    1.Настройка правил обработок.
    Условие:#^/catalog/([\w\d\-]+)(\\?(.*))?#
    Файл:/catalog/detail.php
    Правило:ELEMENT_CODE=$1
    2.Настройка инфоблока
    URL страницы детального просмотра:#SITE_DIR#/catalog/#ELEMENT_CODE#/
    3.Настройка компоненты catalog.section
    Параметр компоненты "Включить поддержку ЧПУ" ОТКЛЮЧАЕМ=))
    Потом в параметрах
    "URL, ведущий на страницу с содержимым элемента раздела":
    /catalog/#ELEMENT_CODE#/
    4.Настройка компоненты элемент каталога детально
    Код элемента:={$_REQUEST["ELEMENT_CODE"]}
    И ставим галочку в компоненте Включить поддержку ЧПУ =)))
    Все заработало

    ОтветитьУдалить
    Ответы
    1. Спасибо, добрая леди! Помог именно ваш вариант! )

      Удалить
  21. Настраиваю условия отображения шаблона для отдельного раздела каталога.
    Шаблон отображается с условием адреса раздела
    Путь /catalog/akrilovye_tkani/ ПРАВДА
    Но перестаёт отображаться при применении фильтра. Пример генерируемого фильтром адреса: /catalog/akrilovye_tkani/filter/material_osnovy-is-31c919db-85aa-11e8-8ab1-98eecb790ac5/pokrytie-is-a703fdc2-04d2-11e8-86cf-001bfccf4142/apply/
    Настройка Регулярное выражение: #^/catalog/akrilovye_tkani/filter/(.*)/(.*)/# Сопоставление: Путь Результат: Правда - не работает.
    Засада еще в том что у фильтра в адресе в зависимости от колличества примененных условий может быть любое количество слешей.
    Сможете посоветовать решение?

    ОтветитьУдалить