События на изменение цены товара

Модуль расширенного управления меню для битрикс

Апрель 7, 2023

Теги: ORM, Магазин

Обычные события ORM для классов "\Bitrix\Catalog\Model\Price" и "\Bitrix\Catalog\PriceTable" почему-то не работают. Вместо этого используются события "PriceOnBeforeAdd", "PriceOnBeforeUpdate" и подобные.

Умножение цены на коэффициент при сохранении (может пригодиться, например, при модификации данных из 1с):


<?php


namespace Partner;

\Bitrix\Main\EventManager::getInstance()->addEventHandler
    
'catalog'
    
'PriceOnBeforeAdd'
    
'\Partner\PriceTools::onBeforePriceAddUpdate'
); 

\Bitrix\Main\EventManager::getInstance()->addEventHandler
    
'catalog'
    
'PriceOnBeforeUpdate'
    
'\Partner\PriceTools::onBeforePriceAddUpdate'
); 

class 
PriceTools 
{    
    public static function 
onBeforePriceAddUpdate(\Bitrix\Main\Entity\Event $event
    {
        
// if($GLOBALS["APPLICATION"]->GetCurPage()!='/bitrix/admin/1c_exchange.php')
            // return;
        //$id = $event->getParameter("id");
        
$fields $event->getParameter("fields"); // получаем список полей   
        
$entity $event->getEntity(); // получаем объект сущности 
        
$eventType $event->getEventType(); // получаем тип события (например, "PriceOnBeforeUpdate"
    
        
$rate 2;
    
        
$result = new \Bitrix\Main\Entity\EventResult();
        
$fields["PRICE"] *= $rate;
        
$fields["PRICE_SCALE"] *= $rate;
        
$event->setParameter("fields",$fields);
        
$changedFields = array();
        
$changedFields["PRICE"] = $fields["PRICE"];
        
$changedFields["PRICE_SCALE"] = $fields["PRICE_SCALE"];
        
$result->modifyFields($changedFields);
        
//$result->unsetFields($arUnsetFields);
        
return $result;
    }    
}

См. также:

← Переход к списку