首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Yii2 2格式向导Yii2保存表格数据

使用Yii2 2格式向导Yii2保存表格数据
EN

Stack Overflow用户
提问于 2019-08-29 15:08:37
回答 1查看 873关注 0票数 1

我正在集成易2-形巫师作为表格输入,但无法将数据提交给我的控制器操作并使用Model::loadMultiple

我必须将我的模型声明为数组,然后我需要在传递到视图之前初始化它,在buttflattery/yii2-formwizard前端,我必须将我的模型指定为数组,但是我不能动态地从控制器中检索数据。

我需要从前端动态创建实例,并将它们保存在后端。我只能保存我从我的controller.if中初始化的实例--我不能只初始化第一个实例saved.and --也可以在初始化多个实例时使用for循环,并一次为所有实例进行前端复制--这也是我不需要的。

代码语言:javascript
复制
//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代码在我的视图中

代码语言:javascript
复制
    <?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,

在我看来,当我将模型声明为数组时,我可以获得维基中描述的动态表单,但由于无法实现所描述的yii2集表输入,所以无法保存该数组;另一方面,如果我将模型声明为数组并初始化它并发送到前端,则表单是不动态的。它以形式显示所有实例,因此我不需要按“添加”按钮,我不需要。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-29 20:05:26

我开发了这个小部件,但在建议您阅读有关表格输入的基本实现之前,尽管指南不是完全有用的,但仍有一些部分在TBD下,而且还没有添加到表中插入/创建表格数据的代码示例,但最好还是查看源方法,毕竟我们是工程师,我们应该能够理解任何函数的实现,无论是框架核心的一部分还是单独的文件。

解决问题

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

代码语言:javascript
复制
 for ($i=0; $i < 2 ; $i++) { 
     $education[]= new Edusubject();
 }

您从指南这里中获取了这个部分,并复制粘贴了它,就像代码¯\_(ツ)_/中一样。

指南中的这一部分代码只是为了了解如何填充表格模型数组,然后在创建新记录时为加载和验证提供这些信息。

理解

我们需要通过以下方式加载和验证表格输入

这两种方法都以$models数组作为第一个参数,该参数应包含待加载/验证的模型实例。

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

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

实现

所以你需要把它改到下面

代码语言:javascript
复制
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中将如下所示

代码语言:javascript
复制
'model' => $education,

我只是在本地主机上测试了它,它正确地加载、验证和保存。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57713074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档