Расширенное использование сниппетов 1С-Битрикс

Инструкция по расширенному использованию сниппетов в CMS 1С-Битрикс

О сниппетах битрикс есть много статей, они представляют собой вставку фрагмента html кода в текст визуального редактора, но что делать, если нужно вставить динамический блок?


Расскажу как я использую сниппеты для вставки в тексты статей динамических блоков, например форму записи на прием или список врачей оказывающих услугу.


Приведу пример как работает вставка акции в услугу.


Есть инфоблок с элементами



Нужно на соответствующих страницах добавлять баннеры с акцией.


Создать сниппет в админке



Вставляться будет не изображение баннера, а html-комментарий <!-- action_insert id="" -->. Сниппет добавляется в текст перетаскиванием мышкой.


 Двойным кликом открывается редактирование комментария и вставляется id баннера, который нужно вывести



Теперь при выводе статьи на странице выводится невидимый комментарий. Добавим его обработку.


В файле /local/php_interface/init.php подключаем файл events.php, в нем добавляем следующий код


AddEventHandler("main", "OnEndBufferContent", "AddBlocksToContent");
function AddBlocksToContent(&$content) {
    if (defined("ADMIN_SECTION")) {
        //код работает в админке и подменяет текст
        return false;
    }

    global $APPLICATION;
    $blocks = [
        'action_insert'         => '<!-- action_insert id="(.*)" -->',
        // тут другие сниппеты
    ];

    foreach ($blocks as $block => $tag) {
        if (preg_match_all('/' . $tag . '/', $content, $matches)) {
            $allMatches = $matches[1] ?? $matches[0];
            $htmls = [];

            foreach($allMatches as $index => $match) {
                ob_start();

                $params = [
                    'text' => $match,
                ];

                for($i = 1; $i <= sizeof($matches) - 1; $i++) {
                    $params['matches'][] = $matches[$i][$index];
                }

                $APPLICATION->IncludeFile('includes/inserts/' . $block . '.php', $params, []);

                $htmls[] = ob_get_clean();
            }
            $content = str_replace($matches[0], $htmls, $content);
        }
    }
}


Добавляется обработчик события OnEndBufferContent в который передается вся сгенерированная html страница &$content

Регулярным выражением на странице находится комментарий из сниппета и подменяется содержимым файла из includes/inserts/action_insert.php

В переменной $params['mathches'][0] добавляются значение найденного параметра "id"


<?php
$action = CIBlockElement::GetByID($matches[0])->Fetch();

if($matches[0] > 0 && $action && $action['ACTIVE'] == 'Y'): ?>
<div class="mb-5">
    <a href="#modal-1" class="open_modal">
        <img src="<?= CFile::GetPath($action['PREVIEW_PICTURE']) ?>" class="d-none d-md-block offer-before" alt="Специальное предложение">
        <img src="<?= CFile::GetPath($action['DETAIL_PICTURE']) ?>" class="d-block d-md-none offer-before" alt="Специальное предложение">
    </a>
</div>
<? endif ?>
 


В результате на странице выводится баннер с проверкой активности из базы.

Оставить комментарий

Комментарий отправится на проверку

Отправка
Спасибо! Комментарий добавлен
Копировать можно с указанием активной ссылки на эту страницу.
Давайте уважать труд других.