public function testBuildMultiple() { $this->assume(__METHOD__ . '.simple', (new Tools\Search_Array_Builder())->buildMultiple(['pro1', 'pro2'], 'test'), Func::orOp(['pro1' => 'test', 'pro2' => 'test'])); $this->assume(__METHOD__ . '.and', (new Tools\Search_Array_Builder())->buildMultiple(['pro1', 'pro2'], 'test what'), Func::andOp([Func::orOp(['pro1' => 'test', 'pro2' => 'test']), Func::orOp(['pro1' => '%what', 'pro2' => '%what'])])); $this->assume(__METHOD__ . '.or', (new Tools\Search_Array_Builder())->buildMultiple(['pro1', 'pro2'], 'test,what'), Func::orOp(['pro1' => ['test', 'what'], 'pro2' => ['test', 'what']])); $this->assume(__METHOD__ . '.mix', (new Tools\Search_Array_Builder())->buildMultiple(['pro1', 'pro2'], 'test,what else'), Func::orOp(['pro1' => ['test', Func::andOp(['what', '%else'])], 'pro2' => ['test', Func::andOp(['what', '%else'])]])); }
/** * @param $property_names_or_class string[]|Reflection_Class * @param $search_phrase string * @param $prepend string * @param $append string * @return Logical|array */ public function buildMultiple($property_names_or_class, $search_phrase, $prepend = '', $append = '') { $property_names = $property_names_or_class instanceof Reflection_Class ? $this->classRepresentativeProperties($property_names_or_class) : $property_names_or_class; // search phrase contains OR if (strpos($search_phrase, $this->or) !== false) { $or = []; foreach ($property_names as $property_name) { $or[$property_name] = $this->build('', $search_phrase, $prepend, $append); } $result = Func::orOp($or); } elseif (strpos($search_phrase, $this->and) !== false) { $and = []; foreach (explode($this->and, $search_phrase) as $search) { $and[] = $this->buildMultiple($property_names, $search, $prepend, $append); $prepend = '%'; } $result = Func::andOp($and); } else { $or = []; foreach ($property_names as $property_name) { $or[$property_name] = $prepend . $search_phrase . $append; } $result = count($or) > 1 ? Func::orOp($or) : $or; } return $result; }
/** * 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 ''; }