Немного теории
Обычный процесс работы с данными в «1С-Битрикс: Управление сайтом» последователен: в рамках компонента они извлекаются из БД, далее в шаблоне компонента выводятся как html.
Нарушить обычную последовательность «выбор данных-вывод данных» помогает технология отложенных функций. Она позволяет компонентам, расположенным в теле страницы, повлиять, например, на мета-теги в head-части той же страницы. То есть данные будут выведены выше по коду, чем были получены из БД.
Понимание этого механизма основано на буферизации вывода PHP и функциях семейства ob_*:
- В начале страницы включается буфер вывода.
- Весь выводимый через echo html попадает в буфер, а не на экран.
- Встречая методы отложенного вывода
CMain::Show*
, «1С-Битрикс: Управление сайтом» воспринимает их как макрос (принцип, как в почтовой системе, о которой мы говорили ранее) со смыслом «тут нужно будет вывести отложенную переменную X». - По ходу выполнения страницы «отложенные» переменные меняются методами
CMain::Set*.
- В конце страницы буфер отключается.
- «Макросы» в местах вызова
CMain::Show
-методов заменяются на реально вычисленные значения. Там, где была пометка «тут нужно будет вывести переменную X» будет вставлено актуальное значение отложенной переменной X. - Итоговая строка с html передается в браузер.
Таким образом, можно вывести контент в произвольной точке шаблона, независимо от того, в
какой момент времени при обработке запроса этот контент был подготовлен. Подставлен он будет
по окончании обработки страницы. Из этого правила есть исключение: выводить контент через
CMain::Show
-метод нельзя в кэшируемой области, т.е. в шаблоне компонента.
Самые популярные отложенные методы:
-
CMain::ShowTitle
— выводит h1 или title страницы, зависит от аргументов. -
CMain::ShowHead
— выводит все мета-теги страницы в областиhead
, обертка надShowMeta, ShowLink, ShowCSS, ShowHeadStrings, ShowHeadScripts.
-
CMain::ShowProperty
— выводит именованное свойство страницы или раздела. -
CMain::ShowViewContent
— выводит именованный пользовательский контент.
У Show-методов есть связанные с ним Get- и Set-методы. С помощью Set-метода разработчик может обновить текущее значение отложенных данных, с помощью Get — получить текущее значение этих данных.
Может показаться, что между следующими строками нет разницы.
CMain::ShowTitle()
.echo CMain::GetTitle()
.
Но они не равноценны. Конструкция вида echo+Get встраивается в обычный вывод страницы и не воспринимается системой как макрос, который позже надо заменить. Поясним на примере кода с комментариями.
Комментарий | Код страницы | Вывод |
---|---|---|
Отложенная переменная title запоминает значение “Новости: ?” | $APPLICATION->setTitle("Новости: ?"); | |
Выводится текущее значение отложенной переменной | echo $APPLICATION->getTitle(); | “Новости: ?” (сразу попало в поток вывода) |
Область превращается в макрос, куда будет подставлено значение отложенной переменной в конце обработки страницы | $APPLICATION->showTitle(); | “Новости: 5” (подставлено в конце страницы) |
Вычисляется количество новостей, например 5 | ||
Отложенная переменная title запоминает значение “Новости: 5” | $APPLICATION->setTitle("Новости: $count"); | |
Выводится текущее значение отложенной переменной | echo $APPLICATION->getTitle(); | “Новости: 5”
(сразу попало в поток вывода) |
Область превращается в макрос, куда будет подставлено значение отложенной переменной в конце обработки страницы | $APPLICATION->showTitle(); | “Новости: 5” (подставлено в конце страницы) |
У всех Show-методов есть определенное назначение и нужно хорошо представлять, чем
пользоваться в каждой конкретной ситуации. В большинстве случаев назначение очевидно из
названия и документации, путаница может возникнуть только между CMain::ShowProperty
и
CMain::ShowViewContent
.
CMain::ShowProperty
, CMain::GetProperty
, CMain::SetPageProperty
и CMain::SetDirProperty
используются для коротких свойств, которые желательно наследовать от родительских разделов.
Обычно эти свойства не выводятся напрямую на экран пользователю. Это могут быть экзотические
мета-теги (например, Open Graph).
CMain::ShowViewContent
используется для вывода в произвольной точке страницы целых блоков
верстки.
У CMain::ShowViewContent
нет Get или Set-пары, как у прочих методов, но есть
CMain::AddViewContent
и CBitrixComponentTemplate::SetViewTarget
. Подробнее о них вы можете
узнать в документации и в практической части урока.
Практика
В этом уроке рассмотрим способы изменения контента в произвольной точке шаблона. Представим, что находясь на детальной странице новости нам нужно, чтобы рядом с заголовком страницы выводилась дата начала ее активности.
Вывести контент. Пример 1
8 мин
Следующий пример будет заключаться в том, чтобы выводить в левом блоке шаблона внутренних страниц сайта товар, связанный с текущей новостью.
Для этого мы предварительно создали в инфоблоке Новости новое свойство “Связанный товар” типа привязки к элементам инфоблока.
Вывести контент. Пример 2
11 мин
Рассмотрим еще один способ модифицировать итоговый контент загружаемой страницы сайта с помощью OnEndBufferContent.
Вывести контент. Пример 3
5 мин