Вывести производителей на сайте с отбором его товаров из каталога

RSS
Вывести производителей на сайте с отбором его товаров из каталога
 
Вывести производителей  на сайте с отбором его товаров из каталога

Достаточно частая задачка для каталога или интернет-магазина: вывести список производителей с подробными описаниями, а так же в подробном описании производителя или бренда вывести все товары, у которых заполнено свойство "Производитель." Расскажу как это сделать
 
Здравствуйте!
Я вывел на сайте список производителей с помощью компонента новостей (bitrix:news), сделал чтобы при переходе по производителю передавался параметр (ID) и когда пользователь переходит на страницу с списком товаров, отображались товары только этого производителя. На ней использовал компонент новость детально (bitrix:news.detail) для отображения картинки, названия и описания производителя, а также компонент элементы раздела (bitrix:catalog.section) для вывода товара. Все работает отлично, но нужно еще кое-что, и я пока не представляю как это сделать...

ВОПРОС: Подскажите пожалуйста, как после описания категории вывести список разделов первого уровня к которым относится товар этого производителя, и еще чтобы при переходе открывалась категория с отсортированным товаром по этому производителю (может как-то передать в фильтр параметр производителя, при переходе).
 
Вопрос решен! Напишу как я это сделал, может кому пригодится. А также возможно кто-то укажет на ошибки или предложит более простой/лучший способ.
Все что описывал выше так и оставил, для вывода списка категорий использовал компонент структура разделов (catalog.section.list), он конечно не смог мне помочь вытянуть только те разделы в которых есть товар конкретного производителя но я смог вывести только первый уровень разделов.
А при формировании ссылки, я просто передал параметр фильтра и все заработало.
Код
?vendor=".$_REQUEST["ELEMENT_ID"]
Била проблема с формированием ссылки, вместо "/" (слеша) показывалось "%2F", так-как это проблема связаная с кодировкой нестал искать корень и  решил эту проблему так:
- создал копию шаблона вывода разделов ( всеравно нужно было подогнать дизайн
- и потом где выводится ссылка сделал так
Код
preg_replace('|%2F|', '/', $arSection["SECTION_PAGE_URL"])
Если все-же есть способ проще, удобнее или который сможет вывести только нужные разделы с радостью выслушаю.
 
Михаил, доброго времени суток.

Пробую вывести как написано, но возникла проблема, в отфильтрованном товаре ссылка на детальный просмотр товара формируется не правильно должно быть /catalog/fot-men/3213, а формирует /catalog//3213. Но стоит разместить компонент catalog.section отдельно от компонента новости все работает как надо. Подскажи пожалуйста в чем может быть проблема?
 
Цитата
Антон. К написал:
Михаил, доброго времени суток.

Пробую вывести как написано, но возникла проблема, в отфильтрованном товаре ссылка на детальный просмотр товара формируется не правильно должно быть /catalog/fot-men/3213, а формирует /catalog//3213. Но стоит разместить компонент catalog.section отдельно от компонента новости все работает как надо. Подскажи пожалуйста в чем может быть проблема?
Собственно, правильно настроить ЧПУ в компонентах и в инфоблоке. Везде должно быть одинаково
 
Михаил Базаров,  Спасибо, оказалось что 1С выгружено не правильно из-за чего не правильно строились адреса у некоторых товаров.
 
Доброго времени суток.
Михаил, подскажите пожалуйста, как быть если в свойствах товара бренды указаны не строкой, а справочником? Не получается правильно написать запрос.

$GLOBALS['arrBrandName'] = array("PROPERTY_ИД_VALUE"=>$brandName); - это для строкового параметра, а как сделать для справочника?  У меня соответственно выводятся все товары.

Заранее благодарен.
 
Цитата
Mechka написал:
Доброго времени суток.
Михаил, подскажите пожалуйста, как быть если в свойствах товара бренды указаны не строкой, а справочником? Не получается правильно написать запрос.

$GLOBALS['arrBrandName'] = array("PROPERTY_ИД_VALUE"=>$brandName); - это для строкового параметра, а как сделать для справочника?  У меня соответственно выводятся все товары.

Заранее благодарен.
Нужно сделать запрос к highload инфоблоку, загнать имя производителя в переменную, дальше просто сравнить на тождественность с именем бренда ( If (... === ....) )
 
Приветствую!
Михаил, спасибо за интересное видео, но есть следующая задача надеюсь сможешь помочь)
Необходимо вывести страницу брендов, чтобы отображались не только элементы каталога, но и список всех доступных разделов в которых есть отсортированные элементы.
ЧПУ необходимо настроить для разделов brands/section1/, brands/section2/ и тд. Для элементов ЧПУ catalog/section/element/
Есть решение, какие компоненты использовать? и структуру ЧПУ?

