Разработка на 1С-Битрикс Михаил Базаров
Блог-note

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

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

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

  • В свойстве новости 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С-Битрикс

Стоимость разработки сайта зависит от объёма и сложности проекта. Ниже приведены ориентировочные цены, как правило не выходят за обозначенные рамки. Срок разработки зависит от сложности проекта: как правило называю сроки с запасом.

Финальная стоимость и сроки разработки обговариваются на этапе обсуждения. Скачайте опросник на разработку, заполните как можно подробнее и вышлите удобным способом. После ознакомления смогу задать уточняющие вопросы и оценить проект.

Включено в стоимость разработки

В цену уже заложено всё, что нужно для легального и быстрого запуска. Доплачивать за базовые вещи не придётся.

  • Лицензия и модули

    Лицензия на «1С-Битрикс» нужной редакции, дополнительные модули и видео-инструкции по работе с готовым проектом.

  • Скорость и SEO

    Оптимизация кода и сервера под быструю загрузку, базовая SEO-оптимизация и добавление сайта в поисковые системы.

Блог-note

Заметки по 1С-Битрикс