/** * Generic getter for a collection of objects * * @param $stored Component[] Actual value of the property (will be returned if not null) * @param $class_name string Class for each collection's object * @param $object object Parent object * @param $property string|Reflection_Property Parent property (or property name). Recommended * but can be omitted if foreign class is a Component * @return object[] */ public static function &getCollection(&$stored, $class_name, $object, $property = null) { if (!(self::$ignore || isset($stored))) { if (Dao::getObjectIdentifier($object)) { $search_element = Search_Object::create($class_name); $is_component = isA($search_element, Component::class); if (isset($property)) { if (!$property instanceof Reflection_Property) { $property = new Reflection_Property(get_class($object), $property); } $property_name = $property->getAnnotation('foreign')->value; $dao = ($dao = $property->getAnnotation('dao')->value) ? Dao::get($dao) : Dao::current(); } else { $dao = Dao::current(); $property_name = null; } if ($is_component) { /** @var $search_element Component */ $search_element->setComposite($object, $property_name); $link_properties_names = (new Link_Class($class_name))->getLinkPropertiesNames(); $options = $link_properties_names ? [Dao::sort(), Dao::key($link_properties_names)] : [Dao::sort()]; $stored = $dao->search($search_element, null, $options); } elseif (!empty($property_name)) { $property = new Reflection_Property(get_class($search_element), $property_name); $accessible = $property->isPublic(); if (!$accessible) { $property->setAccessible(true); } $property->setValue($search_element, $object); if (!$accessible) { $property->setAccessible(false); } $stored = $dao->search($search_element, null, [Dao::sort()]); } else { trigger_error('getCollection() must be called for a component foreign type' . ' or with a parent property name', E_USER_ERROR); } } if (!isset($stored)) { $stored = []; } } return $stored; }
/** * Changes an array into an object * * You should set only public and non-static properties values * * @param $class_name string * @param $array array * @return object */ public static function fromArray($class_name, $array) { $object = self::create($class_name); if (isset($array)) { foreach ($array as $property_name => $value) { if (is_array($value)) { $property = new Reflection_Property($class_name, $property_name); if ($property->getType()->isClass()) { $property_class_name = $property->getType()->getElementTypeAsString(); if ($property->getType()->isMultiple()) { foreach ($value as $key => $val) { $value[$key] = self::fromArray($property_class_name, $val); } } else { $value = self::fromArray($property_class_name, $value); } $property->setValue($object, $value); } } $object->{$property_name} = $value; } } return $object; }