Комплексные компоненты и ЧПУ

Урок 8 из 10

25 мин

Легко

Немного теории

Комплексные компоненты

Если простой компонент служит для организации одного блока на странице (максимум — одной страницы), то комплексный компонент помогает организовать целый раздел сайта со своей иерархией URL.

Примеры таких компонентов в таблице ниже.

Название Код Назначение
Новости bitrix:news

Создает раздел сайта с подразделами:
1. Страница общего списка
2. Страница раздела
3. Страница детального просмотра

Каталог bitrix:catalog

Cоздает раздел сайта с подразделами:
1. Список разделов
2. Раздел
3. Детальная информация
4. Таблица сравнения
5. Раздел с фильтром

Структура комплексного компонента повторяет структуру простого компонента, но в шаблонах есть сильное отличие. Вместо одной страницы шаблона template.php у комплексного компонента несколько php-файлов. Для bitrix:news это detail.php, news.php, section.php и еще несколько вспомогательных.

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

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

Главная функция комплексного компонента — служить “роутером” между дочерними простыми компонентами и создавать “единое” окно для их настройки. Поэтому в исходном коде этих компонентов главное место отведено обработке адресов в двух режимах: обычном и ЧПУ (человеко-понятный URL).

  Простой режим адресов Режим ЧПУ
Пример /news/?id=42 /news/42/
Настройки в компоненте

Включить поддержку ЧПУ = нет

Идентификатор новости = id

Включить поддержку ЧПУ = да

Каталог ЧПУ (относительно корня сайта) = /news/

Страница детального просмотра = #ELEMENT_ID#/

Пример /catalog/?section=soft&product=cms /catalog/soft/cms/
Настройки в компоненте

Включить поддержку ЧПУ = нет

Идентификатор раздела = section

Идентификатор элемента = id

Включить поддержку ЧПУ = да

Каталог ЧПУ (относительно корня сайта) = /catalog/

Детальная информация = #SECTION_ID#/#ELEMENT_ID#/

В первом случае код компонента просто проверяет переменную $_GET, настройки из массива параметров $arParams и решает, какая страница шаблона нужна пользователю и какие данные (в нашем примере — ID какой новости) туда передать в массиве данных $arResult.

Во втором случае комплексный компонент проверяет заданные в параметрах шаблоны URL, разбирает текущий открытый адрес, вытаскивая из него данные для arResult.

Для работы с адресами в режиме ЧПУ используются методы:

  • \CComponentEngine::makeComponentUrlTemplates,
  • \CComponentEngine::makeComponentVariableAliases,
  • \CComponentEngine::guessComponentPath,
  • \CComponentEngine::initComponentVariables.

Считается, что комплексный компонент работает в режиме ЧПУ, если задан флаг “Включить поддержку ЧПУ” (код SEF_MODE). Обязательные параметры компонента для режима ЧПУ: каталог ЧПУ (относительно корня сайта) (код SEF_FOLDER) и шаблоны URL, которые задаются в параметре с кодом SEF_URL_TEMPLATES.

В шаблонах при помощи макросов можно разметить следующие переменные:

  • Идентификатор раздела (поле ID раздела инфоблока).
  • Символьный код раздела (поле CODE раздела инфоблока).
  • Путь из символьных кодов раздела (поле CODE раздела инфоблока и CODE всех его родительских разделов, разделенные символом “/”).
  • Идентификатор элемента (поле ID элемента инфоблока).
  • Символьный код элемента (поле CODE элемента инфоблока).

В режиме не-ЧПУ требуется только указать названия, с которыми переменные будут фигурировать в адресе в виде GET-параметра

ЧПУ и обработка адресов

ЧПУ в комплексных компонентах — часть высокоуровневого механизма платформы. Обычно адрес страницы совпадает с путем к php-файлу на сервере. То есть при открытии адреса /company/about/ платформа подключает файл /company/about/index.php. Если файл удалить — страница начнет отдавать ошибку 404.

Но механизм управления адресами в платформе (и его вариация в виде ЧПУ в комплексных компонентах) позволяет изменить привязку к одноименным путям файловой системы.

При каждом http-запросе пользователя к публичной странице, для которой не создан файл, "1С-Битрикс: Управление сайтом" подключает файл urlrewrite.php с правилами обработки адресов. Каждое правило содержит условие и правило преобразования. Если текущий адрес отвечает условию, то выполняется преобразование адреса. Пользователь получает в ответ на http-запрос страницу с другим физическим именем, но по запрошенному адресу (это не перенаправление).

Пример правила:

[
    "CONDITION" => "#^/news/([0-9]+)/#",
    "RULE" => "ELEMENT_ID=$1",
    "PATH" => "/news/index.php",
]

Если пользователь пытается открыть страницу вида /news/<число>/, то платформа перенаправит запрос на физический адрес /news/index.php, передав число из запроса как GET-параметр ELEMENT_ID.

Правила можно размещать через API, через панель администратора (по адресу /bitrix/admin/urlrewrite_list.php?lang=ru) и вручную при редактировании файла urlrewrite.php в корне сайта.

В панели администратора можно запустить пересоздание этого файла. Платформа просканирует всю публичную часть и оставит в urlrewrite.php только правила модулей и комплексных компонентов, остальные будут удалены.

Комплексные компоненты при сохранении страницы через визуальный редактор сами добавляют свои правила в этот файл. Такие правила система считает “надежными” и не будет удалять при запуске полного пересоздания файла.

Если разместить код комплексного компонента на сервере посредством редактирования файла страницы через FTP/SFTP/SSH, правило для ЧПУ добавлено в urlrewrite.php не будет. Чтобы это исправить, нужно пересохранить страницу через визуальный редактор или запустить пересоздание файла в разделе администратора.

Страница 404

Особая страница сайта — страница ошибки 404. Платформа показывает эту страницу, когда пользователь запрашивает несуществующий ресурс на сервере. Эта страница никогда не открывается по прямому адресу: /404.php

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

  1. На странице первым делом должен быть подключен файл /bitrix/modules/main/include/urlrewrite.php.
  2. На странице должен быть задан HTTP статус 404.
  3. На странице должна быть задана константа ERROR_404.

Обычно на этой странице располагается яркое понятное сообщение, что страница, которую ищет пользователь, удалена, и предложение перейти на другие страницы сайта. Чаще всего предлагается переход на главную, поиск или в каталог.

Практика

В этом видео:

  • Страница 404.
  • Компонент bitrix:news.
  • Шаблон комплексного компонента news.
  • Шаблоны простых компонентов в составе комплексного компонента.
  • Поддержка ЧПУ, urlrewrite.php.
  • Динамические страницы в меню, .menu_ext.php

Комплексные компоненты и ЧПУ

17 мин