我得到了解决方案,但得到了这里和其他论坛的所有帮助。我关注了 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 个子行,用户只需按一次“保存”或“提交”按钮即可保存所有数据。
感谢大家的支持。
问候,
费萨尔