Forms Yii2在ButtFattery的不同选项卡中有一个字段\Yii2 formwizard
现在我正在Yii2上开发复杂的测验应用程序。这是包含100多个问题的MCQ测试。我想将这些问题分为5个表单选项卡(以便在选项卡1中1到20个问题,在选项卡2中21到40个问题等)。有人能解释一下怎么做吗?因此,只有一个模型和一个表单提交 我考虑过使用这个工具。在文档中,我发现了跨越步骤的单一模型教程,但它并不真正适合我的情况,因为所有问题都写在一个字段中,而不是写在多行中 目前,Forms Yii2在ButtFattery的不同选项卡中有一个字段\Yii2 formwizard,forms,yii2,yii2-formwizard,Forms,Yii2,Yii2 Formwizard,现在我正在Yii2上开发复杂的测验应用程序。这是包含100多个问题的MCQ测试。我想将这些问题分为5个表单选项卡(以便在选项卡1中1到20个问题,在选项卡2中21到40个问题等)。有人能解释一下怎么做吗?因此,只有一个模型和一个表单提交 我考虑过使用这个工具。在文档中,我发现了跨越步骤的单一模型教程,但它并不真正适合我的情况,因为所有问题都写在一个字段中,而不是写在多行中 目前,答案模型如下: class Answers extends ActiveRecord { public funct
答案
模型如下:
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(); }
如果FormWizard不适合,请解释什么是最有效的方法?为您提供了许多选项,可以使用ActiveForm
和模型创建表单向导
显著特征
- 可以在所有步骤中使用单个模型
- 每个步骤都有单独的模型
- 将多个模型简化为一个步骤
- 禁用/启用验证
- 自定义订单字段(&O)
- 带有“添加行”按钮的表格步骤可动态添加字段,如地址簿
- 表单持久性(保存未保存的表单,以便稍后使用
localstorage
还原)
- 预览步骤(预览所有带有标签的表单输入,作为最后一步,并在单击时导航到该步骤)
- 多主题
演示
您可以查看包含所有可用变体的,对于文档,请使用
设置
使用composer安装扩展
php composer.phar/yii2 formwizard“@dev”
或者添加到require部分下的composer.json文件中
“ButtFattery/yii2 formwizard”:“@dev”
示例代码
它不仅支持,而且可以为每个步骤或步骤使用单独的模型too@MuhammadOmerAslam是的,你说得对。但是我不能使用单独的模型,因为所有答案都应该一次发布。我不明白你说的是什么。如果你担心一次发布所有答案,那么就不会有任何问题,因为向导会在最后一步之后,当你按下“完成”按钮时提交所有答案,而不是在最后一步之前提交。那么你想问什么呢?如果答案对你有帮助的话,一定要标出
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']);
}
}
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'
],
]
]);