Yii2使用yii2-formwizard保存表格数据

时间:2019-08-29 15:08:37

标签: php yii2 yii2-advanced-app yii2-formwizard

我正在集成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收集表格输入,因此无法保存该数组,另一方面,如果我将模型声明为数组并将其初始化并发送到前端,则表单不是动态的。它以表格形式显示了所有实例,所以我不需要按“添加”按钮,这是我不需要的。

1 个答案:

答案 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上对其进行了测试,它可以正确加载,验证和保存。