为什么set_value()不能与foo [bar] [x] [lorem]数组输入一起使用?

时间:2011-07-20 17:54:15

标签: php codeigniter

所以,假设我有一个表单,用户可以通过按+按钮添加任意数量的狗。

表格如下:

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()支持这样的数组输入?

提前致谢。

2 个答案:

答案 0 :(得分:3)

您可能必须使输入nameset_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]"