Рано или поздно, ты столкнешься с такой проблемой: нужно отсортировать товары по цене. Казалось что может быть проще... Но нет, цены на товар представлены в виде торговых предложений. Тут приведен один из способов решения данной задачи.
1. Создаем новые свойства товара:
2. Заполняем свойства.
Создаем тестовую страницу, кидаем туда скрипт, который заполняет выше созданные свойства товара.
3. Теперь редактируем страницу вывода каталога.
"ELEMENT_SORT_FIELD" => "PROPERTY_MINIMUM_PRICE",
"ELEMENT_SORT_ORDER" => "ASC"
4. Запускать каждый раз скрипт неудобно. Надо чтобы при добавлении или редактировании товара автоматически обновлялись свойства товара. Для чего редактируем файл /bitrix/php_interface/init.php
И все. Теперь сортировка работает. Пьем чай, наслаждаемся жизнью.
1. Создаем новые свойства товара:
2. Заполняем свойства.
Создаем тестовую страницу, кидаем туда скрипт, который заполняет выше созданные свойства товара.
CModule::IncludeModule('iblock');
CModule::IncludeModule('catalog');
// ID инфоблока товаров
$ID_BLOCK = 6;
$arSelect = Array("ID", "NAME", "DATE_ACTIVE_FROM");
$arFilter = Array("IBLOCK_ID"=>$ID_BLOCK,"ACTIVE"=>"Y");
$res = CIBlockElement::GetList(
Array('ID',"NAME"),
$arFilter, false,
Array("nPageSize"=>5000),
$arSelect);
while($ob = $res->GetNextElement()){
$arFields = $ob->GetFields();
$MIN_PRICE = get_offer_min_price($ID_BLOCK,$arFields['ID']);
$MAX_PRICE = get_offer_max_price($ID_BLOCK,$arFields['ID']);
//echo $arFields['ID'].' min= '.$MIN_PRICE.' max='.$MAX_PRICE.' - '.$arFields['NAME'];echo '
';
//Обновляем свойства товара
CIBlockElement::SetPropertyValuesEx($arFields['ID'], false, array('MINIMUM_PRICE' => $MIN_PRICE));
CIBlockElement::SetPropertyValuesEx($arFields['ID'], false, array('MAXIMUM_PRICE' => $MAX_PRICE));
}
//-------------------------------
/*
Возвращает минимальную цену товара из тп
*/
function get_offer_min_price($IBLOCK_ID,$item_id){
$ret = 0;
$arInfo = CCatalogSKU::GetInfoByProductIBlock($IBLOCK_ID);
if (is_array($arInfo)) {
$res = CIBlockElement::GetList(Array("PRICE"=>"asc"),
array('IBLOCK_ID'=>$arInfo['IBLOCK_ID'], 'ACTIVE'=>'Y', 'PROPERTY_'.$arInfo['SKU_PROPERTY_ID'] => $item_id),
false,
false,
array('ID', 'NAME'))->GetNext();
if ($res){
$ret = GetCatalogProductPrice($res["ID"], 1);
if ($ret['PRICE']){
$ret = $ret['PRICE'];
}
}
}
return $ret;
}
/*
Возвращает максимальную цену товара из тп
*/
function get_offer_max_price($IBLOCK_ID,$item_id){
$ret = 0;
$arInfo = CCatalogSKU::GetInfoByProductIBlock($IBLOCK_ID);
if (is_array($arInfo)) {
$res = CIBlockElement::GetList(Array("PRICE"=>"desc"),
array('IBLOCK_ID'=>$arInfo['IBLOCK_ID'], 'ACTIVE'=>'Y', 'PROPERTY_'.$arInfo['SKU_PROPERTY_ID'] => $item_id),
false,
false,
array('ID', 'NAME'))->GetNext();
if ($res){
$ret = GetCatalogProductPrice($res["ID"], 1);
if ($ret['PRICE']){
$ret = $ret['PRICE'];
}
}
}
return $ret;
}
Запускаем скрипт, проверяем. Видим что свойства заполнены."ELEMENT_SORT_FIELD" => "PROPERTY_MINIMUM_PRICE",
"ELEMENT_SORT_ORDER" => "ASC"
4. Запускать каждый раз скрипт неудобно. Надо чтобы при добавлении или редактировании товара автоматически обновлялись свойства товара. Для чего редактируем файл /bitrix/php_interface/init.php
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", Array("MyElement", "OnBeforeIBlockElementUpdateHandler"));
AddEventHandler("iblock", "OnAfterIBlockElementAdd", Array("MyElement", "OnAfterIBlockElementAddHandler"));
class MyElement
{
function OnAfterIBlockElementAddHandler(&$arFields){
if($arFields["ID"]>0){
$ID_BLOCK = 6;
$MIN_PRICE = get_offer_min_price($ID_BLOCK,$arFields['ID']);
$MAX_PRICE = get_offer_max_price($ID_BLOCK,$arFields['ID']);
//Обновляем свойства товара
CIBlockElement::SetPropertyValuesEx($arFields['ID'], $ID_BLOCK, array('MINIMUM_PRICE' => $MIN_PRICE));
CIBlockElement::SetPropertyValuesEx($arFields['ID'], $ID_BLOCK, array('MAXIMUM_PRICE' => $MAX_PRICE));
}
}
function OnBeforeIBlockElementUpdateHandler(&$arFields){
$ID_BLOCK = 6;
$MIN_PRICE = get_offer_min_price($ID_BLOCK,$arFields['ID']);
$MAX_PRICE = get_offer_max_price($ID_BLOCK,$arFields['ID']);
//Обновляем свойства товара
// global $APPLICATION;
//$APPLICATION->throwException("Введите символьный код. (ID:".$arFields['ID'].' MAX_PRICE='.$MAX_PRICE.")");
CIBlockElement::SetPropertyValuesEx($arFields['ID'], $ID_BLOCK, array('MINIMUM_PRICE' => $MIN_PRICE));
CIBlockElement::SetPropertyValuesEx($arFields['ID'], $ID_BLOCK, array('MAXIMUM_PRICE' => $MAX_PRICE));
//return false;
}
}
И все. Теперь сортировка работает. Пьем чай, наслаждаемся жизнью.



Не будет работать если добавить торговое предложение или поменять у торгового предложения цену
ОтветитьУдалить