/** * 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; }