Заранее спасибо!
 
Цитата
Viktor26rus написал:
Приветствую!
Михаил, спасибо за интересное видео, но есть следующая задача надеюсь сможешь помочь)
Необходимо вывести страницу брендов, чтобы отображались не только элементы каталога, но и список всех доступных разделов в которых есть отсортированные элементы.
ЧПУ необходимо настроить для разделов brands/section1/, brands/section2/ и тд. Для элементов ЧПУ catalog/section/element/
Есть решение, какие компоненты использовать? и структуру ЧПУ?

Заранее спасибо!
Такое, можно сделать только добавив бренды в каталог (или через свойство привязки к элементам).

То есть, бренды должны стать разделами каталога- это самое идеальное, меньше манипуляций делать дальше.
 
Цитата
Михаил Базаров пишет:
Цитата
Mechka написал:
Доброго времени суток.
Михаил, подскажите пожалуйста, как быть если в свойствах товара бренды указаны не строкой, а справочником? Не получается правильно написать запрос.

$GLOBALS['arrBrandName'] = array("PROPERTY_ИД_VALUE"=>$brandName); - это для строкового параметра, а как сделать для справочника? У меня соответственно выводятся все товары.

Заранее благодарен.
Нужно сделать запрос к highload инфоблоку, загнать имя производителя в переменную, дальше просто сравнить на тождественность с именем бренда ( If (... === ....) )
Присоединяюсь к вопросу, как этот запрос сделать?
 
А можно ли так сделать если из 1С приходит на сайт свойство Производитель с кодом CML2_MANUFACTURER только с типом Список?
 
Цитата
Сергей Жуланов написал:
А можно ли так сделать если из 1С приходит на сайт свойство Производитель с кодом CML2_MANUFACTURER только с типом  Список ?
Это штатный реквизит, его по моему нельзя изменить в интерфейсе 1С-ки. Только лезть в конфигуратор и там менять тип свойства, в обработчике который формирует xml-ку
 
Михаил Базаров, Здравствуйте, а возможно ли скрывать производителя с общего списка, если к примеру в данный момент товаров нет, или они неактивны?
 
Цитата
Antik написал:
Михаил Базаров , Здравствуйте, а возможно ли скрывать производителя с общего списка, если к примеру в данный момент товаров нет, или они неактивны?
Например, можно назначить счетчик товаров. Если количество равно нулю- то не выводить этого производителя.
 
Цитата
Андрей Фокин пишет:
Михаил, СПАСИТЕ))) Не получается фильтровать

<?
$brandName = $arResult["NAME"];
$GLOBALS['arrBrandName'] = array("PROPERTY_133_VALUE"=>$brandName);
?>
<?$APPLICATION->IncludeComponent(
"bitrix:catalog.section",
"DEVELOPERS",
Array(
           ...
"FILTER_NAME" => "arrBrandName",
"...
 ;)  
);?>
Вроде бы все правильно. Попробуйте для проверки, вписать бренд вручную

$GLOBALS['arrBrandName'] = array("PROPERTY_133_VALUE"=>"БРЕНД");
 
Заработало по
$GLOBALS['arrBrandName'] = array("PROPERTY_255_VALUE"=>"ТДСК" ;) ;
 
Как его собаку заставить работать по
$GLOBALS['arrBrandName'] = array("PROPERTY_133_VALUE"=>$brandName);
Достал уже))))
 
Михаил, простите, все работает! Плохо быть ЧАЙНИКОМ)))
 
