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

Yii2 Saving tabular data using yii2-formwizard

我正在为表格输入集成 yii2-formwizard,但无法将数据提交到我的控制器操作并使用 Model::loadMultiple

我必须将我的模型声明为数组,然后我需要在传递给视图之前对其进行初始化,并且在 buttflattery/yii2-formwizard 前端我必须将我的模型指定为数组,但我无法从我的模型中检索数据动态控制器。

我需要从前端动态创建实例并将它们保存在后端。 我只能保存我从 controller.if 初始化的实例 我不会只初始化第一个实例 saved.and 当我使用 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 收集表格输入,另一方面如果我将模型声明为数组并将其初始化并发送到前端,则表单不是动态的。它以表格形式显示所有实例,所以我不需要按 "add" 按钮,我不需要。

我开发了这个小部件,但在我建议您之前,您应该阅读有关表格输入的基本实现的信息,尽管该指南并不是完全有用,但有些部分仍在 TBD 和 inserting/creating 表格数据到 table 的代码示例还没有添加那么多细节,但是查看源方法总是更好,毕竟我们是工程师并且我们应该能够理解框架核心的一部分或单独文件的任何功能的实现。

解决问题

现在关于这个问题,您没有理由使用在操作之上添加的 for 循环

 for ($i=0; $i < 2 ; $i++) { 
     $education[]= new Edusubject();
 }

您从指南 here 中获取了该部分,并按原样复制粘贴到您的代码中 ¯\_(ツ)_/¯

指南中的这部分代码仅用于理解表格模型数组应该如何填充,然后在创建新记录.[=31 时提供加载和验证=]

理解

我们需要通过

加载和验证表格输入

它们都将 $models 数组作为第一个参数,该参数应将模型的实例保存为 loaded/validated。

对于 loadMultiple($models, $attributes) 请记住,它会将 $attributes 数组中指定的所有属性加载到 $models 数组中指定的每个模型中, 以及所有这些模型的数量必须相同 class$attributes 数组可以是 $_POST$_GET 之一或任何其他有效数组,有关详细信息,请参阅文档。

对于validateMultiple($models)它可以是不同的模型也可以是相同的,它会在$models数组中的每个模型上调用validate()

实施

所以需要改成下面

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,    
        ]);
}

并且在您看来 FormWizard 中的 model 属性 将如下所示

'model' => $education,

我刚刚在本地主机上对其进行了测试,它可以正确加载、验证和保存。