8

So the framework is CodeIgniter 2.0.2. I have a form that has groups of fields that correspond to rows in a database. The names of the fields are in the format:

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

The index (1,2,etc...) does not correspond to row IDs in the database, it is simply a way to split up the groups of fields. There may be gaps in the index as users are able to add and remove an arbitrary number of the field groups. All groups are identical, that is, they contain exactly the same set of fields with the same second level names.

I want to be able to use CodeIgniter's validation library to validate the form and (p)re-populate as necessary. I've found plenty of posts (in addition to the excellent CI user guide) on the pre-populating and I know how to get the working with the re-populating in general. However, this is the first time I've had to try it with the indexed field names as above. I've tried the below and it doesn't work:

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

I'm guessing I was just hoping for too much and CodeIgniter doesn't support what I need it to do. Extending the existing form validation library is an option so if anyone has been in the same situation and can provide some tips that would be very welcome.

UPDATE:

Just a little extra info, I've also tried validating a specifically indexed field (see below) and that also didn't work... As I understand it multidimensional validation should work in the specific case:

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

3 Answers 3

2

The following controller code works for me on 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();

    }
Sign up to request clarification or add additional context in comments.

5 Comments

Indeed it does! Work with arrays too, I distinctly remember having issues with this in the past, maybe there was an update in 2.0 that fixed it? Or am I incorrect and this was never an issue?
Please re-read the question. There are an arbitrary number of first level elements in the POST array. i.e. I could have test[0-5] or I could have test[0-50]. I suppose I could set the rules in a loop but that's a really ugly solution and I'd much rather abstract them into a config file.
Also, try it again with a numeric index, so test[0][test2] as that is my return data format. That format didn't work for me as I said in the update.
I tried again with a numeric format. That worked fine for me.
As far as the as the arbitrary number of elements, you can't setup a config file because of the unknown number of elements, you may be able to modify the config file at runtime, but you're still going to need your loop, even if it's just to repopulate an invalid form. Another thing to look into is the DataMapper ORM, it validates the data in the model on a save, so you make a new object for each set of fields, plus you get the benefits of the ORM like automagic joins/relationships. datamapper.wanwizard.eu
1

You can use this to loop through the opt variable and set validation rules for each input.

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');
        }
    }

Comments

0

You should take a look at the callback functions for the validating class - this should help you accomplish what you need for validation.

1 Comment

The callback functions aren't the issue here. The field names are the problem.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.