forms - 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 不是合适的变体,请解释一下最有效的方法是什么?
解决方案
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'
],
]
]);