Активация и деактивация по определенному свойству товара после выгрузки - 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();
     }
}