所以,假设我有一个表单,用户可以通过按+
按钮添加任意数量的狗。
表格如下:
Dog #1 <br/>
<input name="house[dogs][][name]" value="<?=set_value('house[dogs][0][name'])?>"/>
<input name="house[dogs][][age]" value="<?=set_value('house[dogs][0][age]')?>" />
Dog #2 <br/>
<input name="house[dogs][][name]" value="<?=set_value('house[dogs][1][name'])?>"/>
<input name="house[dogs][][age]" value="<?=set_value('house[dogs][1][age]')?>" />
在CodeIgniter上,我运行表单验证,以便set_value()
也能正常工作:
$house = $this->input->post('house');
$dogs = $house['dogs'];
$i = 0;
foreach($dogs AS $dog){
$this->form_validation->set_rules("house[dogs][$i][name]", 'Dog Name', 'required');
$this->form_validation->set_rules("house[dogs][$i][age]" , 'Dog Age' , 'required');
$i++;
}
这一切都行不通,如何让set_value()
支持这样的数组输入?
提前致谢。
答案 0 :(得分:3)
您可能必须使输入name
与set_value()
的第一个参数完全相同。
其中一个可能无法[]
,而另一个可以使用[0]
。
答案 1 :(得分:1)
非常相关:http://codeigniter.com/forums/viewthread/179581/具有讽刺意味的是,我几个月前发的一篇文章今天早上被发现了。
还相关:CodeIgniter: Validate form with multidimensional POST data
<ignore>
简而言之,Codeigniter默认情况下不会很好地处理索引字段名称。
要简单地重新填充输入并解决set_value()
的缺点,您可以尝试这样的事情:
<?php
$value = isset($_POST['house']['dogs'][1]['age']) ? // was the value posted?
form_prep($_POST['house']['dogs'][1]['age']) : // if so, clean it
''; // if not, leave empty
?>
<input name="house[dogs][1][age]" value="<?php echo $value; ?>" />
由于您可能正在使用循环输出这些,我认为这不会太麻烦。你可以填充一个单独的数组值,如果你愿意,可以阅读这些数值,你就明白了。 set_value()
自动运行form_prep()
,这就是我添加它的原因。
我对验证不太确定。您可能必须自己进行验证,虽然麻烦,但不应该太困难。请记住,您始终可以手动运行验证方法。例如:
if ($this->form_validation->valid_email($this->input->post('email')) {}
您可能希望采用简单的方法并更改字段名称以使用单个索引,例如dog_age[]
,我相信这将使CI更容易进行验证。祝你好运,希望能够在CI核心中修复其中一天。
</ignore>
编辑:我不知道这是怎么逃过我的,但显然验证和set_value 应该实际上按预期工作 - 不确定这是否是最近的更改或是否这个问题从未真正存在过。我当然记得以前遇到过这个问题,链接的帖子也暗示其他人也是如此。看看这个答案:
CodeIgniter: Validate form with multidimensional POST data
我测试了它(运行2.0.2),它实际上确实有效。我在change log中没有看到任何内容,但我确实测试了它并且确实有效。请确保您使用最新版本并重试,或者如果我在这里遗漏了某些内容,请告诉我们。
与your other answer类似,您可能只需明确索引字段名称,例如name="house[dogs][1][name]"
而不是name="house[dogs][][name]"
。