О сниппетах битрикс есть много статей, они представляют собой вставку фрагмента 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 ?>
В результате на странице выводится баннер с проверкой активности из базы.
Оставить комментарий