Yii:在POST方法中从视图接收单个模型的多个记录:保存父子数据

时间:2012-10-11 00:06:15

标签: yii parent-child models

我的情况是,我有一个父表的关联表超过4个子表。我需要创建用户体验,其中用户只按一次“保存”按钮,即用户输入父模型字段中的所有数据,然后在所有四个子模型字段中输入数据,然后按下保存按钮。据我所知,在模型中建立关系允许您轻松地插入关联的行,但主要问题是如何在POST方法中为单个模型接收多行(这里我主要是指子模型)。我通过在视图中重复子模型的属性手动尝试但是当我保存记录时,只有最后一行与父表一起存储在子表中,子表的一行被遗漏。请注意,我在View文件中使用了CActiveForm和其他Bootstrap小部件。

是否有可能在Yii或我太过如意......任何建议或意见????

非常感谢提前。 问候, 费萨尔

3 个答案:

答案 0 :(得分:2)

我得到了解决方案,但是得到了来自这里以及其他论坛的所有帮助。我跟随Kiran的post并通过使用jQuery生成其他HTML属性来测试它。在提交时,我得到的所有行都是我想要的。在控制器中,首先我计算了在请求后提交的模型总数,然后在每个模型上进行迭代以进行所需的处理。以下是代码段。

    if(!empty($_POST))
{
    $v=count($_POST['Address'])+1;
    Yii::log(count($_POST['Address']));
    for ($i=1; $i<$v; $i++){
            $addressModel_1->attributes=$_POST['Address'][$i];
            Yii::log('Dumping Data from '.$i.' model');
            Yii::log($addressModel_1->city);
            Yii::log($addressModel_1->street);
            Yii::log($addressModel_1->state);}}

在视图方面,我使用jQuery函数生成HTML。所有这个功能都是添加另一组html以允许用户输入数据。生成HTML时要注意的重要事项是模型的名称,否则它不会落在控制器中您想要的位置。

以下是此功能的代码段。请注意,我将“3”硬编码为id,因为我已经在DOM中有两组行。我将进一步改进这段代码,但请放心,逻辑有效。

function createNewAddress(){
     var newdiv = document.createElement('div');
     var inner_html='<div class="row">';
        inner_html+='<label for="Address_3_street">Street</label>        <input name="Address[3][street]" id="Address_3_street" type="text" maxlength="200" />            </div>';
        inner_html+='<div class="row">';
        inner_html+='<label for="Address_3_city">City</label>        <input name="Address[3][city]" id="Address_3_city" type="text" maxlength="200" />            </div>  ';
        inner_html+='<div class="row">';
        inner_html+='<label for="Address_3_state">State</label>        <input name="Address[3][state]" id="Address_3_state" type="text" maxlength="200" />            </div>';
     newdiv.innerHTML=inner_html;
     $('#user-form').append(newdiv);

}

这样,我可以从浏览器中动态添加n个子行,用户只需按一次“保存”或“提交”按钮即可保存所有数据。

感谢大家的支持。

此致

费萨尔

答案 1 :(得分:0)

您应该使用tabular input,这样您可以接收相同类型的多个实例的数据,然后您可以保存父级并使用其ID来填充子外键。

答案 2 :(得分:0)

您可以创建一个新的CFormModel来处理所有表单字段验证,然后在POST函数中的$ model-&gt; validate之后手动设置属性。 EG:

if ($model->validate){
    $model_one = new ModelOne;
    $model_one->name = $model->model_one_name;
    $model_one->surname = $model->model_one_surname;
    ....

    $model_two = new ModelTwo;
    $model_two->name = $model->model_two_name;
    $model_two->surname = $model->model_two_surname;
    ....
}