/** * tests validity of the record using the current data. * * (This is an override of base Doctrine functionality, to fix a bug with validation.) * * @param boolean $deep (optional) run the validation process on the relations * @param boolean $hooks (optional) invoke save hooks before start * @return boolean whether or not this record is valid */ public function isValid($deep = false, $hooks = true) { if (!$this->_table->getAttribute(Doctrine_Core::ATTR_VALIDATE)) { return true; } if ($this->_state == self::STATE_LOCKED || $this->_state == self::STATE_TLOCKED) { return true; } if ($hooks) { $this->invokeSaveHooks('pre', 'save'); $this->invokeSaveHooks('pre', $this->exists() ? 'update' : 'insert'); } // Clear the stack from any previous errors. $this->getErrorStack()->clear(); // Run validation process $event = new Doctrine_Event($this, Doctrine_Event::RECORD_VALIDATE); $this->preValidate($event); $this->getTable()->getRecordListener()->preValidate($event); if (!$event->skipOperation) { $validator = new Doctrine_Validator(); $validator->validateRecord($this); $this->validate(); if ($this->_state == self::STATE_TDIRTY || $this->_state == self::STATE_TCLEAN) { $this->validateOnInsert(); } else { $this->validateOnUpdate(); } } $this->getTable()->getRecordListener()->postValidate($event); $this->postValidate($event); $valid = $this->getErrorStack()->count() == 0 ? true : false; if ($valid && $deep) { $stateBeforeLock = $this->_state; $this->_state = $this->exists() ? self::STATE_LOCKED : self::STATE_TLOCKED; foreach ($this->_references as $reference) { if ($reference instanceof Doctrine_Record) { if (!($valid = $reference->isValid($deep))) { break; } } elseif ($reference instanceof Doctrine_Collection) { foreach ($reference as $record) { if (!($valid = $record->isValid($deep, $hooks))) { break; } } // Bugfix. if (!$valid) { break; } } } $this->_state = $stateBeforeLock; } return $valid; }
/** * isValid * * @return boolean whether or not this record is valid */ public function isValid() { if (!$this->_table->getAttribute(Doctrine::ATTR_VALIDATE)) { return true; } // Clear the stack from any previous errors. $this->getErrorStack()->clear(); // Run validation process $event = new Doctrine_Event($this, Doctrine_Event::RECORD_VALIDATE); $this->preValidate($event); $this->getTable()->getRecordListener()->preValidate($event); if (!$event->skipOperation) { $validator = new Doctrine_Validator(); $validator->validateRecord($this); $this->validate(); if ($this->_state == self::STATE_TDIRTY || $this->_state == self::STATE_TCLEAN) { $this->validateOnInsert(); } else { $this->validateOnUpdate(); } } $this->getTable()->getRecordListener()->postValidate($event); $this->postValidate($event); return $this->getErrorStack()->count() == 0 ? true : false; }
public function checkValidation($deep = true, $hooks = true) { $invalidRecords = array(); if (!$this->_table->getAttribute(Doctrine::ATTR_VALIDATE)) { return true; } if ($this->_state == self::STATE_LOCKED || $this->_state == self::STATE_TLOCKED) { return true; } if ($hooks) { $this->invokeSaveHooks('pre', 'save'); $this->invokeSaveHooks('pre', $this->exists() ? 'update' : 'insert'); } // Clear the stack from any previous errors. $this->getErrorStack()->clear(); // Run validation process $event = new Doctrine_Event($this, Doctrine_Event::RECORD_VALIDATE); $this->preValidate($event); $this->getTable()->getRecordListener()->preValidate($event); if (!$event->skipOperation) { $validator = new Doctrine_Validator(); $validator->validateRecord($this); $this->validate(); if ($this->_state == self::STATE_TDIRTY || $this->_state == self::STATE_TCLEAN) { $this->validateOnInsert(); } else { $this->validateOnUpdate(); } } $this->getTable()->getRecordListener()->postValidate($event); $this->postValidate($event); $valid = $this->getErrorStack()->count() == 0 ? true : false; if (!$valid) { $invalidRecords[] = $this; } if ($deep) { $stateBeforeLock = $this->_state; $this->_state = $this->exists() ? self::STATE_LOCKED : self::STATE_TLOCKED; foreach ($this->_references as $reference) { if ($reference instanceof Doctrine_Record) { if (!method_exists($reference, 'checkValidation')) { continue; } $valid = $reference->checkValidation($deep); if (is_array($valid) && !empty($valid)) { $invalidRecords = array_merge($valid, $invalidRecords); } } else { if ($reference instanceof Doctrine_Collection) { foreach ($reference as $record) { if (!method_exists($record, 'checkValidation')) { continue; } $valid = $record->checkValidation($deep); if (is_array($valid) && !empty($valid)) { $invalidRecords = array_merge($valid, $invalidRecords); } } } } } $this->_state = $stateBeforeLock; } return $invalidRecords; }
public function testValidate() { $this->manager->setAttribute(Doctrine_Core::ATTR_VALIDATE, Doctrine_Core::VALIDATE_ALL); $user = $this->connection->getTable('User')->find(4); $set = array('password' => 'this is an example of too long password', 'loginname' => 'this is an example of too long loginname', 'name' => 'valid name', 'created' => 'invalid'); $user->setArray($set); $email = $user->Email; $email->address = 'zYne@invalid'; $this->assertTrue($user->getModified() == $set); $validator = new Doctrine_Validator(); $validator->validateRecord($user); $stack = $user->errorStack(); $this->assertTrue($stack instanceof Doctrine_Validator_ErrorStack); $this->assertTrue(in_array('length', $stack['loginname'])); $this->assertTrue(in_array('length', $stack['password'])); $this->assertTrue(in_array('type', $stack['created'])); $validator->validateRecord($email); $stack = $email->errorStack(); $this->assertTrue(in_array('email', $stack['address'])); $email->address = '*****@*****.**'; $validator->validateRecord($email); $stack = $email->errorStack(); $this->assertTrue(in_array('unique', $stack['address'])); $this->manager->setAttribute(Doctrine_Core::ATTR_VALIDATE, Doctrine_Core::VALIDATE_NONE); }
/** * isValid * * @return boolean whether or not this record is valid */ public function isValid() { if (!$this->_table->getAttribute(Doctrine::ATTR_VALIDATE)) { return true; } // Clear the stack from any previous errors. $this->_errorStack->clear(); // Run validation process $validator = new Doctrine_Validator(); $validator->validateRecord($this); $this->validate(); if ($this->_state == self::STATE_TDIRTY || $this->_state == self::STATE_TCLEAN) { $this->validateOnInsert(); } else { $this->validateOnUpdate(); } return $this->_errorStack->count() == 0 ? true : false; }