Принцип работы с буферизацией и макросом
- В свойстве новости
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']
);