241  /  382
Справочник

Отложенные функции

Просмотров: 97032
Дата последнего изменения: 10.11.2023
Роберт Басыров
Сложность урока:
3 уровень - средняя сложность. Необходимо внимание и немного подумать.
1
2
3
4
5
Недоступно в лицензиях:
Ограничений нет

Отложенные функции

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

Технология была создана в первую очередь для использования в компонентах, которые, как правило, выводятся в теле страницы, но при этом внутри них могут быть заданы заголовок страницы, добавлен пункт в навигационную цепочку, добавлена кнопка в панель управления и так далее. Отложенные функции нельзя использовать в файлах шаблона компонента: template.php и result_modifier.php (так как результаты их выполнения кешируются).

Внутри отложенной функции можно подключать компоненты, но при этом необходимо вручную подключать файлы CSS и js.

Примечание: Есть ряд новых функций, которые могут работать в условиях кеширования (SetViewTarget, EndViewTarget). Но такие функции новые, ещё не описаны в документации и их надо рассматривать скорее как исключение, чем как правило.

Алгоритм работы

  1. Любой исходящий поток из PHP скрипта буферизируется.
  2. Как только в коде встречается одна из следующих функций:

    или другая функция, обеспечивающая откладывание выполнения какой-либо функции, то:

    1. весь буферизированный до этого контент запоминается в очередном элементе стека A;
    2. в стек A добавляется пустой элемент, который в дальнейшем будет заполнен результатом выполнения отложенной функции;
    3. имя отложенной функции запоминается в стеке B;
    4. буфер очищается и буферизация снова включается.

    Таким образом, существует стек A, в котором находится весь контент страницы, разбитый на части. В этом же стеке есть пустые элементы, предназначенные для их дальнейшего заполнения результатами отложенных функций.

    Также существует стек B, в котором запоминаются имена и параметры отложенных функции в порядке их следования в коде.
  3. В конце страницы в служебной части эпилога выполняются следующие действия:
    1. все отложенные функции из стека B начинают выполняться одна за другой;
    2. результаты их выполнения вставляются в специально предназначенные для этого места в стек A;
    3. весь контент из стека A "склеивается" (конкатенируется) и выводится на экран.

Таким образом, технология позволяет фрагментировать весь контент страницы, разбивая его на части с помощью специальных функций, обеспечивающих временное откладывание выполнения других функций (отложенных функций). В конце страницы все отложенные функции выполняются одна за другой и результаты их выполнения вставляются в отведенные для этого места внутри фрагментированного контента страницы. Затем весь контент склеивается и отправляется браузеру посетителя сайта.

Внимание! При использовании этой технологии необходимо учитывать, что над результатами работы функций, обеспечивающих откладывание других функций, нельзя выполнять какие-либо действия.
Значение, возвращаемое отложенной функцией, не возвращается, а сразу выводится в месте вызова AddBufferContent, а всё, что выводится в отложенной функции, будет выведено до начала шаблона.

Пример кода, в котором отложенная функция не будет отрабатывать код в шаблоне как ожидается:

if (!$APPLICATION->GetTitle())
	echo "Стандартная страница";
else
	echo $APPLICATION->GetTitle();

А такой код будет работать:

$APPLICATION->AddBufferContent('ShowCondTitle');

function ShowCondTitle()
{
	global $APPLICATION;
if (!$APPLICATION->GetTitle())
	return "Стандартная страница";
else
	return $APPLICATION->GetTitle();
}

Ещё один пример

$page_title = $APPLICATION->GetPageProperty($title);
if (strlen($page_title)<=0) $page_title = "Заголовок страницы по умолчанию";
echo $page_title;

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

Пример:

<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("Старый заголовок");
?>
<?
global $APPLICATION;
$strTitle = $APPLICATION->GetTitle();
echo $strTitle." - Заголовок страницы

"; $APPLICATION->SetTitle('Новый заголовок'); ?> <?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>

На странице будет напечатано - Старый заголовок, а в браузере - Новый заголовок.

Задействованные группы функций

Имя функции обеспечивающей откладывание Выполнение какой функции откладываетсяДополнительные связанные функции
CMain::ShowTitle CMain::GetTitle CMain::SetTitle
CMain::ShowCSS CMain::GetCSS CMain::SetTemplateCSS
CMain::SetAdditionalCSS
CMain::ShowNavChain CMain::GetNavChain CMain::AddChainItem
CMain::ShowProperty CMain::GetProperty CMain::SetPageProperty
CMain::SetDirProperty
CMain::ShowMeta CMain::GetMeta CMain::SetPageProperty
CMain::SetDirProperty
CMain::ShowPanel CMain::GetPanel CMain::AddPanelButton

Технология позволяет создавать отложенные функции с помощью метода CMain::AddBufferContent.

Список ссылок по теме:

60
Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии