summaryrefslogtreecommitdiff
path: root/includes/form.inc
diff options
context:
space:
mode:
Diffstat (limited to 'includes/form.inc')
-rw-r--r--includes/form.inc82
1 files changed, 29 insertions, 53 deletions
diff --git a/includes/form.inc b/includes/form.inc
index 3f845d38a..c29116f25 100644
--- a/includes/form.inc
+++ b/includes/form.inc
@@ -72,19 +72,21 @@ function drupal_get_form($form_id, &$form, $callback = NULL) {
if (!isset($form['#validate'])) {
if (function_exists($form_id .'_validate')) {
- $form['#validate'] = array($form_id .'_validate');
+ $form['#validate'] = array($form_id .'_validate' => array());
}
elseif (function_exists($callback .'_validate')) {
- $form['#validate'] = array($callback .'_validate');
+ $form['#validate'] = array($callback .'_validate' => array());
}
}
if (!isset($form['#submit'])) {
if (function_exists($form_id .'_submit')) {
- $form['#submit'] = array($form_id .'_submit');
+ // we set submit here so that it can be altered but use reference for
+ // $form_values because it will change later
+ $form['#submit'] = array($form_id .'_submit' => array($form_id, &$form_values));
}
elseif (function_exists($callback .'_submit')) {
- $form['#submit'] = array($callback .'_submit');
+ $form['#submit'] = array($callback .'_submit' => array($form_id, &$form_values));
}
}
@@ -121,71 +123,50 @@ function drupal_validate_form($form_id, &$form, $callback = NULL) {
}
}
- _form_validate($form);
-
- if (isset($form['#validate'])) {
- foreach ($form['#validate'] as $key => $function) {
- if (isset($form['#validation_arguments'][$key])) {
- $function_args = array_merge(array($form_id, $form_values), $form['#validation_arguments'][$key]);
- call_user_func_array($function, $function_args);
- }
- else {
- call_user_func($function, $form_id, $form_values);
- }
- }
- }
+ _form_validate($form, $form_id);
}
function drupal_submit_form($form_id, $form, $callback = NULL) {
global $form_values;
if (isset($form['#submit'])) {
- foreach ($form['#submit'] as $key => $function) {
- if (isset($form['#execution_arguments'][$key])) {
- $function_args = array_merge(array($form_id, $form_values), $form['#execution_arguments'][$key]);
- call_user_func_array($function, $function_args);
- }
- else {
- call_user_func($function, $form_id, $form_values);
+ foreach ($form['#submit'] as $function => $args) {
+ if (function_exists($function)) {
+ call_user_func_array($function, $args);
}
}
}
}
-function _form_validate($elements) {
-
- // Recurse through all children.
- foreach (element_children($elements) as $key) {
- if (isset($elements[$key]) && $elements[$key]) {
- _form_validate($elements[$key]);
- }
- }
-
+function _form_validate($elements, $form_id = NULL) {
/* Validate the current input */
- if (!$elements['#validated'] && $elements['#input']) {
+ if (!$elements['#validated'] && ($elements['#input'] || isset($form_id))) {
// An empty checkbox returns 0, an empty textfield returns '' so we use empty().
// Unfortunately, empty('0') returns TRUE so we need a special check for the '0' string.
if ($elements['#required'] && empty($elements['#value']) && $elements['#value'] !== '0') {
form_error($elements, t('%name field is required', array('%name' => $elements['#title'])));
}
if (isset($elements['#validate'])) {
- if (is_array($elements['#validate'])) {
- foreach ($elements['#validate'] as $key => $validate) {
- $args = is_array($elements['#validate_arguments'][$key]) ? $elements['#validate_arguments'][$key] : array();
- if (function_exists($validate)) {
- call_user_func_array($validate, array_merge(array($elements), $args));
- }
+ foreach ($elements['#validate'] as $function => $args) {
+ $args = array_merge(array($elements), $args);
+ // for the full form we hand over a copy of $form_values
+ if (isset($form_id)) {
+ $args = array_merge(array($form_id, $GLOBALS['form_values']), $args);
}
- }
- else {
- $args = is_array($elements['#validate_arguments']) ? $elements['#validate_arguments'] : array();
- if (function_exists($elements['#validate'])) {
- call_user_func_array($elements['#validate'], array_merge(array($elements), $args));
+ if (function_exists($function)) {
+ call_user_func_array($function, $args);
}
}
}
$elements['#validated'] = TRUE;
}
+
+ // Recurse through all children.
+ foreach (element_children($elements) as $key) {
+ if (isset($elements[$key]) && $elements[$key]) {
+ _form_validate($elements[$key]);
+ }
+ }
}
/**
@@ -287,16 +268,11 @@ function _form_builder($form_id, $form) {
// Allow for elements to expand to multiple elements. Radios, checkboxes and files for instance.
if (isset($form['#process']) && !$form['#processed']) {
- if (is_array($form['#process'])) {
- foreach ($form['#process'] as $process) {
- if (function_exists($process)) {
- $form = call_user_func($process, $form);
- }
+ foreach ($form['#process'] as $process => $args) {
+ if (function_exists($process)) {
+ $form = call_user_func($process, array_merge($form, $args));
}
}
- elseif (function_exists($form['#process'])) {
- $form = call_user_func($form['#process'], $form);
- }
$form['#processed'] = TRUE;
}