Всем привет. Столкнулся с проблемой при решении задачи, по добавлению свойства "наличие" в умный фильтр.
Свойство создал в Фильтр засунул. Написал скрипт, в нем пробежался по товарам, посмотрел вевзде количество, учел торговики где они есть. Заполнил свойства у всех товаров, все хорошо.
Осталось только написать чтобы при изменение количества это фиксировалось в свойтсве "наличие".
Для обычных товаров все просто используя эти 2 события свойство меняется[CODE]AddEventHandler("catalog", "OnStoreProductAdd", "DoUpdateQuantity");
AddEventHandler("catalog", "OnStoreProductUpdate", "DoUpdateQuantity");
function DoUpdateQuantity($arg,$arg2)
{
if(CModule::IncludeModule("sale")){
$buffer=array();
if(is_array($arg2)){
$arOrder = array();
$arFilter = array("ID"=>$arg2['PRODUCT_ID'], "IBLOCK_ID"=>5);
$arSelectFields = array("ID","CATALOG_QUANTITY");
$rsElements = CIBlockElement::GetList($arOrder, $arFilter, FALSE, FALSE, $arSelectFields);
while($arElement = $rsElements->GetNext())
{//print_r($arElement);die;
if ($arElement["CATALOG_QUANTITY"] > 0 ){
$prop = Array("QUANTITY" => 354); // 354 - в наличии
}else{
$prop = Array("QUANTITY" => 355); // 355 - под заказ
}
}
CIBlockElement::SetPropertyValuesEx($arg2['PRODUCT_ID'], 5, $prop);
}
}
}
[/CODE]Но событие даже не срабатывает если количество меняется не у самого товара, а у торгового предложения, сидел копал документашку и не нашол не чего по изменению количества торговых предложений, решил пойти топорно, воспользовавшись событием изменения элемента инфоблока. Сразу столкнулся с проблемой
пытаясь продебажить и прописав в функции фызываемой событием дай, страница зависал с вечной загрузкой если редактировал торговое предложение зайдя в него из интерфейса редактирования самого товара.
Это почему так кто то может подсказать? Это очень странно как по мне.
Ну да бог с ним как то догадался что если напрямую в инфоблок торговиков зайти и менять то все дебажится как надо.
Вобщем написал функцию, и все вне работает вплоть до последней основной точки. Почему то самой свойство не меняетс я не в какую, в чем причина не могу разобраться . Подскажите пожалуйста[CODE]AddEventHandler("iblock", "OnAfterIBlockElementUpdate", "DoUpdateQuantitySKU");
function DoUpdateQuantitySKU(&$arFields)
{
if (CCatalogSKU::GetInfoByOfferIBlock($arFields["IBLOCK_ID"])){ //если это торговик
$ProductId=CCatalogSku::GetProductInfo($arFields["ID"]); // узнаем ид товара
//print_r($ProductId);
$quantity=0;
$res = CCatalogSKU::getOffersList( //получаемсписок торговиков
$ProductId["ID"], // массив ID товаров
$ProductId["IBLOCK_ID"],
$skuFilter = array(), // дополнительный фильтр предложений. по умолчанию пуст.
$fields = array(), // массив полей предложений. даже если пуст - вернет ID и IBLOCK_ID
$propertyFilter = array() /*свойства предложений. имеет 2 ключа:
ID - массив ID свойств предложений
либо
CODE - массив символьных кодов свойств предложений
если указаны оба ключа, приоритет имеет ID*/
);
foreach ($res[$ProductId["ID"]] as $key => $value) {
$offerParameters = CCatalogProduct::GetByID($value["ID"]);
$quantity=$quantity+$offerParameters["QUANTITY"]; //сумируем остатки по торговикам
}
//print_r($quantity);die;
if ($quantity > 0){
$prop = Array("QUANTITY" => 354); // 354 - в наличии
}else{
$prop = Array("QUANTITY" => 355); // 355 - под заказ
}
CIBlockElement::SetPropertyValuesEx($ProductId["ID"], 5, $prop);
}
}
[/CODE]
Свойство создал в Фильтр засунул. Написал скрипт, в нем пробежался по товарам, посмотрел вевзде количество, учел торговики где они есть. Заполнил свойства у всех товаров, все хорошо.
Осталось только написать чтобы при изменение количества это фиксировалось в свойтсве "наличие".
Для обычных товаров все просто используя эти 2 события свойство меняется[CODE]AddEventHandler("catalog", "OnStoreProductAdd", "DoUpdateQuantity");
AddEventHandler("catalog", "OnStoreProductUpdate", "DoUpdateQuantity");
function DoUpdateQuantity($arg,$arg2)
{
if(CModule::IncludeModule("sale")){
$buffer=array();
if(is_array($arg2)){
$arOrder = array();
$arFilter = array("ID"=>$arg2['PRODUCT_ID'], "IBLOCK_ID"=>5);
$arSelectFields = array("ID","CATALOG_QUANTITY");
$rsElements = CIBlockElement::GetList($arOrder, $arFilter, FALSE, FALSE, $arSelectFields);
while($arElement = $rsElements->GetNext())
{//print_r($arElement);die;
if ($arElement["CATALOG_QUANTITY"] > 0 ){
$prop = Array("QUANTITY" => 354); // 354 - в наличии
}else{
$prop = Array("QUANTITY" => 355); // 355 - под заказ
}
}
CIBlockElement::SetPropertyValuesEx($arg2['PRODUCT_ID'], 5, $prop);
}
}
}
[/CODE]Но событие даже не срабатывает если количество меняется не у самого товара, а у торгового предложения, сидел копал документашку и не нашол не чего по изменению количества торговых предложений, решил пойти топорно, воспользовавшись событием изменения элемента инфоблока. Сразу столкнулся с проблемой
пытаясь продебажить и прописав в функции фызываемой событием дай, страница зависал с вечной загрузкой если редактировал торговое предложение зайдя в него из интерфейса редактирования самого товара.
Это почему так кто то может подсказать? Это очень странно как по мне.
Ну да бог с ним как то догадался что если напрямую в инфоблок торговиков зайти и менять то все дебажится как надо.
Вобщем написал функцию, и все вне работает вплоть до последней основной точки. Почему то самой свойство не меняетс я не в какую, в чем причина не могу разобраться . Подскажите пожалуйста[CODE]AddEventHandler("iblock", "OnAfterIBlockElementUpdate", "DoUpdateQuantitySKU");
function DoUpdateQuantitySKU(&$arFields)
{
if (CCatalogSKU::GetInfoByOfferIBlock($arFields["IBLOCK_ID"])){ //если это торговик
$ProductId=CCatalogSku::GetProductInfo($arFields["ID"]); // узнаем ид товара
//print_r($ProductId);
$quantity=0;
$res = CCatalogSKU::getOffersList( //получаемсписок торговиков
$ProductId["ID"], // массив ID товаров
$ProductId["IBLOCK_ID"],
$skuFilter = array(), // дополнительный фильтр предложений. по умолчанию пуст.
$fields = array(), // массив полей предложений. даже если пуст - вернет ID и IBLOCK_ID
$propertyFilter = array() /*свойства предложений. имеет 2 ключа:
ID - массив ID свойств предложений
либо
CODE - массив символьных кодов свойств предложений
если указаны оба ключа, приоритет имеет ID*/
);
foreach ($res[$ProductId["ID"]] as $key => $value) {
$offerParameters = CCatalogProduct::GetByID($value["ID"]);
$quantity=$quantity+$offerParameters["QUANTITY"]; //сумируем остатки по торговикам
}
//print_r($quantity);die;
if ($quantity > 0){
$prop = Array("QUANTITY" => 354); // 354 - в наличии
}else{
$prop = Array("QUANTITY" => 355); // 355 - под заказ
}
CIBlockElement::SetPropertyValuesEx($ProductId["ID"], 5, $prop);
}
}
[/CODE]