• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/internals/entity.php
  • Класс: BitrixSaleInternalsEntity
  • Вызов: Entity::setField
public function setField($name, $value)
{
	$result = new Result();

	$value = $this->normalizeValue($name, $value);

	if ($this->eventName === null)
	{
		$this->eventName = static::getEntityEventName();
	}

	if ($this->eventName)
	{
		$eventManager = MainEventManager::getInstance();
		if ($eventsList = $eventManager->findEventHandlers('sale', 'OnBefore'.$this->eventName.'SetField'))
		{
			/** @var MainEntityEvent $event */
			$event = new MainEvent('sale', 'OnBefore'.$this->eventName.'SetField', array(
				'ENTITY' => $this,
				'NAME' => $name,
				'VALUE' => $value,
			));
			$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['VALUE']) && $eventResultData['VALUE'] != $value)
							{
								$value = $eventResultData['VALUE'];
							}
						}
					}
					elseif($eventResult->getType() == MainEventResult::ERROR)
					{

						$errorMsg = new ResultError(MainLocalizationLoc::getMessage('SALE_EVENT_ON_BEFORE_'.mb_strtoupper($this->eventName).'_SET_FIELD_ERROR'), 'SALE_EVENT_ON_BEFORE_'.mb_strtoupper($this->eventName).'_SET_FIELD_ERROR');

						if ($eventResultData = $eventResult->getParameters())
						{
							if (isset($eventResultData) && $eventResultData instanceof ResultError)
							{
								/** @var ResultError $errorMsg */
								$errorMsg = $eventResultData;
							}
						}

						$result->addError($errorMsg);

					}
				}

				if (!$result->isSuccess())
				{
					return $result;
				}
			}
		}
	}

	$availableFields = static::getAvailableFieldsMap();
	if (!isset($availableFields[$name]))
	{
		throw new MainArgumentOutOfRangeException("name=$name");
	}

	$oldValue = $this->fields->get($name);
	if ($oldValue != $value || ($oldValue === null && $value !== null))
	{
		$r = $this->checkValueBeforeSet($name, $value);
		if (!$r->isSuccess())
		{
			$result->addErrors($r->getErrors());
			return $result;
		}

		if ($this->eventName)
		{
			if ($eventsList = $eventManager->findEventHandlers('sale', 'On'.$this->eventName.'SetField'))
			{
				$event = new MainEvent('sale', 'On'.$this->eventName.'SetField', array(
					'ENTITY' => $this,
					'NAME' => $name,
					'VALUE' => $value,
					'OLD_VALUE' => $oldValue,
				));
				$event->send();

				if ($event->getResults())
				{
					/** @var MainEventResult $evenResult */
					foreach($event->getResults() as $eventResult)
					{
						if($eventResult->getType() == MainEventResult::SUCCESS)
						{
							if ($eventResultData = $eventResult->getParameters())
							{
								if (isset($eventResultData['VALUE']) && $eventResultData['VALUE'] != $value)
								{
									$value = $eventResultData['VALUE'];
								}
							}
						}
					}
				}
			}
		}

		$isStartField = $this->isStartField(in_array($name, static::getMeaningfulFields()));

		$this->fields->set($name, $value);
		try
		{
			$result = $this->onFieldModify($name, $oldValue, $value);

			if ($result->isSuccess() && $this->eventName)
			{
				$event = new MainEvent('sale', 'OnAfter'.$this->eventName.'SetField', array(
					'ENTITY' => $this,
					'NAME' => $name,
					'VALUE' => $value,
					'OLD_VALUE' => $oldValue,
				));
				$event->send();
			}

			if ($result->isSuccess())
			{
				static::addChangesToHistory($name, $oldValue, $value);
			}
		}
		catch (Exception $e)
		{
			$this->fields->set($name, $oldValue);
			throw $e;
		}

		if (!$result->isSuccess())
		{
			$this->fields->set($name, $oldValue);
		}
		else
		{
			if ($isStartField)
			{
				$hasMeaningfulFields = $this->hasMeaningfulField();

				/** @var Result $r */
				$r = $this->doFinalAction($hasMeaningfulFields);
				if (!$r->isSuccess())
				{
					$result->addErrors($r->getErrors());
				}
				else
				{
					if (($data = $r->getData())
						&& !empty($data) && is_array($data))
					{
						$result->setData($result->getData() + $data);
					}
				}
			}
		}
	}

	return $result;
}