1

我的情况是,我有超过 4 个子表与一个父表关联。我需要创建一种用户体验,其中用户只按一次保存按钮,这意味着用户在父模型字段中输入所有数据,然后在所有四个子模型字段中输入数据,然后按保存按钮。据我所知,模型中的关系允许您轻松插入关联的行,但主要问题是如何在单个模型的 POST 方法中从视图中接收多行(这里我基本上是指子模型)。我已经通过在视图中重复子模型的属性来手动尝试它,但是当我保存记录时,只有最后一个行集与父表一起存储在子表中,子表的一行被遗漏。

Yii有可能还是我太一厢情愿了……有什么建议或意见吗????

提前谢谢了。问候,费萨尔

4

3 回答 3

2

我得到了解决方案,但得到了这里和其他论坛的所有帮助。我关注了 Kiran的帖子,并通过使用 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 个子行,用户只需按一次“保存”或“提交”按钮即可保存所有数据。

感谢大家的支持。

问候,

费萨尔

于 2012-10-11T18:11:48.470 回答
0

您应该使用表格输入,这样您就可以接收相同类型的多个实例的数据,然后您可以保存父项并使用其 id 来填充子外键。

于 2012-10-11T00:29:17.983 回答
0

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

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;
    ....
}
于 2012-10-11T08:07:10.690 回答