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