воскресенье, 19 января 2014 г.

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

В битриксе имеется функционал отложенных функций. В идеале он должен работать как: http://dev.1c-bitrix.ru/learning/course/?COURSE_ID=43&LESSON_ID=3489.

Но у меня почему-то так заставить его работать не получается. В очередной раз пытаясь понять как мне вывести код до того, как отработает компонент, генерящий этот код, с подсказки коллеги обнаружил следующие обертки над функционалом отложенных функций:
1. CMain::ShowViewContent($view_name) - функция, выводящая контент, который будет сгенерирован позже.
2. SetViewTarget($view_name) - функция, начинающая буферизацию контента в область с именем $view_name.
3. EndViewTarget() - функция, завершающая буферизацию контента в область с именем $view_name, указанную предыдущим вызовом setViewTarget.


Объединяя все эти функции получаем следующее:
Страница index.php:
<?php 
// какой-то код
$APPLICATION->ShowViewContent('delayed_output');
// еще какой-то код
$APPLICATION->IncludeComponent('namespace:component', '', array());
// и еще какой-то код
?>
В шаблоне template.php компонента namespace:component весь вывод буферизуем:
 <?php
$this->SetViewTarget('delayed_output');
echo 'This is HTML';
$this->EndViewTarget();
?>

В результате исполенния страницы получим вывод строки This is HTML до того как она была фактически сформирована компонентом. Что собственно и требовалось.
Замечания:
1. Испробовано только на bitrix12, на bitrix14 надо проверять.
2. Метода получения выводимого контента не обнаружено. То есть нельзя получить текст This is HTML и присвоить его переменной (даже с помощью ob-функций)

То же самое в мануале битрикс.

4 комментария:

  1. Еще вариант:
    $APPLICATION->AddViewContent('delayed_output', 'This is HTML');
    Подсмотрено в блоге Светланы Мелеховой ("Битрикс. Зависимые по содержанию блоки": http://cptpiper.blogspot.ru/2013/11/blog-post.html )

    ОтветитьУдалить
    Ответы
    1. Помню как-то тоже пытался использовать, но видимо тоже недопонял принцип работы, выходило не то что надо)

      Удалить