Yii2: Использование сценариев при валидации полей
После того, как определены правила валидации для полей формы, можно столкнуться с проблемой. Лично у меня проблема была следующая. Загрузка картинки обязательна. При создании записи всё работает отлично, но вот при редактировании записи у меня опять же срабатывает валидация и поэтому модель само собой не сохраняется. Здесь необходимо воспользоваться валидацией по сценарию. В данной заметке я покажу простой пример валидации по сценарию путем переопределения метода yii\base\Model::scenarios()
.
Способ #1
Добавить в модель константу:
const SCENARIO_CREATE_POST = 'create_post';
Добавить в правила rules()
:
// Поле обязательно к заполнению если используется сценарий 'create_post'
['image', 'required', 'on' => self::SCENARIO_CREATE_POST]
В методе actionCreate()
контроллера PostController
:
$model = new Post(['scenario' => Post::SCENARIO_CREATE_POST]);
// Или
$model = new Post();
$model->scenario = $model::SCENARIO_CREATE_POST;
Теперь поле image
будет обязательным для заполнении только при создании записи.
Способ #2
Добавить в модель константу:
const SCENARIO_UPDATE_POST = 'update_post';
Добавить в правила rules()
:
// Поле обязательно, но валидацию исключить по данному сценарию
['image', 'required', 'except' => self::SCENARIO_UPDATE_POST]
В методе actionUpdate()
контроллера PostController
:
$model = $this->findModel($id);
$model->scenario = $model::SCENARIO_UPDATE_POST;
Здесь поле image
будет так же обязательным для заполнении только при создании записи. (except
- за исключением обновления записи).
Способ #3
Данный способ основан на официальной документации
Добавить в модель константу:
const SCENARIO_UPDATE_POST = 'update_post';
Добавить в правила rules()
:
// Поле обязательно к заполнению
['image', 'required']
Добавить метод scenarios()
:
public function scenarios()
{
$scenarios = parent::scenarios();
// Валидация по указанному сценарию применяется только для поля "name"
$scenarios[self::SCENARIO_UPDATE_POST] = ['name'];
return $scenarios;
}
Или так:
public function scenarios()
{
return ArrayHelper::merge(parent::scenarios(), [
self::SCENARIO_UPDATE_POST => ['name']
]);
}
Предыдущая запись
Yii2: Ошибка requires bower-assetСледующая запись
Yii2: Как вывести ошибки при валидации формы