现在我正在研究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不适合作为变体,请向我解释最有效的方法是什么?
答案 0 :(得分:0)
yii2-formwizard确实为您提供了许多选项,这些选项使用ActiveForm
和Models
创建了一个表单向导。
localstorage
进行还原)。您可以看到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'
],
]
]);