Вставка произвольного свойства в текст новости через макрос

Просмотров: 282

Задача: дать контент-менеджерам возможность вставлять содержимое любого свойства прямо в текст статьи/новости. Расскажу на примере "привязка к элементам инфоблока", чтобы прямо в текст можно было вставлять связанные со статьей товары.

Скриншот как вставить макрос в контент

Принцип работы с буферизацией и макросом

  • В свойстве новости ATT_LINKED_GOODS хранятся ID связанных товаров
  • В тексте новости размещается макрос #LINKED_GOODS#
  • При выводе новости макрос заменяется на отрендеренный список товаров

Предполагаю, что свойство уже создано (штатными средствами 1С-Битрикс) и к новости привязаны товары каталога.

В шаблоне детальной новости news.detail создаём файл result_modifier.php с содержимым:

if (!empty($arResult['PROPERTIES']['ATT_LINKED_GOODS']['VALUE'])) {
    $GLOBALS['arrLinkedGoods'] = [
        '=ID' => $arResult['PROPERTIES']['ATT_LINKED_GOODS']['VALUE']
    ];

    ob_start();
    $APPLICATION->IncludeComponent(
        "bitrix:catalog.section",
        ".default",
        array(
            "IBLOCK_TYPE" => "catalog",
            "IBLOCK_ID" => "2",

            "FILTER_NAME" => "arrLinkedGoods",
            "CACHE_TYPE" => "N",
            "CACHE_TIME" => "0",
            "SHOW_ALL_WO_SECTION" => "Y",

            ... ОСТАЛЬНЫЕ НАСТРОЙКИ catalog.section ...
        ),
        false
    );
    $arrLinkedGoods = ob_get_clean();
    
    // Заменяем макрос в тексте новости
    if (strpos($arResult['DETAIL_TEXT'], '#LINKED_GOODS#') !== false) {
        $arResult['DETAIL_TEXT'] = str_replace(
                '#LINKED_GOODS#', 
                $linkedGoodsHtml, 
                $arResult['DETAIL_TEXT']
        );
    }
}

Проверяем, что к статье привязаны товары и используем их ID в фильтре над компонентом Элементы раздела для показа связанных товаров.

Начинаем буферизацию вывода с ob_start. Всё, что будет выведено далее (до ob_get_clean()), не попадёт на экран, а будет сохранено в буфер.

Завершаем буферизацию и получаем HTML-код отрендеренного списка товаров в переменную $arrLinkedGoods.

Функция str_replace() ищет в тексте новости макрос #LINKED_GOODS# и заменяет его на HTML-код из $arrLinkedGoods.

Результат сохраняется обратно в $arResult['DETAIL_TEXT'], который и используется в template.php. Теперь при выводе новости вместо макроса будет показан список товаров.

Возможные доработки

Таким же образом можно выводить в тело статьи/новости любое содержимое. Например: сформированный слайдер из свойства с типом "Файл" или любые списки. В общем любой заранее сформированный HTML-код.

Можно использовать массив макросов для всех буферизированных данных:

// массивы наполняем по мере буферизации
// привожу как пример готовых
$arrHtmlBuffers = [
    $linkedGoods,
    $slider,
    $list,
];
$arrMacroses = [
    '#LINKED_GOODS#',
    '#SLIDER#',
    '#LIST#',
];

$arResult['DETAIL_TEXT'] = str_replace(
    $arrMacroses,
    $arrHtmlBuffers,
    $arResult['DETAIL_TEXT']
);

Стоимость разработки на 1С-Битрикс:

Индивидуальная разработка магазина

от 400 000 руб. от 5-ти недель

Разработка магазина на 1С-Битрикс с нуля. Дизайн, сборка и оптимизация производительности под конкретный проект и требования. Реализация любого функционала без ограничений готовых решений.

Запуск сайта на готовом решении

от 100 000 руб. от 7-ми дней

Вариант для тех, кто не хочет тратить много средств на индивидуальный проект, и не имеет серьезных требований к сайту. Магазин, быстро запускается на базе одного из 200-та готовых решений.

Мобильное приложение

от 400 000 руб. от 1-го месяца

Разработка кроссплатформенного мобильного приложения, которое не уступает нативным решениям как в производительности, так и пользовательском опыте. Публикуется в AppStore, GooglePlay и RuStore

Сайт компании

от 250 000 руб. от 1-го месяца

Корпоративный сайт с информационными разделами, каталогом товаров или услуг. Включает формы обратной связи карточек каталога, любое количество статичных и динамичных разделов.

Инфресурс

от 300 000 руб. от 5-ти недель

Информационный ресурс любой сложности. Сайт для СМИ, городской портал или многопользовательская доска объявлений. Внутренние форумы, блоги- по необходимости.

Лечение сайтов от вирусов

от 30 000 руб. от 2-х дней

Выполню полную проверку сайта и окружения. В случае обнаружения вирусов проведу полный комплекс лечения проекта и закрытия лазеек.