diff --git a/includes/common.inc b/includes/common.inc index 6c253e2821da3881d014fba467918762cb26a401..cf46176cd52d8d7656692bfa80dc481392c85e82 100644 --- a/includes/common.inc +++ b/includes/common.inc @@ -429,6 +429,38 @@ function fix_gpc_magic() { } } +/** + * An unchecked checkbox is not present in $_POST so we fix it here by + * proving a default value of 0. Also, with form_checkboxes() we expect + * an array, but HTML does not send the empty array. This is also taken + * care off. + */ +function fix_checkboxes() { + if (isset($_POST['form_array'])) { + $_POST['edit'] = _fix_checkboxes($_POST['edit'], $_POST['form_array'], array()); + } + if (isset($_POST['form_zero'])) { + $_POST['edit'] = _fix_checkboxes($_POST['edit'], $_POST['form_zero'], 0); + } +} + +function _fix_checkboxes($array1, $array2, $value) { + if (is_array($array2) && count($array2)) { + foreach ($array2 as $k => $v) { + if (is_array($v) && count($v)) { + $array1[$k] = _fix_checkboxes($array1[$k], $v, $value); + } + else if (!isset($array1[$k])) { + $array1[$k] = $value; + } + } + } + else { + $array1 = $value; + } + return $array1; +} + /** * @name Conversion * @{ @@ -1160,9 +1192,7 @@ function form_checkbox($title, $name, $value = 1, $checked = FALSE, $description if (!is_null($title)) { $element = '<label class="option">'. $element .' '. $title .'</label>'; } - // Note: because unchecked boxes are not included in the POST data, we include - // a form_hidden() which will be overwritten for a checked box. - return form_hidden($name, 0) . theme('form_element', NULL, $element, $description, $name, $required, _form_get_error($name)); + return form_hidden($name, 1, 'form_zero') . theme('form_element', NULL, $element, $description, $name, $required, _form_get_error($name)); } /** @@ -1195,10 +1225,7 @@ function form_checkboxes($title, $name, $values, $options, $description = NULL, foreach ($options as $key => $choice) { $choices .= '<label class="option"><input type="checkbox" class="form-checkbox" name="edit['. $name .'][]" value="'. $key .'"'. (in_array($key, $values) ? ' checked="checked"' : ''). drupal_attributes($attributes) .' /> '. $choice .'</label><br />'; } - // Note: because unchecked boxes are not included in the POST data, we - // include a form_hidden() which will be overwritten as soon as there is at - // least one checked box. - return form_hidden($name, 0) . theme('form_element', $title, $choices, $description, NULL, $required, _form_get_error($name)); + return form_hidden($name, 1, 'form_array') . theme('form_element', $title, $choices, $description, NULL, $required, _form_get_error($name)); } } @@ -1376,8 +1403,8 @@ function form_file($title, $name, $size, $description = NULL, $required = FALSE) * but be sure to validate the data on the receiving page as it is possible for * an attacker to change the value before it is submitted. */ -function form_hidden($name, $value) { - return '<input type="hidden" name="edit['. $name .']" value="'. check_plain($value) ."\" />\n"; +function form_hidden($name, $value, $edit = 'edit') { + return '<input type="hidden" name="'. $edit .'['. $name .']" value="'. check_plain($value) ."\" />\n"; } /** diff --git a/index.php b/index.php index 060c66125660779c6c516b87b8786f7ac9d70ea0..c2e7647fc027d38711a444a53f4bc25dabda49d8 100644 --- a/index.php +++ b/index.php @@ -14,6 +14,7 @@ include_once 'includes/common.inc'; fix_gpc_magic(); +fix_checkboxes(); $return = menu_execute_active_handler(); switch ($return) {