• Модуль: 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;
}