Yii2 buttflattery \ yii2-formwizard的不同选项卡中的一个字段

时间:2019-09-05 10:25:55

标签: forms yii2 yii2-formwizard

现在我正在研究Yii2上的复杂测验应用程序。这是包含100多个问题的MCQ考试。我想将此问题分为5个表单选项卡(这样,问题在tab1中从1到20,在tab2中从21到40等)。有人可以解释这样做的方式吗?因此,只有一种模型和一种表单提交。

我考虑过使用buttflattery\yii2-formwizard。在文档中,我找到了“跨步骤的单一模型”教程,但是它并不完全适合我的情况,因为所有问题都写在一个字段中,与行数一样。

目前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(); }

AnswersController:

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不适合作为变体,请向我解释最有效的方法是什么?

1 个答案:

答案 0 :(得分:0)

yii2-formwizard确实为您提供了许多选项,这些选项使用ActiveFormModels创建了一个表单向导。

突出功能

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

Demos

您可以看到DEMOS及其所有可用的变体,对于文档,请使用Wiki

设置

使用作曲家安装扩展程序

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

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

"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'
        ],
    ]
]);