Сценарий YII: как?
Что если у меня есть поле ввода, например:
- USEREMAIL:
- UserPhoneNumber:
- UserOldPasword:
- UserNewPassword:
- UserRetypePassword:
И при обновлении моего действия мне потребуется только UserNewPassword, если UserOldPassword не пуст, иначе необходимо обновить только UserEmail или UserPhoneNumber. Как я реализую это правило - только при обновлении? Или я должен создать собственный валидатор на моей модели?
поэтому на моем afterFind() у меня есть этот код, чтобы избежать вывода хэшированного пароля:
public function afterFind()
{
//reset the password to null because we don't want the hash to be shown.
$this->old_password = $this->password;
$this->password = null;
parent::afterFind();
}
и я создал пользовательскую проверку. он действительно проверяет, проблема в том, что даже если я отправил форму с пустым UserNewPassword, я все еще получаю сообщение об ошибке, и поле $this->password теперь возвращает хешированное значение из моей базы данных
Пожалуйста, посмотрите мой код и исправьте мои ошибки:
public function checkForEmpty($attribute,$params){
if(!empty($this->$attribute)){
if(empty($params['oldPassword'])){
$this->addError('oldPassword','We require your old password to proceed changing password');
}
if(empty($params['retypePassword'])){
$this->addError('retype_password','To assure that you type the right password please retype your password');
}
if(!empty($params['oldPassword']) && !empty($params['retypePassword'])){
$this->compareOldPass($params['oldPassword'],$this->old_password);
}
}
}
Заранее спасибо...
1 ответ
Вы можете сделать beforeSave() в вашей модели. Я думаю, что это лучшее решение из-за вашей сложной логики, а не из-за глобальной проблемы вашего приложения.
ОБНОВИТЬ:
public function beforeSave()
{
if(parent::beforeSave())
{
//implement you logic here
//or check it is a new record
if($this->isNewRecord)
{
// do stuff here if new
}
//or you can return false if it doesn't meet your logic
return true;
}
else
return false;
}