- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/internals/entity.php
- Класс: BitrixSaleInternalsEntity
- Вызов: Entity::setFields
public function setFields(array $values)
{
$resultData = array();
$result = new Result();
$oldValues = null;
foreach ($values as $key => $value)
{
$oldValues[$key] = $this->fields->get($key);
}
if ($this->eventName === null)
{
$this->eventName = static::getEntityEventName();
}
if ($this->eventName)
{
$eventManager = MainEventManager::getInstance();
if ($eventsList = $eventManager->findEventHandlers('sale', 'OnBefore'.$this->eventName.'SetFields'))
{
$event = new MainEvent('sale', 'OnBefore'.$this->eventName.'SetFields', array(
'ENTITY' => $this,
'VALUES' => $values,
'OLD_VALUES' => $oldValues
));
$event->send();
if ($event->getResults())
{
/** @var MainEventResult $eventResult */
foreach($event->getResults() as $eventResult)
{
if($eventResult->getType() == MainEventResult::SUCCESS)
{
if ($eventResultData = $eventResult->getParameters())
{
if (isset($eventResultData['VALUES']))
{
$values = $eventResultData['VALUES'];
}
}
}
elseif($eventResult->getType() == MainEventResult::ERROR)
{
$errorMsg = new ResultError(MainLocalizationLoc::getMessage('SALE_EVENT_ON_BEFORE_'.mb_strtoupper($this->eventName).'_SET_FIELDS_ERROR'), 'SALE_EVENT_ON_BEFORE_'.mb_strtoupper($this->eventName).'_SET_FIELDS_ERROR');
if ($eventResultData = $eventResult->getParameters())
{
if (isset($eventResultData) && $eventResultData instanceof ResultError)
{
/** @var ResultError $errorMsg */
$errorMsg = $eventResultData;
}
}
$result->addError($errorMsg);
}
}
}
}
}
if (!$result->isSuccess())
{
return $result;
}
$values = $this->onBeforeSetFields($values);
$isStartField = $this->isStartField();
foreach ($values as $key => $value)
{
$r = $this->setField($key, $value);
if (!$r->isSuccess())
{
$data = $r->getData();
if (!empty($data) && is_array($data))
{
$resultData = array_merge($resultData, $data);
}
$result->addErrors($r->getErrors());
}
elseif ($r->hasWarnings())
{
$result->addWarnings($r->getWarnings());
}
}
if (!empty($resultData))
{
$result->setData($resultData);
}
if ($isStartField)
{
$hasMeaningfulFields = $this->hasMeaningfulField();
/** @var Result $r */
$r = $this->doFinalAction($hasMeaningfulFields);
if (!$r->isSuccess())
{
$result->addErrors($r->getErrors());
}
if (($data = $r->getData())
&& !empty($data) && is_array($data))
{
$result->setData(array_merge($result->getData(), $data));
}
}
return $result;
}