Buffering. Deferred Functions - uniqcle/Bitrix GitHub Wiki
Буферизация в 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;
Вызывается при выводе буферизированного контента. Код можно размещать как 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);
}
Отложенная функция просто ставит "метку" в 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;
//В 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»);
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');