линия

Главная

понедельник, 22 апреля 2019 г.

Bitrix - как установить метку ХИТ для самых продаваемых товаров

Сие пост  на самом деле не несет особой пользы для джедаев и написан, скорее всего, ради наполненности, но доля пользы  для новичков есть.  Часто нужно автоматизировать некие процессы на сайте. Одним их таких процессов был установка метки для самых продаваемых товаров.  Заказчик был крайне обескровлен муторной задачей, прописывая для товаров метку ХИТ. И вспомнив что у него есть старый товарищ программист , обратился ко мне. "Добавь задачу в Трелло" - пробубнил я в привычной мне манере. И как только появились свободные минуты бросился как камикадзе на задачу и  быстро разорвал его как Тузик грелку.






Ниже будет просто  код, которые запускается по крону раз в неделю. Для получения самых продаваемых товаров используется компонент sale.bestsellers

Метки в данном магазине  хранятся в свойстве типа СПИСОК , значения МНОЖЕСТВЕННЫЕ. И очень важно при обновлении не удалить другие метки.

Для начала работы создаем файл в корне сайта, назовем test.php . Откроем страницу и установим туда компонент sale.bestsellers. Настроим. И копируем шаблон. Далее открываем скпированные шаблон. Удаляем все кроме result_modifer.php и template.php . Причем,  удаляем весь код внутри template.php - нам выводить ничего не нужно. А в  result_modifer.php убираем все и  добавляем $GLOBALS['bx_bs_data'] = $arResult['ITEMS'];

Далее идет сам скрипт.

IBLOCK_ID_CATALOG,"ACTIVE"=>"Y",'PROPERTY_HIT_VALUE'=>"Хит"];
 $arr = []; 
 $rsItems = CIBlockElement::GetList( [],$arFilter, false,false, ['IBLOCK_ID','ID','NAME','PROPERTY_HIT']);
 while($ob = $rsItems->GetNextElement()){
  $arItem = $ob->GetFields(); 
  $arProps = $ob->GetProperties();
  $arr[ $arItem['ID'] ] = $arProps['HIT']['VALUE_ENUM_ID'];
 }
 l( count($arr));
 echo '

Товаров с меткой ХИТ = '.count($arr).'

