/** * Run the default json controller * * @param $parameters Parameters * @param $form array * @param $files array * @param $class_name string * @return string */ public function run(Parameters $parameters, $form, $files, $class_name) { $parameters = $parameters->getObjects(); // read all objects corresponding to class name if (!$parameters) { return json_encode(Dao::readAll(Names::setToClass($class_name, false), [Dao::sort()])); } // read object $first_parameter = reset($parameters); if (is_object($first_parameter)) { return json_encode($first_parameter); } // search objects for autocomplete combo pull-down list if (isset($parameters['term'])) { $element_class_name = Names::setToClass($class_name, false); $search = null; if (!empty($parameters['term'])) { $search = (new Search_Array_Builder())->buildMultiple(new Reflection_Class($element_class_name), $parameters['term'], '', '%'); } if (isset($parameters['filters']) && $parameters['filters']) { if (!(is_object($search) && $search->isAnd())) { $search = Dao\Func::andOp($search ? [$search] : []); } foreach ($parameters['filters'] as $filter_name => $filter_value) { $search->arguments[$filter_name] = $filter_value[0] == '!' ? Dao\Func::notEqual(substr($filter_value, 1)) : $filter_value; } if (count($search->arguments) == 1) { reset($search->arguments); $search = [key($search->arguments) => current($search->arguments)]; } } $objects = []; // first object only if (isset($parameters['first']) && $parameters['first']) { $objects = Dao::search($search, $element_class_name, [Dao::sort(), Dao::limit(1)]); $source_object = $objects ? reset($objects) : Builder::create($element_class_name); return json_encode(new Autocomplete_Entry(Dao::getObjectIdentifier($source_object), strval($source_object))); } else { $search_options = [Dao::sort()]; if (isset($parameters['limit'])) { $search_options[] = Dao::limit($parameters['limit']); } foreach (Dao::search($search, $element_class_name, $search_options) as $source_object) { $objects[] = new Autocomplete_Entry(Dao::getObjectIdentifier($source_object), strval($source_object)); } return json_encode($objects); } } elseif (isset($parameters['id'])) { $element_class_name = Names::setToClass($class_name); $source_object = Dao::read($parameters['id'], $element_class_name); return json_encode(new Autocomplete_Entry(Dao::getObjectIdentifier($source_object), strval($source_object))); } return ''; }
/** * Get current environment name possible values * * @return mixed[] */ public function values() { $type = $this->property->getType(); if ($type->isClass()) { return Dao::readAll($this->property->getType()->asString(), [Dao::sort()]); } elseif ($values = $this->property->getListAnnotation('values')->values()) { return array_combine($values, $values); } else { trigger_error("Unable to get {$this->property->name} environment values from type " . $type->asString(), E_USER_ERROR); return null; } }
/** * Generic getter for mapped objects * * @param $stored object[] actual value of the property (will be returned if not null) * @param $object object the parent object * @param $property string|Reflection_Property the source property (or name) for map reading * @return Component[] */ public static function &getMap(&$stored, $object, $property) { if (!(self::$ignore || isset($stored))) { if (Dao::getObjectIdentifier($object)) { if (!$property instanceof Reflection_Property) { $property = new Reflection_Property(get_class($object), $property); } $dao = ($dao = $property->getAnnotation('dao')->value) ? Dao::get($dao) : Dao::current(); $class_name = get_class($object); $linked_class_name = (new Link_Class($class_name))->getLinkedClassName(); if ($linked_class_name) { $object = (new Link_Class($class_name))->getCompositeProperty()->getValue($object); $class_name = $linked_class_name; } $element_type = $property->getType()->getElementType(); $is_abstract = $element_type->asReflectionClass()->isAbstract(); $sort = $is_abstract ? Dao::sort(['id']) : Dao::sort(); $stored = $dao->search([$class_name . '->' . $property->name => $object], $element_type->asString(), [$sort]); if ($is_abstract) { $sort->sortObjects($stored); } } else { $stored = []; } } return $stored; }