В 1С-Битрикс компонент bitrix:news — это комплексный компонент, который изначально задуман для новостей, но благодаря гибкой архитектуре может быть кастомизирован для вывода любых сущностей, включая бренды.
Ниже — пошаговая инструкция, как организовать страницу списка брендов и детальную страницу бренда с его товарами.
1. Структура данных
Создаётся два инфоблока:
- Инфоблок «Бренды» (например,
API_CODE = Brands) — каждый элемент это бренд. Поля: название, логотип (файл), описание, символьный код. - Инфоблок «Товары» (каталог,
API_CODE = Products) — у товаров создаётся свойство типа «Привязка к элементам» с кодомBRAND, которое ссылается на инфоблок «Бренды».
2. Страница списка брендов
Создаётся страница (например, /brands/index.php), на которой размещается комплексный компонент:
<?$APPLICATION->IncludeComponent(
"bitrix:news",
"brands",
array(
"IBLOCK_TYPE" => "content",
"IBLOCK_ID" => "ID_ИНФОБЛОКА_БРЕНДОВ",
"NEWS_COUNT" => "20",
"USE_SEARCH" => "N",
"USE_RSS" => "N",
"USE_RATING" => "N",
"USE_CATEGORIES" => "N",
"USE_REVIEW" => "N",
"USE_FILTER" => "N",
"SORT_BY1" => "SORT",
"SORT_ORDER1" => "ASC",
"SORT_BY2" => "NAME",
"SORT_ORDER2" => "ASC",
"CHECK_DATES" => "Y",
"SEF_MODE" => "Y",
"SEF_FOLDER" => "/brands/",
"SEF_URL_TEMPLATES" => array(
"news" => "",
"section" => "",
"detail" => "#ELEMENT_CODE#/",
),
"FIELD_CODE" => array("ID", "NAME", "PREVIEW_PICTURE", "DETAIL_TEXT"),
"PROPERTY_CODE" => array(),
"SET_TITLE" => "Y",
"SET_STATUS_404" => "Y",
"INCLUDE_IBLOCK_INTO_CHAIN" => "N",
"ADD_SECTIONS_CHAIN" => "N",
)
);?>
Шаблон .default копируется в /bitrix/templates/ваш_шаблон/components/bitrix/news/brands/. В файле list.php меняется вывод под карточки брендов.
3. Детальная страница бренда с товарами
В скопированном шаблоне detail.php вызывается стандартный bitrix:news.detail. Чтобы на этой странице вывести товары конкретного бренда, используется файл result_modifier.php шаблона детальной страницы.
Файл: /bitrix/templates/ваш_шаблон/components/bitrix/news/brands/bitrix/news.detail/.default/result_modifier.php
<?php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
\Bitrix\Main\Loader::includeModule('iblock');
\Bitrix\Main\Loader::includeModule('catalog');
$brandId = $arResult['ID'];
$brandName = $arResult['NAME'];
// ID инфоблока товаров
$productsIblockId = XX; // замените на ID инфоблока товаров
// Получаем товары, у которых свойство BRAND = ID текущего бренда
$arResult['BRAND_PRODUCTS'] = array();
$arFilter = array(
'IBLOCK_ID' => $productsIblockId,
'ACTIVE' => 'Y',
'PROPERTY_BRAND' => $brandId,
);
$arSelect = array('ID', 'NAME', 'PREVIEW_PICTURE', 'DETAIL_PAGE_URL', 'CATALOG_GROUP_1');
$res = CIBlockElement::GetList(
array('SORT' => 'ASC', 'NAME' => 'ASC'),
$arFilter,
false,
false, // можно передать array("nTopCount" => 50),
$arSelect
);
while ($ob = $res->GetNextElement())
{
$fields = $ob->GetFields();
// Получаем минимальную цену
$price = CCatalogProduct::GetOptimalPrice($fields['ID']);
$fields['PRICE'] = $price['PRICE']['PRICE'] ?? 0;
$fields['CURRENCY'] = $price['PRICE']['CURRENCY'] ?? 'RUB';
// Картинка товара
if ($fields['PREVIEW_PICTURE'])
{
$fields['PREVIEW_PICTURE_SRC'] = CFile::GetPath($fields['PREVIEW_PICTURE']);
}
$arResult['BRAND_PRODUCTS'][] = $fields;
}
Файл: template.php (детальной страницы) использует полученные данные:
<?if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();?>
<h1><?=$arResult['NAME']?></h1>
<?if ($arResult['DETAIL_PICTURE']):?>
<img src="<?=$arResult['DETAIL_PICTURE']['SRC']?>" alt="<?=$arResult['NAME']?>">
<?endif;?>
<?=$arResult['DETAIL_TEXT'];?>
<h3>Товары бренда <?=$arResult['NAME']?></h3>
<?if (!empty($arResult['BRAND_PRODUCTS'])):?>
<div class="brand-products">
<?foreach ($arResult['BRAND_PRODUCTS'] as $product):?>
<div class="product-item">
<?if ($product['PREVIEW_PICTURE_SRC']):?>
<img src="<?=$product['PREVIEW_PICTURE_SRC']?>" alt="<?=$product['NAME']?>">
<?endif;?>
<a href="<?=$product['DETAIL_PAGE_URL']?>">
<?=$product['NAME']?>
</a>
<?if ($product['PRICE'] > 0):?>
<span><?=number_format($product['PRICE'], 0, '.', ' ')?> <?=$product['CURRENCY']?></span>
<?endif;?>
</div>
<?endforeach;?>
</div>
<?else:?>
<p>Нет товаров этого бренда.</p>
<?endif;?>
4. Альтернативный подход: бренды как разделы
Если бренды — это разделы инфоблока товаров, можно использовать компонент bitrix:news в режиме вывода разделов. Для этого в настройках инфоблока «Бренды» включите разделы, а в элементе каждого раздела разместите описание бренда. На детальной странице раздела (через шаблон section.php) штатно выведутся все товары из этого раздела.
Параметры для такого режима:
"DISPLAY_PANEL" => "N",
"ADD_SECTIONS_CHAIN" => "Y",
"USE_PERMISSIONS" => "N",
"DISPLAY_TOP_PAGER" => "N",
"DISPLAY_BOTTOM_PAGER" => "Y",
"PAGER_TITLE" => "Товары",
"PAGER_SHOW_ALWAYS" => "N",
"PAGER_TEMPLATE" => ".default",
"CATALOG_ACTIVE" => "Y"
В этом случае используется стандартная механика компонента bitrix:news: страница со списком разделов — section.php, страница с элементами раздела — section.php с выводом элементов (товаров) через bitrix:news.list.
5. Важные замечания
- Не забудьте скопировать шаблоны компонента в папку шаблона сайта, иначе изменения потеряются при обновлении.
- Для кеширования используйте
$this->SetResultCacheKeys()вresult_modifier.php, если данные товаров должны попадать в кеш. - Если у товаров включён торговый каталог, для получения цен используйте
CCatalogProduct::GetOptimalPrice()илиCPrice::GetList(). - Для SEO настройте шаблоны URL в настройках инфоблока:
DETAIL_PAGE_URLдля брендов —/brands/#ELEMENT_CODE#/.