/** * Merge the given object's validation results the response feedback. * * @param ModelInterface $obj The validated object. * @param string[]|string|null $filters Filter the levels to merge. * @throws InvalidArgumentException If the filters are invalid. * @return SaveAction Chainable */ public function addFeedbackFromValidation(ModelInterface $obj, $filters = null) { $validator = $obj->validator(); $levels = [ModelValidator::ERROR, ModelValidator::WARNING, ModelValidator::NOTICE]; if (is_string($filters) && in_array($filters, $levels)) { $results = call_user_func([$validator, $filters . 'Results']); foreach ($results as $result) { $this->addFeedback($result->level(), $result->message()); } return $this; } if (!is_array($filters) && $filters !== null) { throw new InvalidArgumentException('Filters must be an array of validation levels or NULL'); } $validation = $validator->results(); foreach ($validation as $level => $results) { if ($filters === null || in_array($level, $filters)) { foreach ($results as $result) { $this->addFeedback($result->level(), $result->message()); } } } return $this; }
/** * Filter the object before its assigned to the row. * * This method is useful for classes using this trait. * * @param ModelInterface $object The current row's object. * @param array $objectProperties The $object's display properties. * @return array */ protected function parseObjectRow(ModelInterface $object, array $objectProperties) { return ['object' => $object, 'objectId' => $object->id(), 'objectProperties' => $objectProperties]; }
/** * Render the choice from the object. * * @param ModelInterface|ViewableInterface $obj The object or view to render as a label. * @return string */ protected function objPattern($obj) { $pattern = (string) $this->pattern(); if ($obj instanceof ViewableInterface && $obj->view() !== null) { return $obj->renderTemplate($pattern); } else { $cb = function ($matches) use($obj) { $method = trim($matches[1]); if (method_exists($obj, $method)) { return call_user_func([$obj, $method]); } elseif (isset($obj[$method])) { return $obj[$method]; } else { return ''; } }; return preg_replace_callback('~\\{\\{\\s*(.*?)\\s*\\}\\}~i', $cb, $pattern); } }
/** * Get all the fields of a model. * * @param ModelInterface $model The model to get fields from. * @param array|null $properties Optional list of properties to get. If null, retrieve all (from metadata). * @return array * @todo Move this method in StorableTrait or AbstractModel */ private function getModelFields(ModelInterface $model, $properties = null) { if ($properties === null) { // No custom properties; use all (from model metadata) $properties = array_keys($model->metadata()->properties()); } else { // Ensure the key is always in the required fields. $properties = array_merge($properties, [$model->key()]); } $fields = []; foreach ($properties as $propertyIdent) { $p = $model->p($propertyIdent); if (!$p || !$p->active() || !$p->storable()) { continue; } $v = $model->propertyValue($propertyIdent); foreach ($p->fields($v) as $fieldIdent => $field) { $fields[$field->ident()] = $field; } } return $fields; }
/** * Manually add an object to the list * * @param ModelInterface $obj The object to add. * @return \Charcoal\Collection (Chainable) */ public function add(ModelInterface $obj) { $this->objects[] = $obj; $this->map[$obj->id()] = $obj; // Chainable return $this; }
/** * Add an object to the cache store. * * @param ModelInterface $obj The object to store. * @return HierarchicalInterface Chainable */ private function addObjectToCache(ModelInterface $obj) { static::$objectCache[$this->objType()][$obj->id()] = $obj; return $this; }