Настройка ЧПУ в новостной ленте 1c-bitrix – способ №2

Сегодня я расскажу как настраивать ЧПУ при совместном использовании 2х компонентов – «лента новостей» и «новость детально». Результатом будут красивые ссылки вида /news/1/ вместо стандартного /news/news_detail.php?ELEMENT_ID=1.

Итак, что нам необходимо для начала работы:
- созданный инфоблок с добавленными элементами
- настроенный обработчик 404 ошибки (как это сделать, я писал тут)
- компонент «лента новостей» (для примера будет располагаться в корне сайта /index.php)
- компонент «новость детально» (например, в /news/news_detail.php)

Первым делом в ленте новостей указываем путь до страницы детального просмотра — /news/#ELEMENT_ID#/
В настройках «новости детально» должно стоять: ID новости ={$_REQUEST["ELEMENT_ID"]}

Идем в Панель управления – Настройки – Настройки продукта – Обработка адресов – Новая запись.
Для тестового примера заполняем поля как на скриншоте

Файл — указываем путь до страницы, на которой лежит компонент «новость детально».
Условие стоит рассмотреть подробнее:
символами #^ обозначается начало строки для сопоставления;
/news/ — реальный или виртуальный каталог (т.е. может не существовать), который будет использоваться в адресах ссылок. Должен совпадать с первой частью пути до страницы детального просмотра в компоненте «лента новостей» (до #ELEMENT_ID#/);
([0-9]+) — буквально означает «любое количество цифр от 0 до 9». Это наиболее подходящий вариант, так как id новости — всегда число;
# — конец условия

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

Для правильной работы поиска указываем в настройках инфоблока:
URL страницы информационного блока: #SITE_DIR#/
URL страницы раздела:
URL страницы детального просмотра: #SITE_DIR#/news/#ELEMENT_ID#/
Здесь /news/ тот самый существующий или не существующий каталог, о котором шла речь выше.

Работа с разделами сознательно не затрагивалась в данной статье, по той причине что нет стандартного новостного компонента, выводящего их список (да, в каталоге есть, но это уже совсем другая история:)

Если вам понравилась статья, подписывайтесь на обновления блога по rss или присоединяйтесь в twitter

Поделиться ссылкой с друзьями:

Метки: ,

Категории: Bitrix

Комментарии (22)

  1. Александр:

    Спасибо огромное, очень я эту информацию искал ))

    А то на форуме битрикса или к мануалам отсылают (в которых далеко не всегда все очевидно), или говорят — вы лохи, всякую ерунду спрашиваете ((

  2. Павел:

    Все прекрасно работает, спасибо! Но, что делать, если нужно использовать вместо числового идентификатора символьный, например, ELEMENT_CODE? Пробовал таким путем, но не прокатывает…. Буду признателен за подсказку.

  3. Настройка, по идее, отличается всего лишь одним пунктом — в списке путь до деталки /news/#ELEMENT_CODE#/ и в настройках детального просмотра «Код элемента» ={$_REQUEST["ELEMENT_CODE"]}

  4. Александр:

    Большое спасибо за пример! В документации по битриксу эта информация почему-то отсутствует.

    ЧПУ работает, но возникает проблема при применении постраничной навигации —
    например при выводе комментариев к новости или при разбивке длинной статьи с помощью тега .

    Пример:

    До настройки ЧПУ ссылки на новости были такого вида:
    /news/detail.php?ID=4827

    Если к новости есть многостраничные комментарии (выводятся с помощью компонента forum.topic.reviews), то ссылки имели такой вид:

    /news/detail.php?ID=4827&PAGEN_2=2
    /news/detail.php?ID=4827&PAGEN_2=3
    и т.д.

    После настройки ЧПУ ссылки на новость стали такого вида:

    /news/4827/

    Ссылка выводится красиво как и задумано.

    Но ссылки с постраничной навигацией выглядят уже не очень:

    /news/4839/?ID=4839&PAGEN_2=2
    /news/4839/?ID=4839&PAGEN_2=3

    А не так как хотелось бы:

    /news/4839/?PAGEN_2=2
    /news/4839/?PAGEN_2=3

    Пробовал различные настройки в «Обработке адресов» — бесполезно, компонент system.pagenavigation этим правилом не подчиняется.

    Поэтому от настройки ЧПУ видимо придется отказаться.

  5. Александр, у Вас в настройках инфоблока путь до страницы детального просмотра правильный стоит?
    Такой проблемы не должно быть.

  6. Александр:

    В настройках детальной страницы след. параметр:
    #SITE_DIR#/news/#ELEMENT_ID#/

  7. Александр, скиньте код страницы мне на e-mail, попробуем разобраться:)
    alexey.valeev@gmail.com

  8. Михаил:

    Спасибо, Алексей! Второй раз нахожу нужную информацию на Вашем блоге.

  9. Алёна:

    Очень помогли, спасибо!

  10. Danis Lee:

    Отлично) это сработало!
    А если ситуация такая. Есть уже готовая страница.. и надо привести её из вида http://mysite.ru/bitrix/test/…/test.php к виду http://mysite.ru/test.html. Естественно с редиректом со старой на новую. Как это реализовать в битриксе, если не секрет?)

  11. C ходу видится 2 варианта — прописать в админке правило в «Обработке адресов» (не скажу точно как оно будет выглядеть, можно в курсах подсмотреть) или поставить 301й редирект прямо из .htaccess корневой директории.

  12. Евдокимов:

    У Вас ссылка битая (как это сделать, я писал тут). Вы наверно с Денвера переносили…

  13. Алексей Валеев:

    Спасибо, ссылку исправил.

  14. Алина:

    Наконец-то полезная инфа по этому вопросу! :)
    Спасибо, благодаря Вам все получилось

  15. алексей:

    столкнулся с такой же ситуацией как у Александр:
    05.10.2010 в 06:32 http://alexvaleev.ru/nastroika-chpu-v-novostnoi-lent-1c-bitrix-sposob2/#comment-682

    раньше никогда не было таого или не замечал, но тут засада
    ситуация такая: есть каталог(catalog) у него настроено ЧПУ
    понадобилось создать новый раздел со своим правилом

    создал: categoria/list.php
    кидаю туда компонент catalog.section и настраиваю под него фильтрацию и чпу

    Код
    «CONDITION» => «#^/catalog/categoria/([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/(.*)#»,
    «RULE» => «CATEGORIA=$1&AUTO=$2″,
    «ID» => «bitrix:catalog»,
    «PATH» => «/catalog/categoria/list.php»,
    отлично, ссылка /catalog/categoria/1/kia/ работает, но на странице есть постраничная навигация. нажимаем 2 страницу и
    /catalog/categoria/1/kia/?CATEGORIA=1&AUTO=kia&PAGEN_1=2

    как избавиться от этой части CATEGORIA=1&AUTO=kia& чтобы осталось только /catalog/categoria/1/kia/?PAGEN_1=2

    сами элементы имеют правильный путь, все хорошо, а вот постраничная навигация нет

    вы тогда смогли понять от чего такое могло произойти или нет?

  16. VelsЪ:

    я бы еще добавил в конструкцию (?:\\?.*)?# дабы после сброса кеша на детальной странице вместо содержимого не появлялась противная красная надпись ЭЛЕМЕНТ НЕ НАЙДЕН

    «CONDITION» => «#^/news/([0-9]+)/(?:\\?.*)?#»,

  17. Andrey:

    Алексей, у меня не получается настроить использование символьного идентификатора вместо числового через ELEMENT_CODE, как Вы описали. У меня Битрикс 7.0.6 На форуме пишут, что нужно добавлять код в файл /bitrix/php_interface/init.php чтобы ЧПУ работало на старых версиях Битрикса: http://dev.1c-bitrix.ru/community/forums/forum6/topic35759/
    Но у меня и с этим кодом не работает.
    Помогите разобраться.

  18. Ребят, помогите пожалуйста. Переношу новости, не могу настроить чпу отображения новостей. Показывает код 404
    Необходим вывод новостей типа » #SITE_DIR#/news/#SECTION_CODE#/#ELEMENT_CODE#.php »
    Создал страницу » #SITE_DIR#/news/newsdetail.php »
    Добавил в нее компонент » bitrix:news.detail » и настроил ID новости » ={$_REQUEST["ELEMENT_ID"]} »
    В правилах обработки адресов указал
    Условие » #^/news/([a-zA-Z0-9]+$)/([a-zA-Z0-9]+$)/# »
    Компонент » bitrix:news.detail »
    Файл » /news/newsdetail.php »
    Правило » ELEMENT_CODE=$2 »

    При переходе по ссылке «новость детально» открывается 404.

    Подскажите, пожалуйста, на каком этапе совершил ошибку. Спасибо.

  19. Алексей Валеев:

    Точно не скажу, нужно тестировать, но сразу видно 2 ошибки:
    1. в настройках компонента нужно указать, что используется код элемента = {$_REQUEST["ELEMENT_CODE"]}
    2. условие не совпадает с маской, так правильнее #^/news/([a-zA-Z0-9]+$)/([a-zA-Z0-9]+$)\.php#

  20. Подправил

    Условие » #^/news/([a-zA-Z0-9]+$)/([a-zA-Z0-9]+$)\.php# »
    ID новости » ={$_REQUEST["ELEMENT_CODE"]} »

    не помогает

  21. Алексей Валеев:

    В настройках нужно указать использование символьного кода элемента, а не ID. И установить его значение «ELEMENT_CODE» => ={$_REQUEST["ELEMENT_CODE"]}

  22. Алла:

    сделала для #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"]}
    И ставим галочку в компоненте Включить поддержку ЧПУ =)))
    Все заработало