Меню

Ссылка на товары бренда в каталоге с автоматическим применением умного фильтра

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

Задача: вывести товары на странице бренда, выведенного компонентом "Новости", с ссылками на разделы в каталоге с применением умного фильтра.

Данная заметка продолжение к:
Отфильтровать товары бренда и вывести по разделам каталога
Вывести товары на странице бренда

Получение XML-id значения типа список через API Битрикс

Для создания ссылки на результат фильтрации умного фильтра, нам нужно получить XML-id значения с указанным брендом. Привожу весь код целиком, размещаем его в component_epilog.php шаблона детальной новости, пояснения ниже:

$iblockId = 4;
$brandName = $arResult['NAME'];

$GLOBALS['arrFilterBrand'] = array(
    "PROPERTY_PROIZVODITEL_VALUE" => $brandName
);

// Получаем XML ID значения свойства для ссылки на фильтр
$propertyRes = \Bitrix\Iblock\PropertyTable::getList([
    'filter' => [
        'IBLOCK_ID' => $iblockId,
        'CODE' => 'PROIZVODITEL'
    ],
    'select' => ['ID']
]);
if ($property = $propertyRes->fetch()) {
    // Получаем значения списка
    $enumRes = \Bitrix\Iblock\PropertyEnumerationTable::getList([
        'filter' => [
            'PROPERTY_ID' => $property['ID'],
            'VALUE' => $brandName
        ],
        'select' => [
            'ID',
            'XML_ID'
        ]
    ]);

    if ($enum = $enumRes->fetch()) {
        $propXmlId = $enum['XML_ID'];
    }
}
// end Получаем XML ID значения свойства для ссылки на фильтр


// Получаем ссылки на разделы с этим брендом
$listGoods = CIBlockElement::GetList(
    false,
    array(
        'IBLOCK_ID' => $iblockId,
        'PROPERTY_PROIZVODITEL_VALUE' => $brandName,
        'ACTIVE' => 'Y'
    ),
    false,
    false,
    array('ID')
);
while ($goods = $listGoods->Fetch()) {
    $ElementId = $goods['ID'];
    $db_groups = CIBlockElement::GetElementGroups(
        $ElementId,
        true,
    );
    while ($ar_group = $db_groups->GetNext()) {
        $arSections[$ar_group['ID']]['NAME'] = $ar_group['NAME'];
        $arSections[$ar_group['ID']]['URL'] = $ar_group['SECTION_PAGE_URL'] . 'find/proizvoditel-is-' . $propXmlId . '/apply/';
    }
}
// end Получаем ссылки на разделы с этим брендом

foreach ($arSections as $k => $arSection) { ?>
   <a href="<?= $arSection['URL'] ?>">
      <?= $arSection['NAME'] ?>
   </a>
<?}
$APPLICATION->IncludeComponent(
        "bitrix:catalog.section",
        "section",
        array(
          // Это компонент раздела выводящий все товары бренда
            "FILTER_NAME" => "arrFilterBrand",
        ),
        false
);?>

Для начала, в коде задаются необходимые переменные: ID инфоблока, содержащего товары, и название бренда, которое берется из газвания "Новости" $arResult['NAME']. Далее, создается глобальный фильтр $GLOBALS['arrFilterBrand'], чтобы в дальнейшем при выборке товаров учитывать производителя.

Затем идет получение XML-ID значения свойства "Производитель". Это нужно для того, чтобы корректно сформировать ссылки на страницы разделов каталога с примененным умным фильтром. Используя класс \Bitrix\Iblock\PropertyTable, сначала мы находим ID свойства "PROIZVODITEL" в инфоблоке. После этого, через \Bitrix\Iblock\PropertyEnumerationTable, по найденному ID свойства и имени бренда получаем XML-ID нужного значения. Этот XML-ID будет использован в ссылках на страницы с фильтрацией.

После получения XML-ID происходит выборка товаров, относящихся к данному бренду. Это делается с помощью метода CIBlockElement::GetList(), где фильтруются только активные товары по инфоблоку и значению свойства "Производитель". Для каждого найденного товара с помощью метода CIBlockElement::GetElementGroups() определяется, в каких разделах каталога этот товар находится.

На следующем этапе для каждого раздела, в котором присутствует товар данного бренда, формируется ссылка с фильтрацией по XML-ID производителя. Ссылки строятся на основе базового URL раздела каталога, добавляя в конец строки параметр фильтрации вида:
find/proizvoditel-is-..XML_ID../apply/.

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

Михаил Базаров 24.10.2024
Да, вместо старого CIBlockElement::GetList можно использовать новые методы ядра D7. Но для этого придется подключить несколько классов по работе со свойствами. Или использовать ORM инфоблока.
Все будет работать ощутитимо медленее, протестировано на большом каталоге.
Старый метод тут более производителен.

Стоимость и сроки разработки сайтов и приложений

Окончательная стоимость и сроки разработки сайта формируются после обсуждения деталей на этапе заказа. Как правило, они редко выходят за обозначенные ниже рамки.

Интернет магазин: разработка с нуля от 450 000 руб.
от 5-ти недель

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

Интернет-магазин на готовом решении от 60 000 руб.
от 7-ми дней

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

Мобильное приложение от 300 000 руб.
от 1-го месяца

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

Опросник на разработку. После ознакомления, задам уточняющие вопросы и оценю проект по стоимости и срокам разработки.