Спасибо за проделанную работу и за то что делитель знаниями.
Как сделать так чтобы в списке брендов не выводились те у которых нет товаров, можно ли это автоматизировать?
 
Разобрался сам, может кому будет полезно:
Код
<? if (!empty($arResult['DISPLAY_PROPERTIES']['MANUFACTURER']))
                                          {                                          
                                             $name_brands = $arResult["PROPERTIES"]["MANUFACTURER"]["VALUE"];
                                             $links_brands= $arResult["PROPERTIES"]["MANUFACTURER"]["VALUE_XML_ID"];
                                             $rsItems = CIBlockElement::GetList(array(),array('IBLOCK_ID' =>'ид блока с брендами','NAME' => $name_brands),false,false,array('ID'));
                                             /*если для у этого бренда есть своя страница в брендах*/
                                             if ($arItem = $rsItems->GetNext())
                                             {
                                             ?>
                                                <dl class="product-item-detail-properties">
                                                <dt>Производитель</dt>
                                                   <dd>                                                   
                                                   <a href="https://сайт/brands/<? echo $links_brands;?>"><? echo $name_brands;?></a>
                                                   </dd>
                                                </dl>
                                             <?
                                             } 
                                             else
                                             {?><dl class="product-item-detail-properties">
                                                <dt>Производитель</dt>
                                                   <dd>
                                                   <? echo $name_brands;?>
                                                   </dd>
                                                </dl>
                                                
                                                <?
                                             }

                                          }?> 

в VALUE_XML_ID - я храню символьный код бренда (бренды выводятся с ЧПУ адресами)

проверяем задан ли производитель, затем проверяем есть у данного производителя страница с его товарами или нет, далее выводим ссылку или название бренда
Изменено: Михаил Базаров - 11.08.2023 14:20:50
 
Огромное спасибо за полезную информацию!

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


Код
<?$brandName = $arResult["NAME"];

$GLOBALS['arrBrandName'] = array("PROPERTY_ИД_VALUE"=>htmlspecialchars_decode($brandName, ENT_QUOTES));?>
 
Подскажите, как правильно записать условие, чтобы заголовок блока, который Вы обернули в h2 выводился только там, где нужно, т.е. при наличии записи ИД?
 
Добрый день. Михаил а как данном случае добавить вывод всех разделов для бренда? У меня задача: Бренд - Разделы бренда - Товары и, желательно, все на одной странице. При этом нужно выводить сначала разделы, а потом подразделы не уходя из карточки бренда. При этом товар должен отбираться согласно разделу. Пытался сделать по вашей схеме, но catalog.section.list в упор не видит фильтра. Пытался сделать через привязку к разделам, но ни как. Вывожу бренды через каталог, а в catalog.element добавляю ваш код. Элементы отлично отбираются, а вот с разделами беда. Выводятся все сразу.
Скрытый текст
Изменено: Михаил Базаров - 26.03.2020 12:44:14
 
Цитата
Александр написал:
Добрый день. Михаил а как данном случае добавить вывод всех разделов для бренда? У меня задача: Бренд - Разделы бренда - Товары и, желательно, все на одной странице. При этом нужно выводить сначала разделы, а потом подразделы не уходя из карточки бренда. При этом товар должен отбираться согласно разделу. Пытался сделать по вашей схеме, но catalog.section.list в упор не видит фильтра. Пытался сделать через привязку к разделам, но ни как. Вывожу бренды через каталог, а в catalog.element добавляю ваш код. Элементы отлично отбираются, а вот с разделами беда. Выводятся все сразу.
    Скрытый текст        
Код
 
Как минимум это не очень правильно, выводить компоненты внутри шаблона другого компонента- скорее всего возникнут проблемы с шешированием. Используйте component_epilog.php

По вопросу: Если правильно понял, нужно отбирать в сatalog.section.list разделы (с его подразделами), названия которых совпадают с названием бренда
(хранится в $brandsName)?

