- Patch #111289 by jvandyk: form.inc cleanup.
parent
301d377986
commit
6a1a93cefa
|
@ -13,7 +13,7 @@
|
||||||
* The drupal_get_form() function handles retrieving, processing, and
|
* The drupal_get_form() function handles retrieving, processing, and
|
||||||
* displaying a rendered HTML form for modules automatically. For example:
|
* displaying a rendered HTML form for modules automatically. For example:
|
||||||
*
|
*
|
||||||
* // display the user registration form
|
* // Display the user registration form.
|
||||||
* $output = drupal_get_form('user_register');
|
* $output = drupal_get_form('user_register');
|
||||||
*
|
*
|
||||||
* Forms can also be built and submitted programmatically without any user input
|
* Forms can also be built and submitted programmatically without any user input
|
||||||
|
@ -309,10 +309,10 @@ function drupal_prepare_form($form_id, &$form) {
|
||||||
$base = $form['#base'];
|
$base = $form['#base'];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add a token, based on either #token or form_id, to any form displayed to authenticated users.
|
// Add a token, based on either #token or form_id, to any form displayed to
|
||||||
// This ensures that any submitted form was actually requested previously by the user and protects against
|
// authenticated users. This ensures that any submitted form was actually
|
||||||
// cross site request forgeries.
|
// requested previously by the user and protects against cross site request
|
||||||
|
// forgeries.
|
||||||
if (isset($form['#token'])) {
|
if (isset($form['#token'])) {
|
||||||
if ($form['#token'] === FALSE || $user->uid == 0 || $form['#programmed']) {
|
if ($form['#token'] === FALSE || $user->uid == 0 || $form['#programmed']) {
|
||||||
unset($form['#token']);
|
unset($form['#token']);
|
||||||
|
@ -351,8 +351,7 @@ function drupal_prepare_form($form_id, &$form) {
|
||||||
|
|
||||||
if (!isset($form['#submit'])) {
|
if (!isset($form['#submit'])) {
|
||||||
if (function_exists($form_id .'_submit')) {
|
if (function_exists($form_id .'_submit')) {
|
||||||
// we set submit here so that it can be altered but use reference for
|
// We set submit here so that it can be altered.
|
||||||
// $form_values because it will change later
|
|
||||||
$form['#submit'] = array($form_id .'_submit' => array());
|
$form['#submit'] = array($form_id .'_submit' => array());
|
||||||
}
|
}
|
||||||
elseif (function_exists($base .'_submit')) {
|
elseif (function_exists($base .'_submit')) {
|
||||||
|
@ -389,10 +388,10 @@ function drupal_validate_form($form_id, $form) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the session token was set by drupal_prepare_form(), ensure that it
|
// If the session token was set by drupal_prepare_form(), ensure that it
|
||||||
// matches the current user's session
|
// matches the current user's session.
|
||||||
if (isset($form['#token'])) {
|
if (isset($form['#token'])) {
|
||||||
if (!drupal_valid_token($form_values['form_token'], $form['#token'])) {
|
if (!drupal_valid_token($form_values['form_token'], $form['#token'])) {
|
||||||
// setting this error will cause the form to fail validation
|
// Setting this error will cause the form to fail validation.
|
||||||
form_set_error('form_token', t('Validation error, please try again. If this error persists, please contact the site administrator.'));
|
form_set_error('form_token', t('Validation error, please try again. If this error persists, please contact the site administrator.'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -423,7 +422,8 @@ function drupal_submit_form($form_id, $form) {
|
||||||
foreach ($form['#submit'] as $function => $args) {
|
foreach ($form['#submit'] as $function => $args) {
|
||||||
if (function_exists($function)) {
|
if (function_exists($function)) {
|
||||||
$args = array_merge($default_args, (array) $args);
|
$args = array_merge($default_args, (array) $args);
|
||||||
// Since we can only redirect to one page, only the last redirect will work
|
// Since we can only redirect to one page, only the last redirect
|
||||||
|
// will work.
|
||||||
$redirect = call_user_func_array($function, $args);
|
$redirect = call_user_func_array($function, $args);
|
||||||
if (isset($redirect)) {
|
if (isset($redirect)) {
|
||||||
$goto = $redirect;
|
$goto = $redirect;
|
||||||
|
@ -504,6 +504,17 @@ function drupal_redirect_form($form, $redirect = NULL) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Performs validation on form elements. First ensures required fields are
|
||||||
|
* completed, #maxlength is not exceeded, and selected options were in the
|
||||||
|
* list of options given to the user. Then calls user-defined validators.
|
||||||
|
*
|
||||||
|
* @param $elements
|
||||||
|
* An associative array containing the structure of the form.
|
||||||
|
* @param $form_id
|
||||||
|
* A unique string identifying the form for validation, submission,
|
||||||
|
* theming, and hook_form_alter functions.
|
||||||
|
*/
|
||||||
function _form_validate($elements, $form_id = NULL) {
|
function _form_validate($elements, $form_id = NULL) {
|
||||||
// Recurse through all children.
|
// Recurse through all children.
|
||||||
foreach (element_children($elements) as $key) {
|
foreach (element_children($elements) as $key) {
|
||||||
|
@ -526,7 +537,8 @@ function _form_validate($elements, $form_id = NULL) {
|
||||||
form_error($elements, t('!name cannot be longer than %max characters but is currently %length characters long.', array('!name' => empty($elements['#title']) ? $elements['#parents'][0] : $elements['#title'], '%max' => $elements['#maxlength'], '%length' => drupal_strlen($elements['#value']))));
|
form_error($elements, t('!name cannot be longer than %max characters but is currently %length characters long.', array('!name' => empty($elements['#title']) ? $elements['#parents'][0] : $elements['#title'], '%max' => $elements['#maxlength'], '%length' => drupal_strlen($elements['#value']))));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add legal choice check if element has #options. Can be skipped, but then you must validate your own element.
|
// Add legal choice check if element has #options. Can be skipped, but
|
||||||
|
// then you must validate your own element.
|
||||||
if (isset($elements['#options']) && isset($elements['#value']) && !isset($elements['#DANGEROUS_SKIP_CHECK'])) {
|
if (isset($elements['#options']) && isset($elements['#value']) && !isset($elements['#DANGEROUS_SKIP_CHECK'])) {
|
||||||
if ($elements['#type'] == 'select') {
|
if ($elements['#type'] == 'select') {
|
||||||
$options = form_options_flatten($elements['#options']);
|
$options = form_options_flatten($elements['#options']);
|
||||||
|
@ -550,11 +562,11 @@ function _form_validate($elements, $form_id = NULL) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// User-applied checks.
|
// Call user-defined validators.
|
||||||
if (isset($elements['#validate'])) {
|
if (isset($elements['#validate'])) {
|
||||||
foreach ($elements['#validate'] as $function => $args) {
|
foreach ($elements['#validate'] as $function => $args) {
|
||||||
$args = array_merge(array($elements), $args);
|
$args = array_merge(array($elements), $args);
|
||||||
// for the full form we hand over a copy of $form_values
|
// For the full form we hand over a copy of $form_values.
|
||||||
if (isset($form_id)) {
|
if (isset($form_id)) {
|
||||||
$args = array_merge(array($form_id, $GLOBALS['form_values']), $args);
|
$args = array_merge(array($form_id, $GLOBALS['form_values']), $args);
|
||||||
}
|
}
|
||||||
|
@ -618,7 +630,7 @@ function form_error(&$element, $message = '') {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds some required properties to each form element, which are used
|
* Adds some required properties to each form element, which are used
|
||||||
* internally in the form api. This function also automatically assigns
|
* internally in the form API. This function also automatically assigns
|
||||||
* the value property from the $edit array, provided the element doesn't
|
* the value property from the $edit array, provided the element doesn't
|
||||||
* already have an assigned value.
|
* already have an assigned value.
|
||||||
*
|
*
|
||||||
|
@ -636,7 +648,7 @@ function form_builder($form_id, $form) {
|
||||||
|
|
||||||
/* Use element defaults */
|
/* Use element defaults */
|
||||||
if ((!empty($form['#type'])) && ($info = _element_info($form['#type']))) {
|
if ((!empty($form['#type'])) && ($info = _element_info($form['#type']))) {
|
||||||
// overlay $info onto $form, retaining preexisting keys in $form
|
// Overlay $info onto $form, retaining preexisting keys in $form.
|
||||||
$form += $info;
|
$form += $info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -645,9 +657,9 @@ function form_builder($form_id, $form) {
|
||||||
$name = array_shift($form['#parents']);
|
$name = array_shift($form['#parents']);
|
||||||
$form['#name'] = $name;
|
$form['#name'] = $name;
|
||||||
if ($form['#type'] == 'file') {
|
if ($form['#type'] == 'file') {
|
||||||
// to make it easier to handle $_FILES in file.inc, we place all
|
// To make it easier to handle $_FILES in file.inc, we place all
|
||||||
// file fields in the 'files' array. Also, we do not support
|
// file fields in the 'files' array. Also, we do not support
|
||||||
// nested file names
|
// nested file names.
|
||||||
$form['#name'] = 'files['. $form['#name'] .']';
|
$form['#name'] = 'files['. $form['#name'] .']';
|
||||||
}
|
}
|
||||||
elseif (count($form['#parents'])) {
|
elseif (count($form['#parents'])) {
|
||||||
|
@ -691,7 +703,8 @@ function form_builder($form_id, $form) {
|
||||||
|
|
||||||
case 'textfield':
|
case 'textfield':
|
||||||
if (isset($edit)) {
|
if (isset($edit)) {
|
||||||
// Equate $edit to the form value to ensure it's marked for validation
|
// Equate $edit to the form value to ensure it's marked for
|
||||||
|
// validation.
|
||||||
$edit = str_replace(array("\r", "\n"), '', $edit);
|
$edit = str_replace(array("\r", "\n"), '', $edit);
|
||||||
$form['#value'] = $edit;
|
$form['#value'] = $edit;
|
||||||
}
|
}
|
||||||
|
@ -706,7 +719,7 @@ function form_builder($form_id, $form) {
|
||||||
$form['#value'] = $edit;
|
$form['#value'] = $edit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Mark all posted values for validation
|
// Mark all posted values for validation.
|
||||||
if ((isset($form['#value']) && $form['#value'] === $edit) || (isset($form['#required']) && $form['#required'])) {
|
if ((isset($form['#value']) && $form['#value'] === $edit) || (isset($form['#required']) && $form['#required'])) {
|
||||||
$form['#needs_validation'] = TRUE;
|
$form['#needs_validation'] = TRUE;
|
||||||
}
|
}
|
||||||
|
@ -723,21 +736,22 @@ function form_builder($form_id, $form) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (isset($form['#executes_submit_callback'])) {
|
if (isset($form['#executes_submit_callback'])) {
|
||||||
// Count submit and non-submit buttons
|
// Count submit and non-submit buttons.
|
||||||
$form_button_counter[$form['#executes_submit_callback']]++;
|
$form_button_counter[$form['#executes_submit_callback']]++;
|
||||||
// See if a submit button was pressed
|
// See if a submit button was pressed.
|
||||||
if (isset($form['#post'][$form['#name']]) && $form['#post'][$form['#name']] == $form['#value']) {
|
if (isset($form['#post'][$form['#name']]) && $form['#post'][$form['#name']] == $form['#value']) {
|
||||||
$form_submitted = $form_submitted || $form['#executes_submit_callback'];
|
$form_submitted = $form_submitted || $form['#executes_submit_callback'];
|
||||||
|
|
||||||
// In most cases, we want to use form_set_value() to manipulate the global variables.
|
// In most cases, we want to use form_set_value() to manipulate the
|
||||||
// In this special case, we want to make sure that the value of this element is listed
|
// global variables. In this special case, we want to make sure that
|
||||||
// in $form_variables under 'op'.
|
// the value of this element is listed in $form_variables under 'op'.
|
||||||
$form_values[$form['#name']] = $form['#value'];
|
$form_values[$form['#name']] = $form['#value'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allow for elements to expand to multiple elements, e.g. radios, checkboxes and files.
|
// Allow for elements to expand to multiple elements, e.g., radios,
|
||||||
|
// checkboxes and files.
|
||||||
if (isset($form['#process']) && !$form['#processed']) {
|
if (isset($form['#process']) && !$form['#processed']) {
|
||||||
foreach ($form['#process'] as $process => $args) {
|
foreach ($form['#process'] as $process => $args) {
|
||||||
if (function_exists($process)) {
|
if (function_exists($process)) {
|
||||||
|
@ -763,28 +777,30 @@ function form_builder($form_id, $form) {
|
||||||
foreach (element_children($form) as $key) {
|
foreach (element_children($form) as $key) {
|
||||||
$form[$key]['#post'] = $form['#post'];
|
$form[$key]['#post'] = $form['#post'];
|
||||||
$form[$key]['#programmed'] = $form['#programmed'];
|
$form[$key]['#programmed'] = $form['#programmed'];
|
||||||
// don't squash an existing tree value
|
// Don't squash an existing tree value.
|
||||||
if (!isset($form[$key]['#tree'])) {
|
if (!isset($form[$key]['#tree'])) {
|
||||||
$form[$key]['#tree'] = $form['#tree'];
|
$form[$key]['#tree'] = $form['#tree'];
|
||||||
}
|
}
|
||||||
|
|
||||||
// deny access to child elements if parent is denied
|
// Deny access to child elements if parent is denied.
|
||||||
if (isset($form['#access']) && !$form['#access']) {
|
if (isset($form['#access']) && !$form['#access']) {
|
||||||
$form[$key]['#access'] = FALSE;
|
$form[$key]['#access'] = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// don't squash existing parents value
|
// Don't squash existing parents value.
|
||||||
if (!isset($form[$key]['#parents'])) {
|
if (!isset($form[$key]['#parents'])) {
|
||||||
// Check to see if a tree of child elements is present. If so, continue down the tree if required.
|
// Check to see if a tree of child elements is present. If so,
|
||||||
|
// continue down the tree if required.
|
||||||
$form[$key]['#parents'] = $form[$key]['#tree'] && $form['#tree'] ? array_merge($form['#parents'], array($key)) : array($key);
|
$form[$key]['#parents'] = $form[$key]['#tree'] && $form['#tree'] ? array_merge($form['#parents'], array($key)) : array($key);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assign a decimal placeholder weight to preserve original array order
|
// Assign a decimal placeholder weight to preserve original array order.
|
||||||
if (!isset($form[$key]['#weight'])) {
|
if (!isset($form[$key]['#weight'])) {
|
||||||
$form[$key]['#weight'] = $count/1000;
|
$form[$key]['#weight'] = $count/1000;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// If one the child elements has a weight then we will need to sort later.
|
// If one of the child elements has a weight then we will need to sort
|
||||||
|
// later.
|
||||||
unset($form['#sorted']);
|
unset($form['#sorted']);
|
||||||
}
|
}
|
||||||
$form[$key] = form_builder($form_id, $form[$key]);
|
$form[$key] = form_builder($form_id, $form[$key]);
|
||||||
|
@ -824,8 +840,8 @@ function form_set_value($form, $value) {
|
||||||
/**
|
/**
|
||||||
* Helper function for form_set_value().
|
* Helper function for form_set_value().
|
||||||
*
|
*
|
||||||
* We iterate of $parents and create nested arrays for them
|
* We iterate over $parents and create nested arrays for them
|
||||||
* in $form_values if needed. Then we insert the value in
|
* in $form_values if needed. Then we insert the value into
|
||||||
* the right array.
|
* the right array.
|
||||||
*/
|
*/
|
||||||
function _form_set_value(&$form_values, $form, $parents, $value) {
|
function _form_set_value(&$form_values, $form, $parents, $value) {
|
||||||
|
@ -953,7 +969,7 @@ function form_select_options($element, $choices = NULL) {
|
||||||
* that hold the given key. Returns an array of indexes that match.
|
* that hold the given key. Returns an array of indexes that match.
|
||||||
*
|
*
|
||||||
* This function is useful if you need to modify the options that are
|
* This function is useful if you need to modify the options that are
|
||||||
* already in a form element, for example, to remove choices which are
|
* already in a form element; for example, to remove choices which are
|
||||||
* not valid because of additional filters imposed by another module.
|
* not valid because of additional filters imposed by another module.
|
||||||
* One example might be altering the choices in a taxonomy selector.
|
* One example might be altering the choices in a taxonomy selector.
|
||||||
* To correctly handle the case of a multiple hierarchy taxonomy,
|
* To correctly handle the case of a multiple hierarchy taxonomy,
|
||||||
|
@ -1168,7 +1184,7 @@ function expand_date($element) {
|
||||||
asort($sort);
|
asort($sort);
|
||||||
$order = array_keys($sort);
|
$order = array_keys($sort);
|
||||||
|
|
||||||
// Output multi-selector for date
|
// Output multi-selector for date.
|
||||||
foreach ($order as $type) {
|
foreach ($order as $type) {
|
||||||
switch ($type) {
|
switch ($type) {
|
||||||
case 'day':
|
case 'day':
|
||||||
|
@ -1211,7 +1227,7 @@ function map_month($month) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper function to load value from default value for checkboxes
|
* Helper function to load value from default value for checkboxes.
|
||||||
*/
|
*/
|
||||||
function checkboxes_value(&$form) {
|
function checkboxes_value(&$form) {
|
||||||
$value = array();
|
$value = array();
|
||||||
|
@ -1509,9 +1525,9 @@ function theme_file($element) {
|
||||||
* An associative array containing the properties of the element.
|
* An associative array containing the properties of the element.
|
||||||
* Properties used: title, description, id, required
|
* Properties used: title, description, id, required
|
||||||
* @param $value
|
* @param $value
|
||||||
* the form element's data
|
* The form element's data.
|
||||||
* @return
|
* @return
|
||||||
* a string representing the form element
|
* A string representing the form element.
|
||||||
*/
|
*/
|
||||||
function theme_form_element($element, $value) {
|
function theme_form_element($element, $value) {
|
||||||
$output = '<div class="form-item">'."\n";
|
$output = '<div class="form-item">'."\n";
|
||||||
|
@ -1544,9 +1560,9 @@ function theme_form_element($element, $value) {
|
||||||
* Adds 'required' and 'error' classes as needed.
|
* Adds 'required' and 'error' classes as needed.
|
||||||
*
|
*
|
||||||
* @param &$element
|
* @param &$element
|
||||||
* The form element
|
* The form element.
|
||||||
* @param $name
|
* @param $name
|
||||||
* Array of new class names to be added
|
* Array of new class names to be added.
|
||||||
*/
|
*/
|
||||||
function _form_set_class(&$element, $class = array()) {
|
function _form_set_class(&$element, $class = array()) {
|
||||||
if ($element['#required']) {
|
if ($element['#required']) {
|
||||||
|
@ -1565,9 +1581,9 @@ function _form_set_class(&$element, $class = array()) {
|
||||||
* Remove invalid characters from an HTML ID attribute string.
|
* Remove invalid characters from an HTML ID attribute string.
|
||||||
*
|
*
|
||||||
* @param $id
|
* @param $id
|
||||||
* The ID to clean
|
* The ID to clean.
|
||||||
* @return
|
* @return
|
||||||
* The cleaned ID
|
* The cleaned ID.
|
||||||
*/
|
*/
|
||||||
function form_clean_id($id = NULL) {
|
function form_clean_id($id = NULL) {
|
||||||
$id = str_replace(array('][', '_', ' '), '-', $id);
|
$id = str_replace(array('][', '_', ' '), '-', $id);
|
||||||
|
|
Loading…
Reference in New Issue