views:

95

answers:

3

Hi I am having an incredibly hard time with what should be a simple issue.

As of CodeIgniter 1.7, '$this->input->post();' supported arrays but I cannot for get the values into the array for some reason. I have 7 check boxes that store into an array 'services[]' as you can see by this example view:

<?php $servicesdata = array (
         'name' => 'services[]',
         'value' => 'in_home_care',
         );
echo form_checkbox($servicesdata, set_checkbox('services[]', 'in_home_care', FALSE)); ?>

I'm quite certain this is the correct fashion because the forms do validate nicely if something goes wrong. Now I start to have issues when storing the values. I have 7 columns that need to have some sort of value... at this point I don't care but ideally it would be a boolean (a binary would work okay too). Here is what I have so far in my controller that everyone claims should work but just does not:

$c = new Client($servicesdata);
$c->first_name = $this->input->post('first_name', TRUE);
$c->in_home_care = $this->input->post('services[in_home_care]');

You can see the string I put for an example that works perfectly and inserts into a VARCHAR type while the array won't go into the database whatsoever. I feel as if that I am missing something here - namely the 'value' in the array but I'm just not sure where to go from here. Any help would be much appreciated because the only method I can get to work sacrifices my checkbox validation! :(

+1  A: 

If your checkbox is unchecked, the value of the checkbox will not be entered into the $_POST array. This is probably where you are having problems.

There are two ways around this. Either have one box checked by default, or use HTML like the following (which may or may not be best practice/valid, but has worked for me in the past).

<input type="hidden" name="services" value="foo" />
<input type="checkbox" name="services" value="in_home_care" />

In the event that the box is not checked, the value "foo" for the name value "services" will be passed to the $_POST array.

Nick Pyett
+1 Interesting approach to an old problem.
Chris Lively
Excellent! Basically I took your top line and added the '[]' to end of services. I printed out the array and it looked great. Now how does one go about passing these 7 values into their respective columns if you don't mind helping with that too? According to the CI handbook my 'post()' method is proper but I'm not having much luck yet...
nanerj
You can get the set value (which i what i think you want) from your checkbox by using the set_value() function i.e. set_value('services[]') and then pass this to a string/model/session. There is more here;http://codeigniter.com/user_guide/libraries/form_validation.html#arraysasfields
Nick Pyett
This worked great! I like this little hack.
nanerj
A: 

First of all, there is some redundancy in your form (I think). You can set the attributes of your checkbox in the array, including whether it is checked or not:

$servicesdata = array (
         'name'    =>  'services[]',
         'value'   =>  'in_home_care',
         'checked' =>  FALSE,
         );
echo form_checkbox($servicesdata);

secondly, because you're naming it in an array, the object needs to be accessed after being assigned to another variable:

$checkbox_array = $this->input->post('services');
$service_type=$checkbox_array[0];//will give you 'in_home_care', [1] would be next in array and so on
stormdrain
Actually there may be redundancy but I suspect it would be in the array I created, not the actual function.I'm quite tired but I'll try your second method tomorrow morning and get back to ya! Thanks!
nanerj
The array being created in your example works, it's just redundant. You set the name, value from the `servicesdata` array, then override that by setting name, value, and checked in the `form_checkbox` echo. Your form code will work as is; the problem is not there, but in your controller. Since your checkbox name is an array, you need to assign that to a variable, then access those values via the variable name and key (e.g. `$var[0]`) as per my example.
stormdrain
A: 

A way to store those choices in the db is to create a string out of them and store that.

$this->input->post('colors') ? $colors=implode('-',$this->input->post('colors')) : $colors='';

That checks to see if anything was actually checked in the colors array. If so, create a string out of the array values seperated by dashes. Else assign empty to colors.

Then after you read the db string back:

$profile_data['colors']=explode('-',$row->colors);

Then you can feed those values back into the form inputs.

mos fetish