Документация для разработчиков
Темная тема

OnEndBufferContent

функция-обработчик(
	Frame::endBuffering
)

Вызывается при выводе буферизированного контента.

Параметры

Без параметров



Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
0
Валерий Чебан
Сообщение не промодерировано, возможны ошибки и неточности.
Цитата
Сергей Волков пишет:

Можно получать ошибку вида:
Код
   Fatal   error : ob_start(): Cannot use output buffering in output buffering display handlers in \bitrix\modules\main\lib\data\cache.php  on  line  392 При сочетании следующих условий:  Копировать  

Что для этой ошибки достаточно:
- Использование в событии OnEndBufferContent функционала сохранения кеша через \Bitrix\Main\Data\Cache
- Подключен только prolog_before.php

Обратите внимание, что в событии OnEndBufferContent нельзя использовать конструкции вида ob_start(), вызывающую ошибку при этом:
ob_start(): Cannot use output buffering in output buffering display handlers (0)

а следовательно в обработчике событий OnEndBufferContent не допускается использовать старый d0 класс CPHPCache, который вызывает ob_start() у себя под капотом.

Решение - использовать класс d7 \Bitrix\Main\Data\Cache с вызовом \Bitrix\Main\Data\Cache::noOutput() перед запуском \Bitrix\Main\Data\Cache::startDataCache()
3
Сергей Волков
Сообщение не промодерировано, возможны ошибки и неточности.
Можно получать ошибку вида:
Код
Fatal error: ob_start(): Cannot use output buffering in output buffering display handlers in \bitrix\modules\main\lib\data\cache.php on line 392При сочетании следующих условий:

Что для этой ошибки достаточно:
- Использование в событии OnEndBufferContent функционала сохранения кеша через \Bitrix\Main\Data\Cache
- Подключен только prolog_before.php
0
Алексей Попович
Понадобилось тут для СЕО при количестве выбранных параметров фильтрации каталога задавать тег
Код
<met a name="robots" content ="noindex,follow" />
Для этого в компоненте умного фильтра сделал проверку, сколько ж параметров фильтрации уже выбрано и, если более 3 - настроил вывод (в component_epilog.php):
Код
$APPLICATION->AddHeadString('<met a name="robots" content ="noindex,follow" />',true);
Но столкнулся с тем, что где-то уже задан данный тег со значением index, follow. Попробовал переопределять свойства страницы и свойства директории (через SetPageProperty и SetDirProperty) - не помогло, поэтому решил принудительно перед выводом убирать ненужную строку, если есть нужная.
Итого тело функции завершения буферизации приняло вид:
Код
function OnEndBufferContentHandler(&$content){
   if(
      strpos($content,'<met a name="robots" content ="noindex,follow" />')!==false
   ){
      $content = preg_replace('/<met a(\s+)name="robots"(\s+)content="index,(\s*)follow"(\s+)\/>/si','', $content);
   }
}
2
Дмитрий Ипатов
Метод из последнего сообщения работает не очень быстро лучше использовать данный метод:

Пока что убираем лишние пробелы и строки из html вывода следующим кодом, добавить в init.php
Код
// Удаляем лишние пробелы перед выводом
AddEventHandler("main", "OnEndBufferContent", "ChangeMyContent");

function ChangeMyContent(&$content)
{
   $content = sanitize_output($content);
}

function sanitize_output($buffer)
{
   return preg_replace('~>\s*\n\s*<~', '><', $buffer);
}

P.S. В режиме правки отключаем сжатие html для админа
Код
function ChangeMyContent(&$content)
{
    global $USER;
    if(!$USER->IsAdmin()) {
   $content = sanitize_output($content);
    }
}
1
Дмитрий Ипатов
Код
// Удаляем лишние пробелы и пустые строки в html перед выводом пользователю
AddEventHandler("main", "OnEndBufferContent", "ChangeMyContent");

function ChangeMyContent(&$content)
{
   $content = sanitize_output($content);
}

function sanitize_output($buffer)
{
    $search = array(
        '/\>[^\S ]+/s', //strip whitespaces after tags, except space
        '/[^\S ]+\</s', //strip whitespaces before tags, except space
        '/(\s)+/s'  // shorten multiple whitespace sequences
        );
    $replace = array(
        '>',
        '<',
        '\\1'
        );

    $blocks = preg_split('/(<\/?pre[^>]*>)/', $buffer, null, PREG_SPLIT_DELIM_CAPTURE);
    $buffer = '';
    foreach($blocks as $i => $block)
    {
      if($i % 4 == 2)
        $buffer .= $block; //break out <pre>...</pre> with \n's
      else 
        $buffer .= preg_replace($search, $replace, $block);
    }

    return $buffer;
}
0
Сергей Покоев
Цитата
Сергей Покоев пишет:
Именно в таком виде все работает.
Например выведем в админке надпись:
На момент написания комментария все работало именно так. Сейчас обнаружил, что все же нужно передать по ссылке.
1
Сергей Покоев
Цитата
Evgenius пишет:
Видимо, в предыдущем комментарии переменная $content все-таки должна передаваться по ссылке.
Именно в таком виде все работает.
Например выведем в админке надпись:

Код
 AddEventHandler("main", "OnEndBufferContent", "OnEndBufferContentHandler");
function OnEndBufferContentHandler($content)
{
    //echo'<pre>';var_dump($content);echo'</pre>';die();
   if (defined("ADMIN_SECTION"))
        $content = str_replace('<td class="adm-workarea-wrap adm-workarea-wrap-top">', '<td class="adm-workarea-wrap adm-workarea-wrap-top"><div class="adm-menu-wrapper" style="overflow:hidden; min-width:300px;"><div style="color: #000">Текущее время '.date("d.m.Y H:i:s").'</div><br><div style="color: red">Это версия для Академии Битрикса!</div>', $content);
}
2
Evgenius
Видимо, в предыдущем комментарии переменная $content все-таки должна передаваться по ссылке.
4
Александр Черкасов
Вопрос: Возможно ли перед выводом страници пользователю, провести небольшую ее обработку? Есть ли какие-либо встроенные стредства?
Ответ:
Код
AddEventHandler("main", "OnEndBufferContent", "ChangeMyContent");
function ChangeMyContent($content)
{
   $content = str_replace("aaa", "bbb", $content);
}
Это в init.php например.
Источник: Vadim Dumbravanu в форуме
© «Битрикс», 2001-2024, «1С-Битрикс», 2024
Наверх