Быстрый (но не очень оптимизированный, в плане скорости) вариант:
В шаблоне сatalog.section.list проверять первый уровень раздела на совпадение названия:
Код
<?if (($arSection['DEPT_LEVEL']) =='1') && (($arSection['NAME']) === $brandsName){?>
 Ссылка и название раздела или что там нужно вывести.
<?}?>

Идеальный вариант, доработать компонент сatalog.section.list сделав, по сути, тоже самое но выкинув не нужные запросы из компонента, что бы работал быстро и через настройки компонента.
Изменено: Михаил Базаров - 26.03.2020 13:02:46
 
Цитата
Михаил Базаров написал:
По вопросу: Если правильно понял, нужно отбирать в сatalog.section.list разделы (с его подразделами), названия которых совпадают с названием бренда (хранится в $brandsName)?
Названия не совпадают. Есть свойство "привязка  к элементам" где привязываю раздел к бренду UF_RAZDEL (Может надо по другому?)
Нужно отбирать в сatalog.section.list разделы (с его подразделами) которые относятся к данному бренду, а потом передавать этот раздел в catalog.section чтоб фильтровал по бренду и разделу товары
 
Подсмотрел как решается моя проблема в шаблонах альфы. Выводится компонент новостей, а в него засовывают catalog. Возможно за место новостей тоже используют catalog.Получается хорошее решение для страницы брендов. Выводится сразу описание бренда, разделы и товары бренда. И, самое главное, можно задать мету для страниц каталога типа Все товары Васи - Одежда от Васи - Носки от Васи. Но вот загвоздка - ни как не пойму как catalog заставить фильтровать по бренду. Компонент catalog вставляю в component_epilog. Михаил может сможете помочь?
 
Александр, такая же беда с брендами на решении от альфы. Не могу настроить фильтр по свойству, чтобы выводились и разделы и товары в которых есть товары с этими брендами.  Вы нашли какое-то решение?  
 
Цитата
Александр пишет:
Подсмотрел как решается моя проблема в шаблонах альфы. Выводится компонент новостей, а в него засовывают catalog. Возможно за место новостей тоже используют catalog.Получается хорошее решение для страницы брендов. Выводится сразу описание бренда, разделы и товары бренда. И, самое главное, можно задать мету для страниц каталога типа Все товары Васи - Одежда от Васи - Носки от Васи. Но вот загвоздка - ни как не пойму как catalog заставить фильтровать по бренду. Компонент catalog вставляю в component_epilog. Михаил может сможете помочь?
Собственно, в самой заметке и ответ  :)  Отфильтровать их по свойству бренда, который возьмется из названия "Новости"
 
Подскажите пожалуйста, а как настроить умный фильтр на странице производителя? У меня перед выводом товаров производителя стоит умный фильтр, но в свойствах отображаются все бренды, хотя они на этой странице не нужны. Плюс попадают свойства с пустыми значениями. Как-то можно настроить умный фильтр, чтобы в зависимости от производителя пропадали пустые свойства из умного фильтра?

Так фильтруется каталог по бренду:
Код
$brandName = $arResult["NAME"];

