У меня есть сайт, разработанный в cakephp. У меня есть модель под названием «Пользователь»:
class User extends AppModel { public $name = 'User'; public $validate = array( 'username' => array( 'not_empty' => array( 'rule'=> 'notEmpty', 'message'=> 'Username not empty' ) ), 'email' => array( 'email_invalid' => array( 'rule' => 'email', 'message' => 'Invalid mail' ), 'email_unique' => array( 'rule' => 'isUnique', 'message' => 'Mail already exist inside database' ) ) ); public function beforeSave(){ if (isset($this->data['User']['password'])){ $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']); } } }
В моем подтверждении у меня есть правила email_unique
которые проверяют, присутствует ли в базе данных другое электронное сообщение.
Когда я обновляю пользователя, я делаю это внутри своего контроллера:
$this->User->id = $this->request->data['User']['id']; if ($this->User->save($this->request->data)) { $this->redirect (array ('action'=>'index')); } else{ $this->Session->write('flash_element','error'); $this->Session->setFlash ('Error'); }
Он всегда терпит неудачу, потому что электронная почта не уникальна, но является той же самой записью!
Я хотел бы знать, какой лучший способ избежать проверки, если сохранение – это обновление, а не создание? Или что-то вроде: проверьте, нет ли прав на редактирование страницы, или я не знаю. Может быть, есть много системы, я хотел бы знать, что является более правильным для моей проблемы.
благодаря
Вы можете настроить свои правила проверки только для применения при создании новой записи, а не при обновлении существующей записи. Вы можете сделать это, установив ключ on
в правиле проверки для create
, чтобы он выглядел следующим образом:
'email_unique' => array( 'rule' => 'isUnique', 'message' => 'Mail already exist inside database', 'on' => 'create' // Only apply this rule upon creation of a new record )
Дополнительную информацию см. В документации по этому вопросу.
Если вы также хотите заблокировать дублирование электронной почты при обновлении, создайте метод beforeSave в своей модели пользователя, ища адрес электронной почты:
public function beforeSave($options = array()) { // If the email key is set in the data to be saved... if (isset($this->data[$this->alias]['email'])) { // Make sure the email is not already in use by another user if ($this->find('count', array( 'conditions' => array( $this->alias . '.id !=' => $this->data[$this->alias]['id'], $this->alias . '.email' => $this->data[$this->alias]['email'] ) )) > 0) { // The email is found for a user with another id, abort! return false; } } }