Вывести контент в произвольную точку шаблона

Урок 7 из 8

30 мин

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

Обычный процесс работы с данными в «1С-Битрикс: Управление сайтом» последователен: в рамках компонента они извлекаются из БД, далее в шаблоне компонента выводятся как html.

Нарушить обычную последовательность «выбор данных-вывод данных» помогает технология отложенных функций. Она позволяет компонентам, расположенным в теле страницы, повлиять, например, на мета-теги в head-части той же страницы. То есть данные будут выведены выше по коду, чем были получены из БД.

Понимание этого механизма основано на буферизации вывода PHP и функциях семейства ob_*:

  1. В начале страницы включается буфер вывода.
  2. Весь выводимый через echo html попадает в буфер, а не на экран.
  3. Встречая методы отложенного вывода CMain::Show*, «1С-Битрикс: Управление сайтом» воспринимает их как макрос (принцип, как в почтовой системе, о которой мы говорили ранее) со смыслом «тут нужно будет вывести отложенную переменную X».
  4. По ходу выполнения страницы «отложенные» переменные меняются методами CMain::Set*.
  5. В конце страницы буфер отключается.
  6. «Макросы» в местах вызова CMain::Show-методов заменяются на реально вычисленные значения. Там, где была пометка «тут нужно будет вывести переменную X» будет вставлено актуальное значение отложенной переменной X.
  7. Итоговая строка с 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 мин