Добавление модели в несколько этапов

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
antoncrimea
Сообщения: 12
Зарегистрирован: 2015.01.26, 16:50

Добавление модели в несколько этапов

Сообщение antoncrimea »

Привет. Как можно реализовать добавление модели в несколько этапов. Визард. На первом шаге добавлем 3 поля, проверяем, все ок. Далее еще 3 и так 4 шага.

Нужно еще иметь возможность возвращаться. Как это можно реализовать?
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: Добавление модели в несколько этапов

Сообщение astronin »

как обычно, а в чем проблема-то?
antoncrimea
Сообщения: 12
Зарегистрирован: 2015.01.26, 16:50

Re: Добавление модели в несколько этапов

Сообщение antoncrimea »

а как обычно? я не понимаю. Есть пример. Мы добавляем объект где 3 поля обязательные. Остальные как есть.

Как напримере:

https://github.com/juratitov/yii2-blog/ ... /login.php
https://github.com/juratitov/yii2-blog/ ... inForm.php

как сделать чтобы добавить имя, потом след шаг пароль с валидацией
antoncrimea
Сообщения: 12
Зарегистрирован: 2015.01.26, 16:50

Re: Добавление модели в несколько этапов

Сообщение antoncrimea »

как мне разделить для каждого шага - своя форма со своей валидацией
Аватара пользователя
smile
Сообщения: 40
Зарегистрирован: 2011.12.01, 11:36

Re: Добавление модели в несколько этапов

Сообщение smile »

Сценарии пробовали использовать?
antoncrimea
Сообщения: 12
Зарегистрирован: 2015.01.26, 16:50

Re: Добавление модели в несколько этапов

Сообщение antoncrimea »

Сценариями еще не пользовался. Есть более менее похожий пример как у меня?
Аватара пользователя
Roksalana
Сообщения: 215
Зарегистрирован: 2014.01.14, 09:34

Re: Добавление модели в несколько этапов

Сообщение Roksalana »

В нужной модельке пишем

Код: Выделить всё

 public function scenarios()
    {
        $scenarios = parent::scenarios();

        $scenarios['registration'] = ['login', 'username'];
        return $scenarios;
    }
 
Это сценарий, в нем указано, какие поля валидировать. Если валидировать нужно, но массовое присвоение допустить нельзя, то указываем так "!password"

Использование сценария примерно так:

Код: Выделить всё

$user = new User();
$user->scenario = 'registration';
 
То что вы указали в правилах валидации уже сценарий-"по умолчанию". Но там-же можно задать и разграничения валидаций по сценариям, например обязательное поле только в данном сценарии

Код: Выделить всё

['username', 'required', 'on' => ['registration']],
 
Это в rules нужно указать. Надеюсь смогла объяснить :)
antoncrimea
Сообщения: 12
Зарегистрирован: 2015.01.26, 16:50

Re: Добавление модели в несколько этапов

Сообщение antoncrimea »

Все равно не получается .....

Код: Выделить всё

$step = Yii::$app->getRequest()->getQueryParam('step');
        
        if ($step != '1' && $step != '2' && $step != '3' && $step != '4')
            $step = '1';
        
        $model = Yii::$app->request->post('model');
        
        if (empty($model))
            $model = new MyModel();            
            
    $model->scenario = 'step'.$step;
                
        if ($model->load(Yii::$app->request->post()) && $model->validate()) {
            $step++;
            
            if ($step > 4) {
                
            }
        }
        
        return $this->render('view', [
            'step' => $step,
            'model' => $model
        ]);
 
сама view

Код: Выделить всё

<?php if ($step == 1): ?>
    <?php $form = ActiveForm::begin(['id' => 'my-form']); ?>
        <?= $form->field($model, 'field1') ?>
        <div class="form-group">
            <input type='hidden' name='step' value='<?= $step ?>'/>
            <?= Html::submitButton('Сохранить', ['class' => 'btn btn-primary', 'name' => 'save-button']) ?>
        </div>
    <?php ActiveForm::end(); ?>
    <?php endif; ?>
    
    <?php if ($step == 2): ?>
    <?php $form = ActiveForm::begin(['id' => 'my-form']); ?>
        <?= $form->field($model, 'field2') ?>
        <div class="form-group">
            <input type='hidden' name='step' value='<?= $step ?>'/>
            <?= Html::submitButton('Сохранить', ['class' => 'btn btn-primary', 'name' => 'save-button']) ?>
        </div>
    <?php ActiveForm::end(); ?>
    <?php endif; ?>
Как нужно это реализовать?

Мои сценарии:

Код: Выделить всё

public function scenarios()
    {
        $scenarios = parent::scenarios();
        
               $scenarios['step1'] = ['а1', 'a2'];
        $scenarios['step2'] = ['a3'];
        $scenarios['step3'] = ['a4', 'a5'];        
        $scenarios['step4'] = ['a6'];
        
        return $scenarios;
    }
 
Шаг 1 - все ок, валидируется и отправляется
Шаг 2 - ничего не валидируется, и на сабмит опять бросает на step1
Ответить