=== index.php
==================================================================
--- index.php (revision 72)
+++ index.php (local)
@@ -14,6 +14,7 @@
include_once 'includes/common.inc';
fix_gpc_magic();
+fix_checkboxes();
$return = menu_execute_active_handler();
switch ($return) {
=== includes/common.inc
==================================================================
--- includes/common.inc (revision 72)
+++ includes/common.inc (local)
@@ -429,6 +429,38 @@
}
/**
+ * An unchecked checkbox is not present in $_POST, so give a default
+ * value of 0 here.
+ * With form_checkboxes, we always expect an array, but HTML does not send
+ * the empty array. This is also fixed here.
+ */
+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
* @{
* Converts data structures to different types.
@@ -1159,9 +1191,7 @@
if (!is_null($title)) {
$element = '';
}
- // 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));
}
/**
@@ -1194,10 +1224,7 @@
foreach ($options as $key => $choice) {
$choices .= ' ';
}
- // 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));
}
}
@@ -1375,8 +1402,8 @@
* 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 '\n";
+function form_hidden($name, $value, $edit = 'edit') {
+ return '\n";
}
/**