Buffering. Deferred Functions - uniqcle/Bitrix GitHub Wiki

Buffering

Буферизация в PHP

Простой вариант

ob_start(); 
//Запись в буффер
echo '777'; 
//Получение из буффера
$content = ob_get_contents(); 
//Очистили буффер
ob_clean(); 

echo '2222';
//Вывод из буффера
echo $content; 

Буферизация. Простой вариант с очисткой буффера

ob_start(); 
//Запись в буффер
echo '777'; 
//Запись в переменную и сразу очистка буффера
$content = ob_get_clean();

echo '2222';

echo $content; 

Событие OnEndBufferContent

Вызывается при выводе буферизированного контента. Код можно размещать как init.php так и в component_epilog.php

AddEventHandler("main", "OnEndBufferContent", array("MyHandlers", "OnEndBufferContentHandler"));

class MyHandlers
{
    ...
    function OnEndBufferContentHandler(&$content){
        $content = str_replace("Тренды сезона", "Интернет магазин", $content);
    }
}

D7

\Bitrix\Main\EventManager::getInstance()->addEventHandler("main", "OnEndBufferContent", "OnEndBufferContentHandler");

function OnEndBufferContentHandler (&$content) {
    $content = str_replace("Тренды сезона", "Интернет магазин D7", $content);
}

Deferred Functions

Отложенная функция просто ставит "метку" в HTML, которая дальше по коду может быть заменена на нужное значение.

Установка и получение

CMain::SetTitle("value");                // Работает в #WORK_AREA# и в footer
CMain::ShowProperty("prop");             //Ничего не возвращает, ставит метку в html
CMain::SetPageProperty("prop", "value"); // Говорит системе, что поставить вместо метки
CMain::GetProperty("prop");              // Возвращает значение, установленное Set

Пример

    $APPLICATION->SetPageProperty("title", "Мой заголовок");
    <meta name = "mymeta" content = "<?php $APPLICATION->ShowProperty("mymeta_prop"); ?>">
    ...
    $APPLICATION->SetPageProperty("mymeta_prop", "Мой текст");
    $prop = $APPLICATION->GetProperty("mymeta_prop");
    echo $prop;

AddBufferContent

//В init.php
class Buffering{

    public function myFunc($params){

        if($params) {
            echo 'function myFunc, class myClass. params - '.$params;
        }
        else {
            return; //это первый вызов на странице с false
        }

    }
}
// В шаблоне
$params = 'text';
$APPLICATION->AddBufferContent(Array('Buffering', "myFunc"), $params);

Без использования класса

// В init.php
function componentHeader($text)
{
	global $APPLICATION;
	$arParams = $APPLICATION->GetPageProperty('PARAMS');
	if(is_array($arParams))
	{
		ob_start();
			$APPLICATION->IncludeComponent('demo:test', '', $arParams);
			$contentTime = ob_get_contents();
		ob_end_clean();
		return $contentTime;
	}
}

// В header
$APPLICATION->AddBufferContent(«componentHeader»);

AddViewContent/ShowViewContent

ShowViewContent

//Где нужно вывести
$APPLICATION->ShowViewContent('mycontent');

// В шаблоне
<?$this->SetViewTarget("mycontent"); //дальше контент который буферизируется ?> 
<div class="test">test</div> 
<?$this->EndViewTarget();//конец буферизации?>

Для того, чтобы воспользоваться конструкцией $this->SetViewTarget из файла component_epilog.php, воспользоваться просто переменной $this не удастся, т.к. в данном файле это уже объект класса CBitrixComponent (а не CBitrixComponentTemplate, как в файле template.php). В таком случае нужно использовать конструкцию вида:

<?$this->__template->SetViewTarget('mdf_title');?>
    same text here ...
<?$this->__template->EndViewTarget();?>

AddViewContent

ob_start(); 
//Запись в буффер
echo '777'; 

$content = ob_get_clean();
//Запись в переменную
$APPLICATION->AddViewContent('seven_variable', $content);

echo '111'; 
//Вывод переменной буфера
echo $APPLICATION->ShowViewContent('seven_variable'); 

Examples

⚠️ **GitHub.com Fallback** ⚠️