@ptand

Отображение ошибок валидации свойств модели в форме?

Всем привет, есть модель
class User extends ActiveRecord 
{
public $var1;
const SCENARIO_VAR1 = 'var1';

 public function rules()
    {
        return [
         [['var1', 'var2'], 'required', 'on' => self::SCENARIO_VAR1],
         ];
    }
}
</cod>
В форме, к примеру, 2 поля
<code lang="php">
<?php $form = ActiveForm::begin([
            'id'=>'form-three',
            'action' => '/site/save',
            'validationUrl' => '/site/validate',
            'enableAjaxValidation'=>true,
            'validateOnChange'=>false,
            'validateOnBlur'=>false,
        ]) ?>

<?= $form->field($user, 'var1')->widget(Select2::classname(), [
            'data'=>ArrayHelper::map(ArrVar1::find()->orderBy('name')->all(), 'id', 'name'),
            'size'=>'lg',
            'options'=>[
                'class'=>'form-control input-lg',
                'placeholder'=>'Выберите варианты 1',
                'multiple'=>true,
            ],
        ])->label(false)
        ?>
<?= $form->field($user, 'var2')->textInput(['placeholder'=>'Введите вариант 2', 'class'=>'form-control input-lg'])->label(false) ?>
</code>

Действие валидации
<code lang="php">
public function actionValidate()
    {
        $cookies = Yii::$app->request->cookies;
        $model_user = User::findByEmail($cookies->getValue('email', null));
        $model_user->scenario = User::SCENARIO_VAR1;

        if (Yii::$app->request->isAjax && $model_user->load(Yii::$app->request->post())) {
            \Yii::$app->response->format = Response::FORMAT_JSON;
            return ActiveForm::validate($model_user);
        }
    }
</code>

Если поля не заполнены, после отправки формы аяксом в экшн валидации в респонсе прилетают обе! ошибки, но в форме отображаются только var2. Если убрать сценарий то все отображается нормально. Не могу понять почему, есть у кого какие мысли?
  • Вопрос задан
  • 107 просмотров
Пригласить эксперта
Ответы на вопрос 2
slo_nik
@slo_nik Куратор тега Yii
ну регистрация в два этапа=) В модальном окне заполняешь фио и прочую лабуду, затем нажимаешь далее, открывается вкладка где надо еще заполнить доп информацию, специальность стаж работы например.

Для этого сценарии не нужны. Разбить регистрацию на два этапа можно при помощи cookies.
Сценариями можно разделить, например, валидацию регистрации и авторизации на сайте.
Вот пример из документации
class User extends ActiveRecord
{
    const SCENARIO_LOGIN = 'login';
    const SCENARIO_REGISTER = 'register';

    public function scenarios()
    {
        return [
            self::SCENARIO_LOGIN => ['username', 'password'],
            self::SCENARIO_REGISTER => ['username', 'email', 'password'],
        ];
    }
}

В данном примере SCENARIO_LOGIN используется при авторизации, то есть, будут валидироваться username и password. SCENARIO_REGISTER будет применяться при регистрации, при этом будут проверяться username, password и email. В Вашем случае в этот сценарий можно будет добавить ещё дополнительные атрибуты для проверки, например телефон или адрес или ещё что-то.
Ваш же сценарий, const SCENARIO_VAR1 = 'var1', вообще не сценарий, это что-то непонятное.
И ещё, если Вы собираетесь сохранять данные в таблице, то удалите из модели public $var1, иначе в базу будет писаться пустое значение.

p.s. Документация
Ответ написан
@ptand Автор вопроса
В общем решил проблему задав в правилах ['var1', 'safe'] Ошибка в форме отображается, почему так работает я так и не понял. Вычитал, что к свойствам надо обращаться через attributes, возможно в этом собака зарыта, так как после валидации делаю вардамп модели и там нет атрибута var1 а только поля таблицы бд. Но копать в эту сторону не стал так как времени нет.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы