Есть модель 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],
Для автора, скорее всего, вопрос уже не актуален, но может кому-нибудь это пригодится.
Столкнулся с такой же проблемой. Решил следующим образом, причём средствами дефолтного валидатора:
1. копируем поле $model->username в $model->oldUsername.
2. в rules пишем следующее:
public function rules() {
return [
//...
['username', 'unique', 'targetClass' => Users::className(), 'message' => 'Имя пользователя уже занято', 'filter' => ['!=', 'username', $this->oldUsername]],
//...
];
}
Тогда уже так:
public function rules() {
return [
//...
['username', 'unique', 'targetClass' => Users::className(), 'message' => 'Имя пользователя уже занято', 'filter' => ['!=', 'id', $this->id]],
//...
];
}
и не надо ничего никуда копировать.
Сделал так по той причине, что для создания формы используется отдельная модель, как в расширенном шаблоне Yii2.
Чтобы изменить пользователя, мы сначала заполняем поля модели формы уже существующими данными. Когда приходит post, данные в полях перезаписываются пришедшими из формы, и тут очень кстати оказываются поля с копиями исходных значений.
Не гнушайтесь читать документацию, конкретно часть про сценарии.
Если коротко - то в Yii для моделей по умолчанию задаются два сценария валидации - insert (при вставке) и update (при обновлении существующей записи). Ваше правило валидации нужно просто поставить для сценария insert и только.
Про роли читал. И правило это как раз для insert. Но, как должно выглядеть правило для update, я не понимаю, ведь по сути все должно быть тоже самое, только валидатору как-то нужно сообщить что текущую запись при проверках нужно пропускать.
Ок, будем считать, что я прописал 2 сценария insert и update, у всех правил выше указал on => 'insert'. Все отлично, все работает, но для update нет никаких проверок. И вот теперь вернемся к вопросу и немного его переформулируем, получится "Как прописать rules() для сценария update?"
@BBird, дефолтный валидатор не расчитан на такой вариант использования, так что вам придется реализовывать свой валидатор на основе стандартного, который так же проверят так же дубликаты на предмет совпадения по ID, например.
Андрей Клюев: Не совсем понял. У Yii2 моделей, по умолчанию используется только один сценарий, что для добавления что для обновления, и называется он default