'; foreach($arr as $idElement => $arrHitsProp){ $arT = []; foreach($arrHitsProp as $idProp){ if($idProp != PROP_HIT_VALUE_ID){ $arT[] = $idProp; } } CIBlockElement::SetPropertyValuesEx($idElement,IBLOCK_ID_CATALOG, Array("HIT"=>$arT) ); } //ПОлучем самые продаваемые товары за DAYS дней. $APPLICATION->IncludeComponent("bitrix:sale.bestsellers", "bestsellers_data", Array( "ACTION_VARIABLE" => "action", // Название переменной, в которой передается действие "ADDITIONAL_PICT_PROP_26" => "AVITO_PHOTO", // Дополнительная картинка "ADDITIONAL_PICT_PROP_27" => "MORE_PHOTO", // Дополнительная картинка "ADD_PROPERTIES_TO_BASKET" => "Y", // Добавлять в корзину свойства товаров и предложений "AJAX_MODE" => "N", // Включить режим AJAX "AJAX_OPTION_ADDITIONAL" => "", // Дополнительный идентификатор "AJAX_OPTION_HISTORY" => "N", // Включить эмуляцию навигации браузера "AJAX_OPTION_JUMP" => "N", // Включить прокрутку к началу компонента "AJAX_OPTION_STYLE" => "Y", // Включить подгрузку стилей "BASKET_URL" => "/personal/basket.php", // URL, ведущий на страницу с корзиной покупателя "BY" => "QUANTITY", // Сортировать отобранные товары по "CACHE_TIME" => "0", // Время кеширования (сек.) "CACHE_TYPE" => "A", // Тип кеширования "CART_PROPERTIES_26" => array( // Свойства для добавления в корзину 0 => "", 1 => ",", 2 => "", ), "CART_PROPERTIES_27" => array( // Свойства для добавления в корзину 0 => "", 1 => "", ), "COMPOSITE_FRAME_MODE" => "A", // Голосование шаблона компонента по умолчанию "COMPOSITE_FRAME_TYPE" => "AUTO", // Содержимое компонента "CONVERT_CURRENCY" => "Y", // Показывать цены в одной валюте "DETAIL_URL" => "", // URL, ведущий на страницу с содержимым элемента раздела "DISPLAY_COMPARE" => "N", // Выводить кнопку сравнения "FILTER" => array( // Фильтр по статусам заказа 0 => "F", ), "HIDE_NOT_AVAILABLE" => "N", // Не отображать товары, которых нет на складах "LABEL_PROP_26" => "-", // Свойство меток товара "LINE_ELEMENT_COUNT" => "5", // Количество элементов, выводимых в одной строке "MESS_BTN_BUY" => "Купить", // Текст кнопки "Купить" "MESS_BTN_DETAIL" => "Подробнее", // Текст кнопки "Подробнее" "MESS_BTN_SUBSCRIBE" => "Подписаться", // Текст кнопки "Уведомить о поступлении" "MESS_NOT_AVAILABLE" => "Нет в наличии", // Сообщение об отсутствии товара "OFFER_TREE_PROPS_27" => "", // Свойства для группировки "PAGE_ELEMENT_COUNT" => "30", // Количество элементов на странице "PARTIAL_PRODUCT_PROPERTIES" => "N", // Разрешить частично заполненные свойства "PERIOD" => PERIOD, // Период выборки (дней) "PRICE_CODE" => array( // Тип цены 0 => "BASE", ), "PRICE_VAT_INCLUDE" => "Y", // Включать НДС в цену "PRODUCT_ID_VARIABLE" => "id", // Название переменной, в которой передается код товара для покупки "PRODUCT_PROPS_VARIABLE" => "prop", // Название переменной, в которой передаются характеристики товара "PRODUCT_QUANTITY_VARIABLE" => "quantity", // Название переменной, в которой передается количество товара "PRODUCT_SUBSCRIPTION" => "N", // Разрешить оповещения для отсутствующих товаров "PROPERTY_CODE_26" => array( // Свойства для отображения 0 => "", 1 => ",", 2 => "", ), "PROPERTY_CODE_27" => array( // Свойства для отображения 0 => "", 1 => "", ), "SHOW_DISCOUNT_PERCENT" => "N", // Показывать процент скидки "SHOW_IMAGE" => "Y", // Показывать изображение "SHOW_NAME" => "Y", // Показывать название "SHOW_OLD_PRICE" => "N", // Показывать старую цену "SHOW_PRICE_COUNT" => "1", // Выводить цены для количества "SHOW_PRODUCTS_26" => "Y", // Показывать товары каталога "TEMPLATE_THEME" => "blue", // Цветовая тема "USE_PRODUCT_QUANTITY" => "N", // Разрешить указание количества товара "COMPONENT_TEMPLATE" => ".default", "CURRENCY_ID" => "RUB", // Валюта, в которую будут сконвертированы цены ), false ); $arBS = $GLOBALS['bx_bs_data']; echo '

Самые продаваемые товары = '.count($arBS).'

'; // Добавляем значения свойства ХИТ $arIds = []; foreach($arBS as $element){ // l($element['ID']); $arIds[] = $element['ID']; } $arFilter = ['IBLOCK_ID' =>IBLOCK_ID_CATALOG,"ID"=>$arIds]; $rsItems = CIBlockElement::GetList( [],$arFilter, false,false, ['IBLOCK_ID','ID','NAME','PROPERTY_HIT']); $arr = []; while($ob = $rsItems->GetNextElement()){ $arItem = $ob->GetFields(); $arProps = $ob->GetProperties(); $arr[ $arItem['ID'] ] = $arProps['HIT']['VALUE_ENUM_ID']; } foreach($arr as $idElement => $arrHitsProp){ $arrHitsProp[] = PROP_HIT_VALUE_ID; l([ $idElement , $arrHitsProp]); CIBlockElement::SetPropertyValuesEx($idElement,IBLOCK_ID_CATALOG, Array("HIT"=>$arrHitsProp) ); }


Ну, и напоследок, еще один мемасик собственной выдачи





1 комментарий: