Checkbox fields are unchecked
Because the functionality of the checkbox in the form doesn't work as I expected I tried to simplify the code.
So, I have a simple checkbox field:
$fields['test_12345'] = array(
'type' => 'checkbox',
'label' => 'TEST: ',
'checked' => true, // default is checked
);
As you can see I've set to be always checked: 'checked' => true
I used the validator to check another required conditions from the same form. The checkbox keeps the value as "checked" after page submit, but becomes "unchecked" when a rule is not fulfilled.
So in this way always the checkbox is toggled when I submit the page (checked/unchecked), even if the checked is set always to be true. I checked the post after value $this->validator->validate() and the correct value is posted. When the page is refreshed to be shown the error message the value of checkbox changes.
I suppose that is a bug and I wonder if you can confirm.
Thank you
Comments
To simulate I propose do it in this way: create a controller with a form with any input X and add a validation for that input. More than that add also a checkbox with attribute always checked = true
Submit the form and try to invalidate the X input (for instance make required but send it empty) and look at the value that takes the checkbox
If it's really necessary I will create one complete controller with that 2 elements.
<?php /** * @package No_Module\Controllers */ class contact_us extends Fuel_base_controller { public function __construct(){ parent::__construct(); } public function index(){ $vars = array(); // load Form_builder; $this->load->library('form_builder'); // load validator; $this->load->library('validator'); if($this->input->post()) { $this->validator->add_rule('first_name', 'required', 'First name is required', $this->input->post('first_name')); if ($this->validator->validate()) { $message = $this->input->post('message'); echo "OK"; } } // set the fields for the contact form $fields = array(); $fields['first_name'] = array('label' => lang('p_first_name')); // 'required' => true, $fields['checkbox'] = array('type' => 'checkbox', 'label' => 'Checkbox', 'checked' => true); // always true $form_init = array('submit_value' => 'Confirm', 'css_class' => 'c_form'); $this->form_builder->initialize($form_init); $this->form_builder->set_fields($fields); $this->form_builder->set_field_values($_POST); $this->form_builder->display_errors = TRUE; $this->form_builder->required_text = '<span class="required">*</span> Required'; $vars['form'] = $this->form_builder->render_divs(); // set the data from CMS $vars['body'] = $this->load->view('page/contact_form', $vars, true); // show page $this->fuel->pages->render('contact_us', $vars, array('render_mode' => 'cms')); } } ?>
It seems that even remains in the same page the checkbox is toggled at each form submit.
I tried to set FALSE or 0 and in that case keeps the same value => unchecked
This issues persists in application and also in modules
$checkbox = (!empty($_POST['checkbox'])) ? $_POST['checkbox'] : true; $fields['checkbox'] = array('type' => 'checkbox', 'label' => 'Checkbox', 'value' => 1, 'checked' => $checkbox);
I used
$fields['checkbox'] = array('type' => 'checkbox', 'label' => 'Checkbox', 'value' => 1, 'checked' => $this->input->post('checkbox'));
and everything seems to work well. As you can see I added the missing parameter'value' => 1,
and now it works.Thank you for your quick answer.
public function form_fields($values = array(), $related = array())
{
$fields = parent::form_fields($values, $related);
$checkbox = (!empty($values['is_editing_allowed'])) ? $values['is_editing_allowed'] : true;
$fields['is_editing_allowed'] = array('type' => 'checkbox','id'=>'is_editing_allowed' , 'name'=>'is_editing_allowed','label' => lang('is_editing_allowed'),'value' => 1, 'checked' => $checkbox);
}
now change the value if checked is_editing_allowed field than value 1 or value 0 from on_before_save function.
public function on_before_save($values)
{
parent::on_before_save($values);
if(!isset($values['is_editing_allowed'])){
$values['is_editing_allowed'] = '0';
}
}
That's it