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

OnEndBufferContent

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

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

Параметры

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



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

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

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

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

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
0
Инна
Сообщение непромодерировано, возможны ошибки и неточности.
Подскажите как правильно производить замену:
Код
AddEventHandler("main", "OnEndBufferContent", "ChangeMyContent");
function ChangeMyContent(&$content)
{
   $search = array(
        '<a(.*?)href="/company/">О компании</a>'
    );
    $replace = array(
        '<a$1href="/new-link/">О компании</a>'
    );
    $content = preg_replace($search, $replace, $content);
}
При замене массива на:
Код
$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'
        );

Все работает, все замены отрабатываются, а при попытке заменить ссылки вылетает белый экран вместо сайта.
Подскажите как правильно заменить тег <a href="/company/">О компании</a> на <a href="/new-link/">О компании</a>
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);
   }
}
1
Дмитрий Ипатов
Метод из последнего сообщения работает не очень быстро лучше использовать данный метод:

Пока что убираем лишние пробелы и строки из 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);
    }
}
0
Дмитрий Ипатов
Код
// Удаляем лишние пробелы и пустые строки в 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-2019, «1С-Битрикс», 2019
Наверх