Задать вопрос

Как настроить Rules() для модели в Yii2

Есть модель UserForm (из коробки она идет, как SignupForm в frontend) для формы добавления пользователя/регистрации пользователя. Хочу использовать эту же модель для редактирования пользователя и изменения личных данных пользователем.

Как правильно настроить rules(), чтобы при валидации unique-полей не проверялся изменяемый пользователь.

По дефолту настроено так:
public function rules()
{
return [
['username', 'filter', 'filter' => 'trim'],
['username', 'required'],
['username', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This username has already been taken.'],
['username', 'string', 'min' => 2, 'max' => 255],

['email', 'filter', 'filter' => 'trim'],
['email', 'required'],
['email', 'email'],
['email', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This email address has already been taken.'],

['password', 'required'],
['password', 'string', 'min' => 6],
];
}
  • Вопрос задан
  • 14901 просмотр
Подписаться 5 Оценить Комментировать
Решения вопроса 1
Для автора, скорее всего, вопрос уже не актуален, но может кому-нибудь это пригодится.
Столкнулся с такой же проблемой. Решил следующим образом, причём средствами дефолтного валидатора:
1. копируем поле $model->username в $model->oldUsername.
2. в rules пишем следующее:
public function rules() {
    return [
        //...
        ['username', 'unique', 'targetClass' => Users::className(), 'message' => 'Имя пользователя уже занято', 'filter' => ['!=', 'username', $this->oldUsername]],
        //...
    ];
}

Собственно, вот страница документации, которая помогла решить проблему: www.yiiframework.com/doc-2.0/yii-validators-unique...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Не гнушайтесь читать документацию, конкретно часть про сценарии.

Если коротко - то в Yii для моделей по умолчанию задаются два сценария валидации - insert (при вставке) и update (при обновлении существующей записи). Ваше правило валидации нужно просто поставить для сценария insert и только.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы