Немного теории
Комплексные компоненты
Если простой компонент служит для организации одного блока на странице (максимум — одной страницы), то комплексный компонент помогает организовать целый раздел сайта со своей иерархией URL.
Примеры таких компонентов в таблице ниже.
Название | Код | Назначение |
---|---|---|
Новости | bitrix:news |
Создает раздел сайта с подразделами: |
Каталог | bitrix:catalog |
Cоздает раздел сайта с подразделами: |
Структура комплексного компонента повторяет структуру простого компонента, но в шаблонах есть сильное отличие. Вместо одной страницы шаблона 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
Вы можете задать для нее любое содержимое, как для простой публичной страницы, но требуется соблюдать несколько правил:
- На странице первым делом должен быть подключен файл /bitrix/modules/main/include/urlrewrite.php.
- На странице должен быть задан HTTP статус 404.
- На странице должна быть задана константа ERROR_404.
Обычно на этой странице располагается яркое понятное сообщение, что страница, которую ищет пользователь, удалена, и предложение перейти на другие страницы сайта. Чаще всего предлагается переход на главную, поиск или в каталог.
Практика
В этом видео:
- Страница 404.
- Компонент bitrix:news.
- Шаблон комплексного компонента news.
- Шаблоны простых компонентов в составе комплексного компонента.
- Поддержка ЧПУ, urlrewrite.php.
- Динамические страницы в меню, .menu_ext.php
Комплексные компоненты и ЧПУ
17 мин