首页 > 解决方案 > Yii2 buttflattery\yii2-formwizard 不同选项卡中的一个字段

问题描述

现在我正在 Yii2 上开发复杂的测验应用程序。这是包含 100 多个问题的 MCQ 测试。我想将这些问题分成 5 个表单选项卡(以便 tab1 中的问题从 1 到 20,tab2 中的问题从 21 到 40 等)。有人可以解释这样做的方法是什么吗?所以,只有一个模型和一个表单提交。

我考虑过使用buttflattery\yii2-formwizard。在文档中,我找到了 Single Model Across Steps 教程,但它并不真正适合我的情况,因为所有问题都写在一个字段中的行数中。

目前Answers模型如下:

class Answers extends ActiveRecord
{
  public function rules(){
    return[
      [['id','question_id', 'option_id',  'user_id'], 'required'],
    ];
  }
}

索引视图:

//start form
<?php $form = ActiveForm::begin([
   'id' => 'my-form-id',
   'action' => ['answers/save'],
   'options' =>['class'=>['t-form']]
   ]); 
?> 
//foreach question:
  <?php for ($i=0; $i<count($questions); $i++): ?> 
    <div class="input-title">
      <?= Html::encode("{$questions[$i]->title}") ?>
    </div>

    <?php $options = Options::find()-> where 
      (['question_id'=>$questions[$i]->id]) ->all();
      $options = ArrayHelper::map($options,'id', 'title');?>
    //print options:
    <div class="radio__wrapper">  
      <?= $form->field($model, 'option_id')->radioList(
        $options, 
        ['name'=>'Questions['.$questions[$i]->id.']', 
         'separator' => '<br>',
         'required'=>true],)->label(false) ?>     
    </div>
   //submit form
    <?= Html::submitButton('Save', ['class' => 'submit']) ?>

<?php ActiveForm::end(); }

答案控制器:

public function actionSave(){        
  $request = \Yii::$app->request;
  foreach($request->post('Questions') as $key=>$value) {
    $model = new Answers();
    $model->load($request->post());
    $model->option_id = $value;
    $model->question_id = $key;
    $model->user_id = \Yii::$app->user->id;
    $model->save(false);
  }
  if( $model->save(false)){
    return $this->redirect(['result/index']);
  }
}

如果 FormWizard 不是合适的变体,请解释一下最有效的方法是什么?

标签: formsyii2yii2-formwizard

解决方案


yii2-formwizardActiveForm确实为您提供了很多选项,它们使用和创建表单向导Models

突出特点

  • 您可以在所有步骤中使用单个模型。
  • 专用于每一步的单独模型。
  • 多个模型到一个步骤。
  • 禁用/启用验证。
  • 自定义和订购表单字段。
  • 带有按钮的表格步骤,Add Row可动态添加字段,如地址簿。
  • 表单持久性(保存未保存的表单以便稍后使用 恢复localstorage)。
  • 预览步骤(预览所有带有标签的表单输入作为最后一步,并在单击时导航到该步骤)。
  • 多个主题

演示

您可以查看包含所有可用变体的DEMOS ,对于文档,请使用Wiki

设置

使用 composer 安装扩展

php composer.phar require buttflattery/yii2-formwizard "@dev"

或添加到 composer.json 文件中的 require 部分

"buttflattery/yii2-formwizard":"@dev"

示例代码

use buttflattery\formwizard\FormWizard;

$shootsModel = new Shoots();
$shootTagModel = new ShootTag();

echo FormWizard::widget([
    'steps'=>[
        [
            'model'=>$shootsModel,
            'title'=>'My Shoots',
            'description'=>'Add your shoots',
            'formInfoText'=>'Fill all fields'
        ],
        [
            'model'=> $shootTagModel,
            'title'=>'My Shoots',
            'description'=>'Add your shoots',
            'formInfoText'=>'Fill all fields'
        ],
    ]
]);

推荐阅读