我正在集成yii2-formwizard进行表格输入,但是无法将数据提交给控制器操作并使用Model::loadMultiple
。
我必须将我的模型声明为数组,然后在传递给视图之前需要对其进行初始化,并且在buttflattery/yii2-formwizard
前端,我必须将我的模型指定为数组好,但是我无法动态地从控制器中检索数据
我需要从前端动态创建实例并将其保存在后端。 我只能保存从控制器初始化的实例,如果不初始化仅保存的第一个实例,也可以在使用for循环初始化多个实例时立即对所有实例进行前端复制,这又一次不需要。
//controller
public function actionCreatemulti()
{
$this->layout='layout2';
$education = [new Edusubject()];
//## initialize array for 2 element (if I not initialize only one object pass or saved)
for ($i=0; $i < 2 ; $i++) {
$education[]= new Edusubject();
}
//## Model::loadMultiple --> works only if $education is declared as array
if (Model::loadMultiple($education, Yii::$app->request->post()) && Model::validateMultiple($education)) {
foreach ($education as $edu) {
$edu->save(false);
}
return $this->render('dummy');
}
return $this->render('createmulti', [
'education' => $education,
]);
}
视图中的FormWizard代码
<?php
echo FormWizard::widget(
[
'formOptions' => [
'id' => 'my_form_tabular'
],
'steps' => [
[
//should be a single model or array of Activerecord model objects but for a single model only see wiki on github
'model' => $education, //## here I canot declared array again as I pass an array alredy from controller
//set step type to tabular
'type' => FormWizard::STEP_TYPE_TABULAR,
当我在视图中将模型声明为数组时,我可以如wiki中所述获得动态形式,但是由于无法实现yii2收集表格输入,因此无法保存该数组,另一方面,如果我将模型声明为数组并将其初始化并发送到前端,则表单不是动态的。它以表格形式显示了所有实例,所以我不需要按“添加”按钮,这是我不需要的。
答案 0 :(得分:0)
我开发了此小部件,但在我向您建议任何内容之前,您应该阅读有关表格输入的基本实现的信息,尽管该指南并不完全有用,但仍有部分内容 TBD
并没有添加用于在表中插入/创建表格数据的代码示例,但还添加了这么多细节,但是总的来说我们还是工程师,我们应该能够理解任何函数的实现,但是最好还是查看source方法。框架核心的一部分或单独的文件。
关于此问题,您没有理由使用在操作之上添加的for循环
for ($i=0; $i < 2 ; $i++) {
$education[]= new Edusubject();
}
您从指南here中摘下了该部分,并按照代码¯\ _(ツ)_ /¯中的说明粘贴了该部分。
指南中的这部分代码仅用于理解如何填充表格模型数组,然后在创建新记录时提供用于加载和验证的信息。
我们需要通过
加载并验证表格输入这两个参数均以$models
array作为第一个参数,该参数应包含要加载/验证的模型的实例。
对于loadMultiple($models, $attributes)
,请记住,它将把$attributes
数组中指定的所有属性加载到$models
数组中指定的每个模型中,所有这些模型都需要属于同一班级。 $attributes
数组可以是$_POST
或$_GET
之一,也可以是其他任何有效的数组,有关详细信息,请参阅文档。
对于validateMultiple($models)
,它可以是不同的模型,也可以相同,它将在validate()
数组中的每个模型上调用$models
。
所以您需要将其更改为以下
public function actionCreatemulti()
{
$this->layout='layout2';
$education = [new Edusubject()];
//cehck if post request
if(Yii::$app->request->isPost){
//get total models submitted
$count = count(Yii::$app->request->post('Edusubject',[]));
//start the loop from 1 rather than 0 and use the $count for limit
for ($i=1; $i < $count ; $i++) {
$education[]= new Edusubject();
}
if (
Model::loadMultiple($education, Yii::$app->request->post())
&& Model::validateMultiple($education)
) {
foreach ($education as $edu) {
$edu->save(false);
}
return $this->render('dummy');
}
}
return $this->render('createmulti', [
'education' => $education,
]);
}
,您认为model
中的FormWizard
属性如下所示
'model' => $education,
我刚刚在localhost上对其进行了测试,它可以正确加载,验证和保存。