Правила Yii2 работают только сценарий использования
Я пишу два сценария в модели комментариев Yii2, когда пользователь вошел в систему или является гостем.
мои правила таковы:
public function rules()
{
return [
[['user_id'], 'required', 'on' => self::SCENARIO_USER],
[['name', 'email'], 'required', 'on' => self::SCENARIO_GUEST],
[['post_id', 'body', 'date'], 'required'],
[['user_id', 'parent_id', 'post_id', 'status'], 'integer'],
[['body'], 'string'],
[['date'], 'safe'],
[['name', 'email', 'site'], 'string', 'max' => 256],
];
}
и функция senarios:
public function scenarios()
{
$scenarios = parent::scenarios();
$scenarios[self::SCENARIO_GUEST] = ['name' , 'email'];
$scenarios[self::SCENARIO_USER] = ['user_id'];
return $scenarios;
}
Я использую это следующим образом:
$commentModel = Yii::$app->user->isGuest ? new Comment(['scenario' => Comment::SCENARIO_GUEST]) : new Comment(['scenario' => Comment::SCENARIO_USER]);
если гостевая форма просмотра, только имя и адрес электронной почты отмечены и пользователь заполняет форму, поле не отмечено! почему другие правила не проверяют? как это исправить?
2 ответа
См. Сценарии Yii2
Метод scenarios() возвращает массив, ключами которого являются имена сценариев, и значения соответствующих активных атрибутов. Активный атрибут может быть назначен массово и подлежит проверке.
public function scenarios()
{
$scenarios = parent::scenarios();
$scenarios[self::SCENARIO_GUEST] = ['name' , 'email', 'date', 'body', 'site', 'post_id'];
$scenarios[self::SCENARIO_USER] = ['user_id', 'date', 'body', 'site', 'post_id'];
return $scenarios;
}
Если вы используете scenarios()
вам нужно определить все атрибуты, которые можно назначить в данном сценарии. Так что если вы хотите разрешить гостю редактировать такжеbody
а такжеdate
вам нужно что-то вроде:
public function scenarios()
{
$scenarios = parent::scenarios();
$scenarios[self::SCENARIO_GUEST] = ['name' , 'email', 'body', 'date'];
$scenarios[self::SCENARIO_USER] = ['user_id'];
return $scenarios;
}
Если у вас есть много "общих" атрибутов между сценариями, вам, вероятно, не следует переопределять этот метод и определять его вrules()
только.
Подробнее смотрите в документации по сценариям.