Активация и деактивация по определенному свойству товара после выгрузки - alma-com/wiki-bitrix GitHub Wiki
Например у товара есть свойство "Отображать на сайте". Если значение свойства равно:
- "ДА" - то активируем товар
- "НЕТ" - то деактивируем товар
Это должно работать после выгрузки, при изменении и при добавлении товара. В init.php нужно написать следующее:
<?php
/*
* Регистрация двух событий:
* OnAfterIBlockElementAdd - после добавление элемента (если перед добавлением не работает, то не работает при выгрузке)
* OnAfterIBlockElementUpdate - после изменением элемента
*/
AddEventHandler("iblock", "OnAfterIBlockElementAdd", Array("EventChangeActive", "OnSetActive"));
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", Array("EventChangeActive", "OnSetActive"));
class EventChangeActive
{
static $IBLOCK_ID = 2;
static $propertyCode = 'OTOBRAZHAT_NA_SAYTE';
static $Y = 'ДА';
static $N = 'НЕТ';
/*
* При значении свойства "Отображать на сайте: НЕТ", то деактивируем элемент, и наоборот
*/
public function OnSetActive(&$arFields)
{
$ELEMENT_ID = self::getElementId($arFields);
$IBLOCK_ID = int($arFields["IBLOCK_ID"]);
$ACTIVE = $arFields['ACTIVE'];
if($IBLOCK_ID === self::$IBLOCK_ID) {
foreach($arFields['PROPERTY_VALUES'] as $propId => $prop){
if(self::getCodeValue($propId) === self::$propertyCode){
$propertyValue = self::getPropertyValue($propId, $prop[0]['VALUE']);
if(count($propertyValue)){
if($propertyValue['VALUE'] === self::$Y){
$ACTIVE = 'Y';
}
if($propertyValue['VALUE'] === self::$N){
$ACTIVE = 'N';
}
}
break;
}
}
if($ACTIVE !== $arFields['ACTIVE']) {
$el = new CIBlockElement;
$res = $el->Update($ELEMENT_ID, ["ACTIVE" => $ACTIVE]);
}
}
}
/*
* Получение ELEMENT_ID
*/
public function getElementId($arFields)
{
$elementId = 0;
if(IntVal($arFields["ID"])>0) {
$elementId = $arFields["ID"];
} elseif(IntVal($arFields["RESULT"])>1) {
$elementId = $arFields["RESULT"];
}
return $elementId;
}
/*
* Получение кода свойства
*/
public function getCodeValue($propId = '')
{
if($propId === '')
return false;
$propInfoRes = CIBlockProperty::GetByID($propId);
$propInfo = $propInfoRes->GetNext();
return $propInfo['CODE'];
}
/*
* получение значения свойства
*/
public function getPropertyValue($propId = '', $propIdValue = '')
{
if($propId === '')
return false;
if($propIdValue === '')
return false;
$db_enum_list = CIBlockProperty::GetPropertyEnum($propId, array(), array('ID' => $propIdValue));
return $db_enum_list->GetNext();
}
}