diff --git a/app/models/Data/Base.php b/app/models/Data/Base.php index 2223d4b..59a92be 100644 --- a/app/models/Data/Base.php +++ b/app/models/Data/Base.php @@ -6,4 +6,21 @@ use Phalcon\Mvc\Model; class Base extends Model { + /** + * {@inheritdoc} + * + * Phalcon throws an exception if no valid snapshot data is present. + * + * We override this behaviour by treating no + * snapshot data (new row) as changed. + * + * @param string|array $fieldName + * @param boolean $allFields + * @return bool + */ + public function hasChanged($fieldName = null, $allFields = false) + { + return $this->hasSnapshotData() === false + || parent::hasChanged($fieldName, $allFields); + } } diff --git a/app/models/Data/User.php b/app/models/Data/User.php index d813e8b..335a874 100644 --- a/app/models/Data/User.php +++ b/app/models/Data/User.php @@ -2,13 +2,12 @@ namespace App\Model\Data; -use Phalcon\Mvc\Model, - Phalcon\Validation, +use Phalcon\Validation, Phalcon\Validation\Validator\Callback as CallbackValidator, InvalidArgumentException, Httpcb\OAuth\UserData\UserDataInterface; -class User extends Model +class User extends Base { const STATUS_ACTIVE = 'Active'; const STATUS_DELETED = 'Deleted'; @@ -49,19 +48,31 @@ class User extends Model public function validation() { - // Validation - $validator = new Validation(); + $rules = [ + 'username' => new CallbackValidator([ + 'callback' => function () { + return $this->findFirstByUsername($this->getUsername()) === false; + }, + 'message' => 'The username already exists.' + ]), + 'email' => new CallbackValidator([ + 'callback' => function() { + return $this->findFirstByEmail($this->getEmail()) === false; + }, + 'message' => 'The email address already exists.' + ]) + ]; - $validator->add('username', new CallbackValidator([ - 'callback' => function() { return $this->findFirstByUsername($this->getUsername()) === false; }, - 'message' => 'The username already exists.' - ])); - $validator->add('email', new CallbackValidator([ - 'callback' => function() { return $this->findFirstByEmail($this->getEmail()) === false; }, - 'message' => 'The email address already exists.' - ])); + $validation = new Validation(); + foreach($rules as $field => $validator) { - return $this->validate($validator); + // Only validate changed fields. + if ($this->hasChanged($field)) { + $validation->add($field, $validator); + } + } + + return $this->validate($validation); } /**