/** * Property select controller, starting from a given root class * * @param $parameters Parameters * - first : the root reference class name (ie a business object) * - second : if set, the selected property path into the root reference class name * @param $form array not used * @param $files array not used * @return mixed */ public function run(Parameters $parameters, $form, $files) { $class_name = Set::elementClassNameOf($parameters->shiftUnnamed()); $property_path = $parameters->shiftUnnamed(); if (empty($property_path)) { $top_property = new Property(); $top_property->class = $class_name; $properties = $this->getProperties(new Reflection_Class($class_name)); foreach ($properties as $property) { $property->path = $property->name; } } else { $top_property = new Reflection_Property($class_name, $property_path); $properties = $this->getProperties(new Reflection_Class($top_property->getType()->getElementTypeAsString()), $top_property->final_class); foreach ($properties as $property) { $property->path = $property_path . DOT . $property->name; } if (!$parameters->getRawParameter(Parameter::CONTAINER)) { $parameters->set(Parameter::CONTAINER, 'subtree'); } } $objects = $parameters->getObjects(); array_unshift($objects, $top_property); $objects['properties'] = $properties; $objects['class_name'] = $class_name; $objects['display_full_path'] = false; /** * Objects for the view : * first Property the property object (with selected property name, or not) * 'properties' Reflection_Property[] all properties from the reference class */ return View::run($objects, $form, $files, Property::class, 'select'); }
/** * Parse URI text elements to transform them into parameters, feature name and controller name * * @example $uri = ['order', 148, 'form') will result on controller 'Order_Form' with parameter 'Order' = 148 * @param $uri string[] */ private function parseUri($uri) { // get main object = controller name $key = 0; $controller_element = ''; foreach ($uri as $key => $controller_element) { if (ctype_lower($controller_element[0]) || is_numeric($controller_element)) { break; } } if ($controller_element && ctype_upper($controller_element[0])) { $key++; } $this->controller_name = join(BS, array_slice($uri, 0, $key)); $uri = array_splice($uri, $key); // get main object (as first parameter) and feature name $this->feature_name = array_shift($uri); $this->parameters = new Parameters($this); if (is_numeric($this->feature_name)) { $this->parameters->set($this->controller_name, intval($this->feature_name)); $this->feature_name = array_shift($uri); if (!$this->feature_name) { $this->feature_name = Feature::F_OUTPUT; } } elseif ($this->controller_name && !$this->feature_name) { if (@class_exists($this->controller_name)) { $this->feature_name = Feature::F_ADD; } elseif (@class_exists(Names::setToClass($this->controller_name))) { $this->feature_name = Feature::F_LIST; } else { $this->feature_name = Feature::F_DEFAULT; } } // get main parameters $controller_elements = []; foreach ($uri as $uri_element) { if (ctype_upper($uri_element[0])) { $controller_elements[] = $uri_element; } else { if (is_numeric($uri_element)) { $this->parameters->set(join(BS, $controller_elements), intval($uri_element)); } else { if ($controller_elements) { $this->parameters->addValue(join(BS, $controller_elements)); } $this->parameters->addValue($uri_element); } $controller_elements = []; } } if ($controller_elements) { $this->parameters->addValue(join(BS, $controller_elements)); } }
/** * @param $parameters Parameters * @param $form array * @param $files array * @return mixed */ public function run(Parameters $parameters, $form, $files) { $parameters->set(Parameter::CONTAINER, 'inside_tree'); $search = $parameters->getRawParameter('search'); if (empty($search)) { return parent::run($parameters, $form, $files); } $search = strtolower(str_replace([DOT, '*', '?'], [BS . DOT, '.*', '.?'], strSimplify($search, '.*? ' . BS))); $class_name = Names::setToClass($parameters->shift()); $properties = $this->searchProperties($class_name, $search); $top_property = new Property(); $top_property->class = $class_name; $objects = $parameters->getObjects(); array_unshift($objects, $top_property); $objects['class_name'] = $class_name; $objects['properties'] = $properties; $objects['display_full_path'] = true; return View::run($objects, $form, $files, Property::class, 'select'); }
/** * This will be called for this controller, always. * * @param $parameters Parameters * @param $form array * @param $files array * @return mixed */ public function run(Parameters $parameters, $form, $files) { $environment = Session::current()->get(Environment::class, true); $objects = $parameters->getObjects(); $set_value = isset($objects['']) ? $objects[''] : (isset($objects[1]) ? $objects[1] : null); $name = $objects[0]; $this->property = (new Reflection_Class($environment))->getProperty($name); if ($set_value) { $type = $this->property->getType(); $environment->{$name} = $type->isClass() ? Dao::read($set_value, $type->asString()) : $set_value; $parameters->set('selected', true); return (new Output_Controller())->run($parameters, $form, $files); } else { $objects['controller'] = $this; $objects['name'] = $name; $objects = array_merge([get_class($environment) => $environment], $objects); return View::run($objects, $form, $files, get_class($environment), Feature::F_SELECT); } }