nepster-web
@nepster-web

Как валидировать данные в Yii?

Столкнулся вот с такой проблемой, к примеру есть задача в админ панеле отредактировать данные пользователя

Редактирование данных:
$UsersModel->login = $_POST['login'];
$UsersModel->name  = $_POST['name'];
$UsersModel->password = $_POST['password'];
$UsersModel->special_password = $_POST['special_password'];
$UsersModel->mail = $_POST['mail'];
$UsersModel->active = $_POST['active'];
$UsersModel->trusted = $_POST['trusted'];
$UsersModel->group = $_POST['group'];
$UsersModel->scenario = 'control';


Натыкаюсь на следующие:
Приходят данные, и идут себе на валидацию, валидация честно отрабатывает и получаю проблему:
- такой логин уже есть
- такой mail уже есть
- пароли я храню в cryp() и в форме отображается cryp, однако пароль можно сбросить введя например 123456 и пароль станет таким. Однако если администратор не хочет сбрасывать пароль, то прилетает крипт и валидацию не проходит, хотя-бы по длине символов.

Подскажите пожалуйста как решить проблему с валидацией данных пользователя. Точнее как отредактировать данные таким образом, что бы если не не меняется логин или почта, то не срабатывало правило такой логин/мэйл уже есть.

Правила валидации:
// редактирование в админ панели 
            array('login', 'unique', 'className' => 'UsersModel', 'attributeName' => 'login', 'message'=>$this->getErrorMessage('login'), 'on'=>'control'),
            array('login', 'match', 'allowEmpty'=>false, 'pattern'=>'/^([A-Za-z0-9-_$]){3,16}$/', 'message'=>$this->getErrorMessage('is_login'), 'on'=>'control'),
            array('name', 'match', 'allowEmpty'=>false, 'pattern'=>'/[a-zA-Zа-яА-ЯёЁ]+\s{1}+[a-zA-Zа-яА-ЯёЁ]+$/u', 'message'=>$this->getErrorMessage('name'), 'on'=>'control'),
            array('password,special_password', 'match', 'allowEmpty'=>false, 'pattern'=>'/^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z-_!@,#$%]{6,16}$/', 'message'=>$this->getErrorMessage('is_password'), 'on'=>'control'),
            array('special_password', 'coincidePassword', 'message'=>$this->getErrorMessage('coincide_password'), 'on'=>'control'),
            array('mail', 'is_mail', 'on'=>'control'),
  • Вопрос задан
  • 3146 просмотров
Решения вопроса 1
TekVanDo
@TekVanDo
Javascript Developer
Сделайте проверку на $this->isNewRecord примерно так

public function rules(){
	$rules  = array( 
		array('login', 'match', 'allowEmpty'=>false, 'pattern'=>'/^([A-Za-z0-9-_$]){3,16}$/', 'message'=>$this->getErrorMessage('is_login'), 'on'=>'control'),
		array('name', 'match', 'allowEmpty'=>false, 'pattern'=>'/[a-zA-Zа-яА-ЯёЁ]+\s{1}+[a-zA-Zа-яА-ЯёЁ]+$/u', 'message'=>$this->getErrorMessage('name'), 'on'=>'control'),
		array('password,special_password', 'match', 'allowEmpty'=>false, 'pattern'=>'/^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z-_!@,#$%]{6,16}$/', 'message'=>$this->getErrorMessage('is_password'), 'on'=>'control'),
		array('special_password', 'coincidePassword', 'message'=>$this->getErrorMessage('coincide_password'), 'on'=>'control'),
	);
	if($this->isNewRecord){
		$rules_for_new = array(
			array('login', 'unique', 'className' => 'UsersModel', 'attributeName' => 'login', 'message'=>$this->getErrorMessage('login'), 'on'=>'control'),
			array('mail', 'is_mail', 'on'=>'control'),
		);
		$rules = array_merge($rules,$rules_for_new);
	}
	return $rules;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы