Запомнить и работать с моделью

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

Запомнить и работать с моделью

Сообщение kaktaktovich »

Все привет!
У меня есть форма с несколькими шагами. Подскажите, как лучше реализовать. Есть модель StepsForm и 4 шага. Как лучше обращаться к этой модели? Сейчас я делаю так:

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

public function actionStep1()
    {
        $user = new PochtaUser();

        if (Yii::$app->request->post()) {
            $user->name = Yii::$app->request->post('name');
            $user->save();

            if ($user->save()) {
                Yii::$app->session->set('userId', $user->id);
                return $this->redirect('step2');
            }
        }

        return $this->render('step1');
    }

    public function actionStep2()
    {
        $user = $this->getUser();
        if (Yii::$app->request->post()) {
            $user->day = Yii::$app->request->post('day');
            $user->month = Yii::$app->request->post('month');
            $user->year = Yii::$app->request->post('year');

            if ($user->update()) {
                return $this->redirect('step3');
            }
        }
        return $this->render('step2', ['user' => $user]);
    }

    public function getModel()
    {
        $userId = Yii::$app->session->get('userId');
        $userModel = PochtaUser::findOne($userId);

        if (empty($userId) || $userModel == null) {
            return $this->redirect('step1');
        } else {
            return $userModel;
        }
    }
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Запомнить и работать с моделью

Сообщение Dominus »

Можно попробовать организовать со сценариями.
Вот что у меня получилось:
Model:

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

class StepsForm extends Model
{
    const SCENARIO_STEP_1 = 'step_1';
    const SCENARIO_STEP_2 = 'step_2';
    const SCENARIO_STEP_3 = 'step_3';
    const SCENARIO_STEP_LAST = 'stepLast';

    public $field1;
    public $field2;
    public $field3;
    public $field4;

    public $name; // будем хранить сценарий


    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['field1'], 'required', 'on' => self::SCENARIO_STEP_1],
            [['field1', 'field2'], 'required', 'on' => self::SCENARIO_STEP_2],
            [['field1', 'field2', 'field3'], 'required', 'on' => self::SCENARIO_STEP_3],
            [['field1', 'field2', 'field3', 'field4'], 'required', 'on' => self::SCENARIO_STEP_LAST],
            ['name', 'safe'],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'field1' => 'Значение 1',
            'field2' => 'Значение 2',
            'field3' => 'Значение 3',
            'field4' => 'Значение 4',
        ];
    }
}
Controller:

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

public function actionIndex()
    {
        return $this->render('index');
    }
    
public function actionCreate()
    {
        $model = new StepsForm();
        if ($post = Yii::$app->request->post()) {
            $model->scenario = $post['StepsForm']['name'];
        }

        if ($model->load($post)) {
            if ($model->name == $model::SCENARIO_STEP_1) {
                $model->scenario = $model::SCENARIO_STEP_2;
                return $this->render('step_2', [
                    'model' => $model,
                ]);
            }

            if ($model->name == $model::SCENARIO_STEP_2) {
                $model->scenario = $model::SCENARIO_STEP_3;
                return $this->render('step_3', [
                    'model' => $model,
                ]);
            }

            if ($model->name == $model::SCENARIO_STEP_3) {
                $model->scenario = $model::SCENARIO_STEP_LAST;
                return $this->render('step_4', [
                    'model' => $model,
                ]);
            }

            if ($model->name == $model::SCENARIO_STEP_LAST) {
                Yii::$app->session->setFlash('success', 'Форма отправлена! Все значения успешно получены.');
                return $this->render('index', [
                    'model' => $model,
                ]);
            }
        }
        $model->scenario = $model::SCENARIO_STEP_1;
        return $this->render('step_1', [
            'model' => $model,
        ]);
    }
View: index.php

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

<p>
<?php if ($model) {
       \yii\helpers\VarDumper::dump($model->attributes, 10, 1);
} ?>
</p>

<p>
      <?= Html::a('Начинаем', ['create'], ['class' => 'btn btn-primary']) ?>
</p>
View: step_1.php

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

<?php $form = ActiveForm::begin(['id' => 'step-form-1']); ?>

<?= $form->field($model, 'field1')->textInput() ?>

<?= $form->field($model, 'name')->hiddenInput([
      'value' => $model->scenario,                
])->label(false) ?>

<div class="form-group">
     <?= Html::submitButton('Далее', ['class' => 'btn btn-primary', 'name' => 'test-button']) ?>
</div>

<?php ActiveForm::end(); ?>
View: step_2.php

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

<?php $form = ActiveForm::begin(['id' => 'step-form-2']); ?>

<?= $form->field($model, 'field2')->textInput() ?>

<?= $form->field($model, 'name')->hiddenInput([
     'value' => $model->scenario,                
])->label(false) ?>

<?= $form->field($model, 'field1')->hiddenInput()->label(false) ?>

<div class="form-group">
      <?= Html::submitButton('Далее', ['class' => 'btn btn-primary', 'name' => 'test-button']) ?>
</div>

<?php ActiveForm::end(); ?>
View: step_3.php

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

<?php $form = ActiveForm::begin(['id' => 'step-form-3']); ?>

<?= $form->field($model, 'field3')->textInput() ?>

<?= $form->field($model, 'name')->hiddenInput([
      'value' => $model->scenario,                
])->label(false) ?>

<?= $form->field($model, 'field1')->hiddenInput()->label(false) ?>
<?= $form->field($model, 'field2')->hiddenInput()->label(false) ?>

<div class="form-group">
      <?= Html::submitButton('Далее', ['class' => 'btn btn-primary', 'name' => 'test-button']) ?>
</div>

<?php ActiveForm::end(); ?>
View: step_4.php

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

<?php $form = ActiveForm::begin(['id' => 'step-form-4']); ?>

<?= $form->field($model, 'field4')->textInput() ?>

<?= $form->field($model, 'name')->hiddenInput([
      'value' => $model->scenario,
])->label(false) ?>

<?= $form->field($model, 'field1')->hiddenInput()->label(false) ?>
<?= $form->field($model, 'field2')->hiddenInput()->label(false) ?>
<?= $form->field($model, 'field3')->hiddenInput()->label(false) ?>

<div class="form-group">
     <?= Html::submitButton('Готово', ['class' => 'btn btn-primary', 'name' => 'test-button']) ?>
</div>

<?php ActiveForm::end(); ?>
Как то так.)
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Ответить