Периодически после анонсирования фишек битрикса возникает странное ощущения магии происходящего, например только закончив изучать азы php и сев за Битрикс, совершенно не понятно откуда вдруг берутся и наполняются массивы $arParams и $arResult, принимаешь это как есть и со временем понимаешь, что магии никакой нет.
Так и теперь, почитав, что есть клевые торговые предложения и рассматривая красивые картинки совершенно не понимаешь, а как с ними работать простому разработчику, лезешь в документацию посмотреть на новые классы и находишь вот это:
Казалось бы, практически задачи: вывести список торговых предложений, записать, обновить и т.п ... где это все?
Как обычно магии нет! Функционал торговых предложений по большому счету обертка старого функционала инфоблоков для админки – все.
Торговые предложения – это элементы инфоблока и работаем с ними так же как с простыми
CIBlockProperty::GetByID($propertyID, $iblock); |
для того чтоб не ошибаться с инфоблоками и свойствами.
Возникает следующая практическая задача, есть майки, есть их размеры в торговых каталогах, цена от размера зависит, а сортировать товары(не товарные предложения) нужно. И что самое главное, помнишь ведь, что где-то читал:
12.05.2011 00:34:06 Сортировки и поиск по ценам теперь работают как? 12.05.2011 10:03:58 Для основного инфоблока (каточек товаров) добавлены свойства MININUM_PRICE и MAXIMUM_PRICE, а так же событие которое при добавлении/изменении товара или торгового предложения для данной торговой карточки записывает данные в эти свойства. По MININUM_PRICE и происходит сортировка. MAXIMUM_PRICE используется для определения, есть ли разница в ценах и необходимость ставить на главной странице в ценах предлог "от". |
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, ) ); } } } } |
Просто опять для себя убедился, что ничего магического нет, просто в одном из решений, ручками с помощью инфоблоков, свойств инфоблоков и обработчиков сделали полезность и хорошенько ее представили.
Надеюсь пост проиндексируют и кому-нибудь пригодится =)
теги: торговые предложения, товарные предложения, сортировка по цене товарных предложений