Правила 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()только.

Подробнее смотрите в документации по сценариям.

Другие вопросы по тегам