/** * Returns true if and only if $value meets the validation requirements * * If $value fails validation, then this method returns false, and * getMessages() will return an array of messages that explain why the * validation failed. * * @param mixed $value * @param array $context * @return boolean * @throws \Zend_Validate_Exception If validation of $value is impossible */ public function isValid($value, $context = array()) { $this->_setValue($value); // Make sure the (optionally filtered) value is in the context $context[reset($this->_fields)] = $value; $filter = array(); foreach ($this->_fields as $name) { // Return valid when not all the fields to check for are in the context if (!isset($context[$name])) { return true; } $filter[$name] = $context[$name]; } $check = array(); $doGet = $this->_model->hasItemsUsed(); $keys = $this->_model->getKeys(); foreach ($keys as $id => $key) { if ($doGet) { // Make sure the item is used $this->_model->get($key); } if (isset($context[$id])) { $check[$key] = $context[$id]; } elseif (isset($context[$key])) { $check[$key] = $context[$key]; } else { // Not all keys are in => therefore this is a new item $check = false; break; } } $rows = $this->_model->load($filter); if (!$rows) { return true; } if (!$check) { // Rows where found while it is a new item $this->_error(self::ERROR_RECORD_FOUND); return false; } $count = count($check); foreach ($rows as $row) { // Check for return of the whole check if (count(array_intersect_assoc($check, $row)) !== $count) { // There exists a row with the same values but not the same keys $this->_error(self::ERROR_RECORD_FOUND); return false; } } return true; }
/** * The transform function performs the actual transformation of the data and is called after * the loading of the data in the source model. * * @param \MUtil_Model_ModelAbstract $model The parent model * @param array $data Nested array * @param boolean $new True when loading a new item * @param boolean $isPostData With post data, unselected multiOptions values are not set so should be added * @return array Nested array containing (optionally) transformed data */ public function transformLoad(\MUtil_Model_ModelAbstract $model, array $data, $new = false, $isPostData = false) { if (!$data) { return $data; } //* $row = reset($data); if (!$this->crossTabs) { return $data; } $keys = $model->getKeys(); $keys = array_combine($keys, $keys); $default = array_fill_keys(array_keys(array_diff_key($this->_fields, $this->excludes)), null); $results = array(); // \MUtil_Echo::track($default); foreach ($data as $row) { foreach ($this->crossTabs as $crossTab) { $name = $crossTab['pre'] . $row[$crossTab['id']]; $key = implode("\t", array_intersect_key($row, $keys)); if (!isset($results[$key])) { $results[$key] = array_diff_key($row, $this->excludes) + $default; } $results[$key][$name] = $row[$crossTab['val']]; } } if (\MUtil_Model::$verbose) { \MUtil_Echo::r($results, 'Transform output'); } return $results; }
/** * Returns true if name is in the model * * @param string $name * @return boolean */ public function has($name) { if ($this->model->has($name)) { return true; } $modelKeys = $this->model->getKeys(); return (bool) isset($modelKeys[$name]); }
/** * Returns an array of the field names that are required * * @return array of fields sourceName => targetName */ public function getRequiredFields() { $trans = $this->getFieldsTranslations(); $keys = array_fill_keys($this->_targetModel->getKeys(), true); $output = array(); foreach ($trans as $input => $source) { if (isset($keys[$source])) { $output[$input] = $source; } } return $output; }