• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/lib/orm/objectify/entityobject.php
  • Класс: BitrixMainORMObjectifyEntityObject
  • Вызов: EntityObject::wakeUp
static function wakeUp($row)
{
	/** @var static $objectClass */
	$objectClass = get_called_class();

	/** @var BitrixMainORMDataDataManager $dataClass */
	$dataClass = static::$dataClass;

	$entity = $dataClass::getEntity();
	$entityPrimary = $entity->getPrimaryArray();

	// normalize input data and primary
	$primary = [];

	if (!is_array($row))
	{
		// it could be single primary
		if (count($entityPrimary) == 1)
		{
			$primary[$entityPrimary[0]] = $row;
			$row = [];
		}
		else
		{
			throw new ArgumentException(sprintf(
				'Multi-primary for %s was not found', $objectClass
			));
		}
	}
	else
	{
		foreach ($entityPrimary as $primaryName)
		{
			if (!isset($row[$primaryName]))
			{
				throw new ArgumentException(sprintf(
					'Primary %s for %s was not found', $primaryName, $objectClass
				));
			}

			$primary[$primaryName] = $row[$primaryName];
			unset($row[$primaryName]);
		}
	}

	// create object
	/** @var static $object */
	$object = new $objectClass(false); // here go with false to not set default values
	$object->sysChangeState(State::ACTUAL);

	// set primary
	foreach ($primary as $primaryName => $primaryValue)
	{
		/** @var ScalarField $primaryField */
		$primaryField = $entity->getField($primaryName);
		$object->sysSetActual($primaryName, $primaryField->cast($primaryValue));
	}

	// set other data
	foreach ($row as $fieldName => $value)
	{
		/** @var ScalarField $primaryField */
		$field = $entity->getField($fieldName);

		if ($field instanceof IReadable)
		{
			$object->sysSetActual($fieldName, $field->cast($value));
		}
		else
		{
			// we have a relation
			if ($value instanceof static || $value instanceof Collection)
			{
				// it is ready data
				$object->sysSetActual($fieldName, $value);
			}
			else
			{
				// wake up relation
				if ($field instanceof Reference)
				{
					// wake up an object
					$remoteObjectClass = $field->getRefEntity()->getObjectClass();
					$remoteObject = $remoteObjectClass::wakeUp($value);

					$object->sysSetActual($fieldName, $remoteObject);
				}
				elseif ($field instanceof OneToMany || $field instanceof ManyToMany)
				{
					// wake up collection
					$remoteCollectionClass = $field->getRefEntity()->getCollectionClass();
					$remoteCollection = $remoteCollectionClass::wakeUp($value);

					$object->sysSetActual($fieldName, $remoteCollection);
				}
			}
		}
	}

	return $object;
}