我的情况是,我有一个父表的关联表超过4个子表。我需要创建用户体验,其中用户只按一次“保存”按钮,即用户输入父模型字段中的所有数据,然后在所有四个子模型字段中输入数据,然后按下保存按钮。据我所知,在模型中建立关系允许您轻松地插入关联的行,但主要问题是如何在POST方法中为单个模型接收多行(这里我主要是指子模型)。我通过在视图中重复子模型的属性手动尝试但是当我保存记录时,只有最后一行与父表一起存储在子表中,子表的一行被遗漏。请注意,我在View文件中使用了CActiveForm和其他Bootstrap小部件。
是否有可能在Yii或我太过如意......任何建议或意见????
非常感谢提前。 问候, 费萨尔
答案 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;
....
}