Index: includes/form.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/form.inc,v retrieving revision 1.502 diff -u -p -r1.502 form.inc --- includes/form.inc 7 Oct 2010 17:31:39 -0000 1.502 +++ includes/form.inc 12 Oct 2010 17:14:01 -0000 @@ -1982,32 +1982,14 @@ function form_state_values_clean(&$form_ // form_builder() collects all button elements in a form. We remove the button // value separately for each button element. foreach ($form_state['buttons'] as $button) { - // Remove this button's value from the submitted form values by finding - // the value corresponding to this button. - // We iterate over the #parents of this button and move a reference to - // each parent in $form_state['values']. For example, if #parents is: - // array('foo', 'bar', 'baz') - // then the corresponding $form_state['values'] part will look like this: - // array( - // 'foo' => array( - // 'bar' => array( - // 'baz' => 'button_value', - // ), - // ), - // ) - // We start by (re)moving 'baz' to $last_parent, so we are able unset it - // at the end of the iteration. Initially, $values will contain a - // reference to $form_state['values'], but in the iteration we move the - // reference to $form_state['values']['foo'], and finally to - // $form_state['values']['foo']['bar'], which is the level where we can - // unset 'baz' (that is stored in $last_parent). - $parents = $button['#parents']; $values = &$form_state['values']; + $parents = $button['#parents']; $last_parent = array_pop($parents); - foreach ($parents as $parent) { - $values = &$values[$parent]; + $key_exists = NULL; + drupal_array_get_nested_value($values, $parents, $key_exists); + if ($key_exists) { + unset($values[$last_parent]); } - unset($values[$last_parent]); } }