• Как сортировать элементы каталога по цене торговых предложений(bitrix)?

    Logic87
    @Logic87
    Программист/администратор сайтов на 1С-Битрикс.
    Была похожая ситуация.
    Использовал старый код Битрикса. Нужно в файл /bitrix/php_interface/init.php внести следующий код:
    /*Version 0.3 2011-04-25*/
    AddEventHandler("iblock", "OnAfterIBlockElementUpdate", "DoIBlockAfterSave");
    AddEventHandler("iblock", "OnAfterIBlockElementAdd", "DoIBlockAfterSave");
    AddEventHandler("catalog", "OnPriceAdd", "DoIBlockAfterSave");
    AddEventHandler("catalog", "OnPriceUpdate", "DoIBlockAfterSave");
    function DoIBlockAfterSave($arg1, $arg2 = false)
    {
     $ELEMENT_ID = false;
     $IBLOCK_ID = false;
     $OFFERS_IBLOCK_ID = false;
     $OFFERS_PROPERTY_ID = false;
     if (CModule::IncludeModule('currency'))
     $strDefaultCurrency = CCurrency::GetBaseCurrency();
    
     //Check for catalog event
     if(is_array($arg2) && $arg2["PRODUCT_ID"] > 0)
     {
     //Get iblock element
     $rsPriceElement = CIBlockElement::GetList(
     array(),
     array(
     "ID" => $arg2["PRODUCT_ID"],
     ),
     false,
     false,
     array("ID", "IBLOCK_ID")
     );
     if($arPriceElement = $rsPriceElement->Fetch())
     {
     $arCatalog = CCatalog::GetByID($arPriceElement["IBLOCK_ID"]);
     if(is_array($arCatalog))
     {
     //Check if it is offers iblock
     if($arCatalog["OFFERS"] == "Y")
     {
     //Find product element
     $rsElement = CIBlockElement::GetProperty(
     $arPriceElement["IBLOCK_ID"],
     $arPriceElement["ID"],
     "sort",
     "asc",
     array("ID" => $arCatalog["SKU_PROPERTY_ID"])
     );
     $arElement = $rsElement->Fetch();
     if($arElement && $arElement["VALUE"] > 0)
     {
     $ELEMENT_ID = $arElement["VALUE"];
     $IBLOCK_ID = $arCatalog["PRODUCT_IBLOCK_ID"];
     $OFFERS_IBLOCK_ID = $arCatalog["IBLOCK_ID"];
     $OFFERS_PROPERTY_ID = $arCatalog["SKU_PROPERTY_ID"];
     }
     }
     //or iblock which has offers
     elseif($arCatalog["OFFERS_IBLOCK_ID"] > 0)
     {
     $ELEMENT_ID = $arPriceElement["ID"];
     $IBLOCK_ID = $arPriceElement["IBLOCK_ID"];
     $OFFERS_IBLOCK_ID = $arCatalog["OFFERS_IBLOCK_ID"];
     $OFFERS_PROPERTY_ID = $arCatalog["OFFERS_PROPERTY_ID"];
     }
     //or it's regular catalog
     else
     {
     $ELEMENT_ID = $arPriceElement["ID"];
     $IBLOCK_ID = $arPriceElement["IBLOCK_ID"];
     $OFFERS_IBLOCK_ID = false;
     $OFFERS_PROPERTY_ID = false;
     }
     }
     }
     }
     //Check for iblock event
     elseif(is_array($arg1) && $arg1["ID"] > 0 && $arg1["IBLOCK_ID"] > 0)
     {
     //Check if iblock has offers
     $arOffers = CIBlockPriceTools::GetOffersIBlock($arg1["IBLOCK_ID"]);
     if(is_array($arOffers))
     {
     $ELEMENT_ID = $arg1["ID"];
     $IBLOCK_ID = $arg1["IBLOCK_ID"];
     $OFFERS_IBLOCK_ID = $arOffers["OFFERS_IBLOCK_ID"];
     $OFFERS_PROPERTY_ID = $arOffers["OFFERS_PROPERTY_ID"];
     }
     }
    
     if($ELEMENT_ID)
     {
     static $arPropCache = array();
     if(!array_key_exists($IBLOCK_ID, $arPropCache))
     {
     //Check for MINIMAL_PRICE property
     $rsProperty = CIBlockProperty::GetByID("MINIMUM_PRICE", $IBLOCK_ID);
     $arProperty = $rsProperty->Fetch();
     if($arProperty)
     $arPropCache[$IBLOCK_ID] = $arProperty["ID"];
     else
     $arPropCache[$IBLOCK_ID] = false;
     }
    
     if($arPropCache[$IBLOCK_ID])
     {
     //Compose elements filter
     if($OFFERS_IBLOCK_ID)
     {
     $rsOffers = CIBlockElement::GetList(
     array(),
     array(
     "IBLOCK_ID" => $OFFERS_IBLOCK_ID,
     "PROPERTY_".$OFFERS_PROPERTY_ID => $ELEMENT_ID,
     ),
     false,
     false,
     array("ID")
     );
     while($arOffer = $rsOffers->Fetch())
     $arProductID[] = $arOffer["ID"];
    
     if (!is_array($arProductID))
     $arProductID = array($ELEMENT_ID);
     }
     else
     $arProductID = array($ELEMENT_ID);
    
     $minPrice = false;
     $maxPrice = false;
     //Get prices
     $rsPrices = CPrice::GetList(
     array(),
     array(
     "PRODUCT_ID" => $arProductID,
     )
     );
     while($arPrice = $rsPrices->Fetch())
     {
     if (CModule::IncludeModule('currency') && $strDefaultCurrency != $arPrice['CURRENCY'])
     $arPrice["PRICE"] = CCurrencyRates::ConvertCurrency($arPrice["PRICE"], $arPrice["CURRENCY"], $strDefaultCurrency);
    
     $PRICE = $arPrice["PRICE"];
    
     if($minPrice === false || $minPrice > $PRICE)
     $minPrice = $PRICE;
    
     if($maxPrice === false || $maxPrice < $PRICE)
     $maxPrice = $PRICE;
     }
    
     //Save found minimal price into property
     if($minPrice !== false)
     {
     CIBlockElement::SetPropertyValuesEx(
     $ELEMENT_ID,
     $IBLOCK_ID,
     array(
     "MINIMUM_PRICE" => $minPrice,
     "MAXIMUM_PRICE" => $maxPrice,
     )
     );
     }
     }
     }
    }


    У вас появятся два свойства товара: Минимальная цена и Максимальная цена. Чтобы у этих полях появились данные нужно зайти в карточку товара и нажать Сохранить или они сами заполнятся при создании нового товара с торговыми предложениями.

    Дальше делаете стандартную сортировку кодом по этим двум свойствам в section.php комплексного компонента Каталог и выводите визуалом в шаблоне section.php этого же компонента. Читайте о создании сортировки в Битриксе. Вот и все.
    Ответ написан
    3 комментария
  • Как не распыляясь дотащить до front-end мидл девелопера?

    @djay
    Must have:

    - HTML5/CSS3 - знать как минимум в совершенстве
    - JavaScript, включительно ECMAScript 6-7
    - В порядке вещей - Bootstrap + Jquery
    - Grunt/Gulp, Bower
    - Знание хотя бы одного фреймворка. Сейчас более менее ходовые это Angular.js и Backbone
    - Знание системы контроля версий Git. Умение работать с GitHub/BitBucket
    - Опыт работы от 2-х лет

    Как плюс:

    - Знание Canvas, SVG, умение писать игры
    - Знание шаблонов проектирования
    - Умение покрывать код тестами

    Это и есть обобщенный набор навыков по рынку на текущий момент.
    Ответ написан
    9 комментариев