global $arrFilterBrand;
$arrFilterBrand = Array("PROPERTY_BRAND" => $arResult["ID"]);
?>
Так умный фильтр:
Код
<?$APPLICATION->IncludeComponent(
   "bitrix:catalog.smart.filter",
   Array(
      "CACHE_GROUPS" => "Y",
      "CACHE_TIME" => "36000000",
      "CACHE_TYPE" => "A",
      "CONVERT_CURRENCY" => "N",
      "DISPLAY_ELEMENT_COUNT" => "Y",
      "FILTER_NAME" => "arrFilterBrand",
      "FILTER_VIEW_MODE" => "vertical",
      "HIDE_NOT_AVAILABLE" => "Y",
      "IBLOCK_ID" => "20",
      "PAGER_PARAMS_NAME" => "arrPager",
      "PREFILTER_NAME" => "smartPreFilter",
      "PRICE_CODE" => array(),
      "SAVE_IN_SESSION" => "N",
      "SECTION_CODE" => "",
      "SECTION_DESCRIPTION" => "-",
      "SECTION_ID" => $_REQUEST["SECTION_ID"],
      "SECTION_TITLE" => "-",
      "SEF_MODE" => "N",
      "TEMPLATE_THEME" => "blue",
      "XML_EXPORT" => "N"
   )
);?>
Так настроен вывод элементов:
Код
<?$APPLICATION->IncludeComponent(
   "bitrix:catalog.section",
   Array(
      "FILTER_NAME" => "arrFilterBrand",
...

 
Нужно в умный фильтр сразу передать производителя. То есть, что-бы текущий производитель был выбран, в нем, сразу- при загрузке страницы.
Можно получить ID значения свойства с производителем и js-ом кликнуть по нужному чекбоксу или выпадающему списку.
Изменено: Михаил Базаров - 10.12.2020 04:10:52
 
Он уже передан в умном фильтре. В catalog.filter и smart.filter записано "FILTER_NAME" => "arrFilterBrand". Фильтр работает с товарами производителя.  Внутри фильтра остаются пустые свойства. Например, есть в каталоге 100 товаров,  50 товаров синих, 50 товаров зеленых. Перехожу на страницу конкретного производителя, в нем остается 50 синих товаров, но в умном фильтре можно выбрать синие и зеленые. Я хочу чтобы не было свойства "зеленые".  Фильтр показывает все возможные свойства, какие есть.  
 
А реально ли сделать чтобы на странице с брэндами отображался товар (Где свойство фильтруется с типом строка или список), и на детальной странице карточки товара отобразить брэнд из другого инфоблока (Где свойство всегда с типом привязки к элементам инфоблока) и чтобы это все с 1С взаимодействовало автоматически?
Цитата
Старый способ

Ранее, я уже писал заметку о том как реализовать данный функционал, посмотреть можно тут: Отсортировать элементы в Битрикс по свойству привязка к разделам


Старый способ вроде более подходит внешне, но насколько я понимаю, он не выгружается из 1С.
Может я ошибаюсь, не подскажите, как решить данную задачу?  
 
Цитата
s.rudko@100systems.com Rudko написал:
А реально ли сделать чтобы на странице с брэндами отображался товар (Где свойство фильтруется с типом строка или список), и на детальной странице карточки товара отобразить брэнд из другого инфоблока (Где свойство всегда с типом привязки к элементам инфоблока) и чтобы это все с 1С взаимодействовало автоматически?
Если правильно понял вопрос:

У вас есть инфоблок с каталогом, в котором есть свойство "Бренд", в нем указан производитель (не суть важно, строкой или прявязкой).
Есть инфоблок с брендами, где бренды это элементы и их названия один в один как в элементах каталога.

Что бы на странице бренда вывести все товары, в которых указан этот бренд использовали фильтр
Код
$GLOBALS['arrFilterBrand'] = array('PROPERTY_ИД_СВОЙСТВА_С_БРЕНДОМ_VALUE' => $arResult["NAME"]);

$APPLICATION->IncludeComponent(
   "bitrix:catalog.section", 
   .....
      "FILTER_NAME" => "arrFilterBrand",
   .....
);

Теперь надо, в элементе каталога сделать ссылку на бренд- что бы выводился в нем не зависимо от 1С
В карточке, в нужном месте
Код
$brandData = CIBlockElement::GetList(
array("ID" => "ASC"),
   array(
      "IBLOCK_ID" => "14", 
      "NAME" => $arResult['PROPERTIES']['СВОЙСТВО_С_НАЗВАНИЕМ_БРЕНДА']['VALUE']
      ),
   false,false,
   array(
       'NAME',
       'DETAIL_PICTURE',
       'CODE'
   )
);
while ($arFieldsBr = $brandData->Fetch()) {
    $logoPath = CFile::GetPath($arFieldsBr["DETAIL_PICTURE"]);
?>
   Бренд: <?=$arFieldsBr['NAME']?>
   <a href="/brands/<?= $arFieldsBr['CODE'] ?>.php">
   <img src="<?= $logoPath ?>"/>
   </a>
<?
}

В итоге перелинковали бренды и карточки каталога между собой. Не зависимо от 1С.
Главное, что бы название бренда было написано один в один и в элементе каталога (в свойстве) и в названии бренда в инфоблоке с брендами.
Изменено: Михаил Базаров - 15.04.2021 22:23:07
 
Я нашел место откуда выводится БРЭНД на детальную страницу товара. Вставил туда код, но он не сработал(
Я хотел задать вопрос, может я не верно понимаю. Я пытаюсь подтянуть прилинкованый БРЭНД по названию из другого инфоблока где БРЭНД - это элемент.
Код
array("ID" => "ASC"),
   array(
      "IBLOCK_ID" => "14", 
      "NAME" => $arResult['PROPERTIES']['СВОЙСТВО_С_НАЗВАНИЕМ_БРЕНДА']['VALUE']
      ),
Здесь в коде я указываю инфоблок каталога товаров, потому, что у инфоблока где БРЭНД - это элемент, нет свойств вообще. Поэтому я не могу указать свойство с названием. Делаю логичный вывод, что здесь указывается инфоблок каталога товаров.

Вопрос: а где указывается инфоблок где БРЭНД - это элемент, чтобы код понимал откуда ему взять элемент БРЭНДА?

 
 
Цитата
s.rudko@100systems.com Rudko написал:
Вопрос: а где указывается инфоблок где БРЭНД - это элемент, чтобы код понимал откуда ему взять элемент БРЭНДА?
В "IBLOCK_ID" указываете id инфоблока с брендами. Далее он находится по совпадению названия бренда из свойства товара (каталога) по "NAME"
 
Доброго времени суток, фильтрует если прописать бренд в ручную, в чем может быть проблема?
$GLOBALS['arrBrandName'] = array("PROPERTY_133_VALUE"=>"Бренд" ;
 
Цитата
Гость написал:
Доброго времени суток, фильтрует если прописать бренд в ручную, в чем может быть проблема?
$GLOBALS['arrBrandName'] = array("PROPERTY_133_VALUE"=>"Бренд" ;

Скорее всего, в названии бренда. Проверка идет по строгому совпадению названия.
 
Михаил скажи вот мой вызов товаров бренда как описано в уроке и чуть выше я вызвал умный фильтр. Все отображается хорошо, но фильтр по какой то причине просто не хочет фильтровать. В чем может быть причина?

Скрытый текст
Изменено: Михаил Базаров - 02.08.2022 22:46:01
 
В фильтре не указан раздел, из которого он должен брать параметры.
Нужно корректно указать SECTION_ID или SECTION_CODE
распечатай массив из  catalog.section что бы узнать точно.
 
Напрямую $arResult[] нельзя передать в component_epilog.php, нужно пробрасывать их из кэшируемой области (в result_modifier.php) так:
Код
$this->__component->SetResultCacheKeys(['PARAM']);
 
Можно, просто не все.
Как минимум ['NAME'] и ['ID'] там уже есть.
А вот если чего-то не хватает (например свойств) но очень надо - да, можно использовать:
Код
$cp = $this->__component; // объект компонента
if (is_object($cp)) {
    // в arResult component_epilog передадим все отображаемые свойства
    $cp->SetResultCacheKeys(array(
            'DISPLAY_PROPERTIES'
        )
    );
}
Изменено: Михаил Базаров - 12.08.2023 09:04:56
 
Есть минус, пагинация сломается, работать не будет, как мне кажется. По крайней мере, я не смог починить.
 
Здравствуйте, все делал как вы, добавил catalog.section и что он по итогу выводит:
ни изображений, ни цен, ни возможность добавить в корзину и указать количество
Изменено: Михаил Базаров - 03.12.2023 09:52:45
 
Это у вас не правильно настроенный или недоверстанный шаблон списка разделов. Выведете его без фильтрации, полностью настройте а потом уже можно добавить фильтры
 
В этом и проблема, я делал пока без фильтрации, полный вывод товаров, копировал этот же шаблон в другие места, не относящиеся к новостям- все показывает корректно. Новейший битрикс, php 8.2, параметр со старой совместимостью включен
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
Загрузить файлы
 
Поблагодарить и поддержать:
Или подписаться на boosty канал: Видео на Ютубе