• Модуль: disk
  • Путь к файлу: ~/bitrix/modules/disk/lib/internals/model.php
  • Класс: BitrixDiskInternalsModel
  • Вызов: Model::setAttributes
protected function setAttributes(array $attributes, array &$aliases = null)
{
	if(empty($attributes))
	{
		return $this;
	}

	$modelMapAttributes = static::getMapAttributes();

	foreach(array_intersect_key($attributes, $modelMapAttributes) as $name => $value)
	{
		if(isset($modelMapAttributes[$name]))
		{
			$this->{$modelMapAttributes[$name]} = $value;
		}
		$this->setAsLoadedAttribute($modelMapAttributes[$name]);
		unset($attributes[$name]);
	}
	unset($name, $value);

	if(empty($attributes))
	{
		return $this;
	}

	if($aliases === null)
	{
		$aliases =& $this::$lastAliases;
	}

	if(!$aliases)
	{
		return $this;
	}
	ksort($attributes);


	foreach($aliases as $prefix => &$aliasData)
	{
		$subEntity = array();
		$pos = mb_strlen($prefix);
		$entityName = $aliasData['alias'][$prefix];
		if(!empty($aliasData['already_calc']))
		{
			list($start, $end) = $aliasData['already_calc'];
			foreach(array_splice($attributes, $start, $end) as $name => $value)
			{
				$subEntity[mb_substr($name, $pos)] = $value;
			}
			unset($name, $value);
		}
		else
		{
			$start = null;
			$end = null;
			$i = 0;
			$currentEntity = null;
			foreach($attributes as $name => $value)
			{
				if(mb_substr($name, 0, $pos) === $prefix)
				{
					$subEntity[mb_substr($name, $pos)] = $value;
					unset($attributes[$name]);

					if($start === null)
					{
						$start = $i;
					}
					$end = $i;
				}
				$i++;
			}
			unset($name, $value);
			$aliasData['already_calc'] = array($start, $end - $start + 1);
		}
		if(!empty($subEntity))
		{
			$alias = isset($aliasData['sub']) ? $aliasData['sub'] : array();
			/** @var Model $className */
			$className = $aliasData['class'];
			$aliasesData =& $alias;

			if(!array_filter($subEntity))
			{
				if(count($subEntity) > 1 && isset($modelMapAttributes[$entityName]))
				{
					$this->setAsLoadedAttribute($modelMapAttributes[$entityName]);
				}
				continue;
			}

			$this->setSubEntityToModel($entityName, $modelMapAttributes, $className, $subEntity, $aliasesData);

			if(isset($modelMapAttributes[$entityName]))
			{
				$this->{$modelMapAttributes[$entityName]} = $className::buildFromArray($subEntity, $aliasesData);
				$this->setAsLoadedAttribute($modelMapAttributes[$entityName]);
			}

		}
	}
	unset($prefix, $aliasData, $alias);

	$this->setExtraAttributes($attributes);

	return $this;
}