CodeIgniter:使用多维POST数据验证表单

8

所使用的框架是CodeIgniter 2.0.2。我有一个表单,其中包含一组与数据库中行对应的字段。这些字段的名称格式如下:

opt[0][foo]
opt[0][bar]
opt[1][foo]
opt[1][bar]
etc...

索引(1、2等)与数据库中的行ID不对应,它只是一种将字段组分隔开的方式。由于用户可以添加和删除任意数量的字段组,因此索引中可能存在间隙。所有的组都是相同的,也就是说,它们包含完全相同的字段集合,具有相同的第二级名称。

我希望能够使用CodeIgniter的验证库来验证表单,并根据需要进行预填充。除了优秀的CI用户指南外,我还找到了很多文章,知道如何使其在一般情况下重新填充。然而,这是我第一次尝试使用上述索引字段名称进行重填充。我尝试以下代码,但它无法工作:

array(
    'field' => 'opt[][foo]',
    'label' => 'Foo',
    'rules' => 'required'
)

我猜我期望过高了,CodeIgniter不支持我需要的功能。扩展现有的表单验证库是一个选项,如果有人遇到相同的情况并能提供一些提示,那将非常受欢迎。
更新:
额外提供一点信息,我也尝试验证特定索引字段(见下文),但也没有成功...据我所知,多维验证在特定情况下应该是有效的:
array(
    'field' => 'opt[0][foo]',
    'label' => 'Foo',
    'rules' => 'required'
)
3个回答

2
以下控制器代码在CI 2.0.2上适用。
public function test() {

        $this->load->library('form_validation');
        $this->load->helper('form');

        $this->form_validation->set_rules('test[test1][test2]', 'Test', 'required|valid_email');

        $this->form_validation->run();  

        echo validation_errors();

        echo form_open($this->uri->uri_string());
        echo form_input('test[test1][test2]', set_value('test[test1][test2]'));
        echo form_submit();
        echo form_close();

    }

确实可以!它也可以使用数组,我清楚地记得过去曾经遇到过这样的问题,也许2.0版本中修复了它?或者我是错误的,这从未是一个问题? - Wesley Murch
请重新阅读问题。POST数组中有任意数量的一级元素。例如,我可以有test[0-5]或者test[0-50]。我想我可以在循环中设置规则,但那是一个非常丑陋的解决方案,我更愿意将它们抽象成配置文件。 - Endophage
还有,请使用数字索引再试一次,例如test[0][test2],因为那是我的返回数据格式。正如我在更新中所说的那样,那个格式对我没用。 - Endophage
我尝试了一下数字格式,这对我来说很好用。 - Josh
就任意数量的元素而言,你无法设置配置文件,因为元素数量未知。你可能能够在运行时修改配置文件,但是你仍然需要循环,即使只是重新填充一个无效的表单。另一个需要考虑的问题是DataMapper ORM,它会在保存时验证模型中的数据,因此你可以为每组字段创建一个新对象,此外你还可以获得ORM的好处,例如自动连接/关联等。http://datamapper.wanwizard.eu/ - Josh

1
你可以使用这个来循环遍历 opt 变量并为每个输入设置验证规则。
if(!empty($opt))
    {
        foreach($opt as $id => $value)
        {
            $this->form_validation->set_rules('opt[' . $id . '][foo]', 'Foo', 'required');
            $this->form_validation->set_rules('opt[' . $id . '][bar]', 'Bar', 'required');
        }
    }

0
你应该查看验证类的回调函数 - 这将帮助你完成所需的验证。

回调函数不是问题所在,字段名称才是问题。 - Endophage

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接