Newer
Older
<?php
/**
* @defgroup form Form generation
* @{
* Functions to enable output of HTML forms and form elements.
*
* Drupal uses these functions to achieve consistency in its form presentation,
* while at the same time simplifying code and reducing the amount of HTML that
* must be explicitly generated by modules.
*/
/**
* Check if the key is a property.
*/
function element_property($key) {

Dries Buytaert
committed
return $key{0} == '#';
}
function element_properties($element) {
return array_filter(array_keys((array) $element), 'element_property');
}
/**
* Check if the key is a child.
*/
function element_child($key) {

Dries Buytaert
committed
return $key{0} != '#';
}
function element_children($element) {
return array_filter(array_keys((array) $element), 'element_child');
}
/**
* Processes a form array, and produces the HTML output of a form.
* If there is input in the $_POST['edit'] variable, this function
* will attempt to validate it, using <code>drupal_validate_form</code>,
* and then execute the form using <code>drupal_execute_form</code>.
*
* @param $form_id
* A unique string identifying the form. Allows each form to be themed.
* @param $form
* An associative array containing the structure of the form.
* @param $callback
* An optional callback that will be used in addition to the form_id.
*
*/
function drupal_get_form($form_id, &$form, $callback = NULL) {
global $form_values, $form_execute;
$form_values = array();
$form_execute = FALSE;

Dries Buytaert
committed
$form['#type'] = 'form';
if (isset($form['#token'])) {
$form['form_token'] = array('#type' => 'hidden', '#value' => md5($_SERVER['REMOTE_ADDR'] . $form['#token'] . variable_get('drupal_private_key',
'')));
$form['form_id'] = array('#type' => 'hidden', '#default_value' => $form_id);
$form = array_merge(_element_info('form'), $form);
foreach (module_implements('form_alter') as $module) {
$function = $module .'_form_alter';
$function($form);
}
if (function_exists($function)) {
$function($form);
}
$form = _form_builder($form);
if (!empty($_POST['edit']) && (($form_values['form_id'] == $form_id) || ($form_values['form_id'] == $callback))) {

Dries Buytaert
committed
drupal_validate_form($form_id, $form, $callback);
if ($form_execute && !form_get_errors()) {
drupal_execute_form($form_id, $form, $callback);
}
}
if (function_exists('theme_' . $form_id)) {

Dries Buytaert
committed
$form['#theme'] = $form_id;
}
elseif (function_exists('theme_' . $callback)) {

Dries Buytaert
committed
$form['#theme'] = $callback;
}
return form_render($form);
}
function drupal_validate_form($form_id, &$form, $callback = NULL) {
global $form_values;

Dries Buytaert
committed
if (isset($form['#token'])) {
if ($form_values['form_token'] != md5($_SERVER['REMOTE_ADDR'] . $form['#token'] . variable_get('drupal_private_key', ''))) {
// 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.'));
}
}
foreach (module_implements('form_validate_alter') as $module) {
$function = $module .'_form_validate_alter';
$function($form_id, $form_values);
}
_form_validate($form);
if (function_exists($form_id . '_validate')) {
call_user_func($form_id . '_validate', $form_id, $form_values);
}
if (function_exists($callback . '_validate')) {
call_user_func($callback . '_validate', $form_id, $form_values);
}
}
function drupal_execute_form($form_id, $form, $callback = NULL) {
global $form_values;

Dries Buytaert
committed
foreach (module_implements('form_execute_alter') as $module) {
$function = $module .'_form_execute_alter';
$function($form_id, $form_values);
}

Dries Buytaert
committed
if (function_exists($form_id . '_execute')) {
call_user_func($form_id . '_execute', $form_id, $form_values);
}
elseif (function_exists($callback . '_execute')) {
call_user_func($callback . '_execute', $form_id, $form_values);
// Recurse through all children.
foreach (element_children($elements) as $key) {
if (isset($elements[$key]) && $elements[$key]) {
_form_validate($elements[$key]);
}
}
/* Validate the current input */

Dries Buytaert
committed
if (!$elements['#validated'] && $elements['#input']) {
if ($elements['#required'] && !isset($elements['#value'])) {

Dries Buytaert
committed
form_error($elements, t('%name field is required', array('%name' => $elements['#title'])));
}
if ($elements['#valid']) {
if (is_array($elements['#valid'])) {
foreach ($elements['#valid'] as $key => $valid) {
$args = is_array($elements['#validation_arguments'][$key]) ? $elements['#validation_arguments'][$key] : array();
if (function_exists($valid . '_valid')) {
call_user_func_array($valid . '_valid', array_merge(array($elements), $args));

Dries Buytaert
committed
}
else {
$args = is_array($elements['#validation_arguments']) ? $elements['#validation_arguments'] : array();
if (function_exists($elements['#valid'] . '_valid')) {
call_user_func_array($elements['#valid'] . '_valid', array_merge(array($elements), $args));

Dries Buytaert
committed
$elements['#validated'] = TRUE;
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
/**
* File an error against a form element. If the name of the element is
* edit[foo][bar] then you may pass either foo or foo][bar as $name
* foo will set an error for all its children.
*/
function form_set_error($name = NULL, $message = NULL) {
static $form = array();
if (isset($name) && !isset($form[$name])) {
$form[$name] = $message;
drupal_set_message($message, 'error');
}
return $form;
}
/**
* Return an associative array of all errors.
*/
function form_get_errors() {
$form = form_set_error();
if (!empty($form)) {
return $form;
}
}
/**
* Return the error message filed against the form with the specified name.
*/
function form_get_error($element) {
$form = form_set_error();
$key = $element['#parents'][0];
if (isset($form[$key])) {
return $form[$key];
}
$key = implode('][', $element['#parents']);
if (isset($form[$key])) {
return $form[$key];
}
}
/**
* Flag an element as having an error.
*/
function form_error(&$element, $message) {

Dries Buytaert
committed
$element['#error'] = TRUE;
form_set_error(implode('][', $element['#parents']), $message);
}
/**
* Adds some required properties to each form element, which are used internally in the form api.
* This function also automatically assigns the value property from the $edit array, provided the
* element doesn't already have an assigned value.
*/
global $form_values;
global $form_execute;
/* Use element defaults */

Dries Buytaert
committed
if ((!empty($form['#type'])) && ($info = _element_info($form['#type']))) {
$form += $info;
}

Dries Buytaert
committed
if ($form['#input']) {
$form['#name'] = ($form['#name']) ? $form['#name'] : 'edit[' . implode('][', $form['#parents']) . ']';
$form['#id'] = ($form['#id']) ? $form['#id'] : 'edit-' . implode('-', $form['#parents']);
$posted = isset($_POST['edit']);
$edit = $posted ? $_POST['edit'] : array();
$ref =& $form_values;

Dries Buytaert
committed
foreach ($form['#parents'] as $parent) {
$edit = isset($edit[$parent]) ? $edit[$parent] : NULL;
$ref =& $ref[$parent];
}

Dries Buytaert
committed
if (!isset($form['#value'])) {
$form['#value'] = ($posted && isset($edit)) ? $edit : $form['#default_value'];

Dries Buytaert
committed
}
if (isset($form['#execute'])) {
if ($_POST[$form['#name']] == $form['#value']) {
$form_execute = $form_execute || $form['#execute'];

Dries Buytaert
committed
$ref = $form['#value'];
}
// Allow for elements to expand to multiple elements. Radios, checkboxes and files for instance.

Dries Buytaert
committed
if (function_exists($form['#process']) && !$form['#processed']) {
$form = call_user_func($form['#process'], $form);
$form['#processed'] = TRUE;
}
// Recurse through all child elements.
$count = 0;
foreach (element_children($form) as $key) {

Dries Buytaert
committed
$form[$key]['#tree'] = (isset($form[$key]['#tree'])) ? $form[$key]['#tree'] : $form['#tree'];
if (!$form['#tree']) {
// begin tree
$parents = array($key);
}
else {
//continue tree
$parents = (array) $form['#parents'];
array_push($parents, $key);
}
// no tree
$parents = array($key);
}
// don't squash existing parents value
$form[$key]['#parents'] = (isset($form[$key]['#parents'])) ? $form[$key]['#parents'] : $parents;
# Assign a decimal placeholder weight, to preserve original array order
$form[$key]['#weight'] = $form[$key]['#weight'] ? $form[$key]['#weight'] : $count/1000;
$form[$key] = _form_builder($form[$key]);
if (function_exists($form['#post_process']) && !$form['#post_processed']) {
$form = call_user_func($form['#post_process'], $form_id, $form, $form_values, $form['#parents']);
$form['#post_processed'] = TRUE;
}
return $form;
}
/**
* Renders a HTML form given an form tree. Recursively iterates over each of
* each of the form elements generating HTML code. This function is usually
* called from within a theme. To render a form from within a module, use
* <code>drupal_get_form()</code>.
*
* @param $elements
* The form tree describing the form.
* @return
* The rendered HTML form.
*/
function form_render(&$elements) {
$content = '';
if (is_array($elements)) {
uasort($elements, "_form_sort");
}

Dries Buytaert
committed
if (!$elements['#children']) {
/* render all the children using a theme function */

Dries Buytaert
committed
if ($elements['#theme'] && !$elements['#theme_used']) {
$elements['#theme_used'] = TRUE;
$previous_type = $elements['#type'];
$elements['#type'] = 'markup';
$content = theme($elements['#theme'], $elements);
$elements['#type'] = $previous_type;
}
/* render each of the children using form_render and concatenate them */
if (!$content) {
foreach (element_children($elements) as $key) {
$content .= form_render($elements[$key]);
}
}
}
if ($content) {

Dries Buytaert
committed
$elements['#children'] = $content;
}
/* Call the form element renderer */

Dries Buytaert
committed
if (!$elements['#printed']) {
$content = theme(($elements['#type']) ? $elements['#type']: 'markup', $elements);
$elements['#printed'] = TRUE;

Dries Buytaert
committed
if ($content) {
return $elements['#prefix'] . $content . $elements['#suffix'];
}
}
/**
* Function used by uasort in form render to sort form via weight.
*/
function _form_sort($a, $b) {

Dries Buytaert
committed
if ($a['#weight'] == $b['#weight']) {

Dries Buytaert
committed
return ($a['#weight'] < $b['#weight']) ? -1 : 1;
}
/**
* Retrieve the default properties for the defined element type.
*/
function _element_info($type, $refresh = null) {
static $cache;

Dries Buytaert
committed
'#description' => NULL,
'#attributes' => array(),
'#required' => FALSE,
'#tree' => FALSE,
'#parents' => $parents
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
);
if ($refresh || !is_array($cache)) {
$cache = array();
foreach (module_implements('elements') as $module) {
$elements = module_invoke($module, 'elements');
if (is_array($elements)) {
$cache = array_merge($cache, $elements);
}
}
if (sizeof($cache)) {
foreach ($cache as $element_type => $info) {
$cache[$element_type] = array_merge($basic_defaults, $info);
}
}
}
return $cache[$type];
}
/**
* Format a dropdown menu or scrolling selection box.
*
* @param $element
* An associative array containing the properties of the element.
* Properties used : title, value, options, description, extra, multiple, required
* @return
* A themed HTML string representing the form element.
*
* It is possible to group options together; to do this, change the format of
* $options to an associative array in which the keys are group labels, and the
* values are associative arrays in the normal $options format.
*/
function theme_select($element) {
$select = '';

Dries Buytaert
committed
foreach ($element['#options'] as $key => $choice) {
if (is_array($choice)) {
$select .= '<optgroup label="'. $key .'">';
foreach ($choice as $key => $choice) {

Dries Buytaert
committed
$select .= '<option value="'. $key .'"'. (is_array($element['#value']) ? (in_array($key, $element['#value']) ? ' selected="selected"' : '') : ($element['#value'] == $key ? ' selected="selected"' : '')) .'>'. check_plain($choice) .'</option>';
}
$select .= '</optgroup>';
}
else {

Dries Buytaert
committed
$select .= '<option value="'. $key .'"'. (is_array($element['#value']) ? (in_array($key, $element['#value']) ? ' selected="selected"' : '') : ($element['#value'] == $key ? ' selected="selected"' : '')) .'>'. check_plain($choice) .'</option>';
return theme('form_element', $element['#title'], '<select name="'. $element['#name'] .''. ($element['#multiple'] ? '[]' : '') .'"'. ($element['#multiple'] ? ' multiple="multiple" ' : '') . drupal_attributes($element['#attributes']) .' id="' . $element['#id'] .'">'. $select .'</select>', $element['#description'], $element['#id'], $element['#required'], form_get_error($element));
}
/**
* Format a group of form items.
*
* @param $element
* An associative array containing the properties of the element.
* Properties used : attributes, title, description, children, collapsible, collapsed
* @return
* A themed HTML string representing the form item group.
*/
function theme_fieldset($element) {

Dries Buytaert
committed
if ($element['#collapsible']) {
drupal_add_js('misc/collapse.js');

Dries Buytaert
committed
$element['#attributes']['class'] .= ' collapsible';
if ($element['#collapsed']) {
$element['#attributes']['class'] .= ' collapsed';

Dries Buytaert
committed
return '<fieldset' . drupal_attributes($element['#attributes']) .'>' . ($element['#title'] ? '<legend>'. $element['#title'] .'</legend>' : '') . $element['#children'] . $element['#value'] . ($element['#description'] ? '<div class="description">'. $element['#description'] .'</div>' : '') . "</fieldset>\n";
}
/**
* Format a radio button.
*
* @param $element
* An associative array containing the properties of the element.
* Properties used : required, return_value, value, attributes, title, description
* @return
* A themed HTML string representing the form item group.
*/
function theme_radio($element) {
$output = '<input type="radio" ';
$output .= 'class="'. _form_get_class('form-radio', $element['#required'], form_get_error($element)) .'" ';

Dries Buytaert
committed
$output .= 'name="' . $element['#name'] .'" ';
$output .= 'value="'. $element['#return_value'] .'" ';
$output .= ($element['#value'] == $element['#return_value']) ? ' checked="checked" ' : ' ';
$output .= drupal_attributes($element['#attributes']) .' />';
if (!is_null($element['#title'])) {
$output = '<label class="option">'. $output .' '. $element['#title'] .'</label>';
return theme('form_element', NULL, $output, $element['#description'], $element['#name'], $element['#required'], form_get_error($element));
}
/**
* Format a set of radio buttons.
*
* @param $element
* An associative array containing the properties of the element.
* Properties used : title, value, options, description, required and attributes.
* @return
* A themed HTML string representing the radio button set.
*/
function theme_radios($element) {

Dries Buytaert
committed
if ($element['#title'] || $element['#description']) {
return theme('form_element', $element['#title'], $element['#children'], $element['#description'], $element['#id'], $element['#required'], form_get_error($element));

Dries Buytaert
committed
return $element['#children'];
}
}
/**
* Format a set of radio buttons.
*
* @param $element
* An associative array containing the properties of the element.
* Properties used : title, value, options, description, required and attributes.
* @return
* A themed HTML string representing the radio button set.
*/
function theme_date($element) {

Dries Buytaert
committed
$output = '<div class="container-inline">' . $element['#children'] . '</div>';
return theme('form_element', $element['#title'], $output, $element['#description'], $element['#id'], $element['#required'], form_get_error($element));
}
/**
* Roll out a single checkbox element to a list of checkboxes, using the options array as index.
*/
function expand_date($element) {
// Default to current date

Dries Buytaert
committed
if (!isset($element['#value'])) {
$element['#value'] = array('day' => format_date(time(), 'custom', 'j'),
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
'month' => format_date(time(), 'custom', 'n'),
'year' => format_date(time(), 'custom', 'Y'));
}
// Determine the order of day, month, year in the site's chosen date format.
$format = variable_get('date_format_short', 'm/d/Y');
$sort = array();
$sort['day'] = max(strpos($format, 'd'), strpos($format, 'j'));
$sort['month'] = max(strpos($format, 'm'), strpos($format, 'M'));
$sort['year'] = strpos($format, 'Y');
asort($sort);
$order = array_keys($sort);
// Output multi-selector for date
foreach ($order as $type) {
switch ($type) {
case 'day':
$options = drupal_map_assoc(range(1, 31));
break;
case 'month':
$options = drupal_map_assoc(range(1, 12), '_profile_map_month');
break;
case 'year':
$options = drupal_map_assoc(range(1900, 2050));
break;
}
$element[$type] = array('#type' => 'select', '#value' => $element['#value'][$type], '#attributes' => $element['#attributes'], '#parents' => $element['#parents'], '#options' => $options, '#tree' => TRUE);
}
return $element;
}
/**
* Roll out a single adios element
* to a list of radios, using the options array as index.
*/
function expand_radios($element) {

Dries Buytaert
committed
if (count($element['#options']) > 0) {
foreach ($element['#options'] as $key => $choice) {

Dries Buytaert
committed
$element[$key] = array('#type' => 'radio', '#title' => $choice, '#return_value' => $key, '#default_value' => $element['#default_value'], '#attributes' => $element['#attributes'], '#parents' => $element['#parents'], '#spawned' => TRUE);
}
}
}
return $element;
}
/**
* Format a form item.
*
* @param $element
* An associative array containing the properties of the element.
* Properties used : title, value, description, required, error
* @return
* A themed HTML string representing the form item.
*/
function theme_item($element) {

Dries Buytaert
committed
return theme('form_element', $element['#title'], $element['#value'] . $element['#children'], $element['#description'], $element['#id'], $element['#required'], $element['#error']);
}
/**
* Format a checkbox.
*
* @param $element
* An associative array containing the properties of the element.
* Properties used : title, value, return_value, description, required
* @return
* A themed HTML string representing the checkbox.
*/
function theme_checkbox($element) {
$checkbox = '<input ';
$checkbox .= 'type="checkbox" ';
$checkbox .= 'class="'. _form_get_class('form-checkbox', $element['#required'], form_get_error($element)) . '" ';

Dries Buytaert
committed
$checkbox .= 'name="'. $element['#name'] .'" ';
$checkbox .= 'id="'. $element['#id'].'" ' ;
$checkbox .= 'value="'. $element['#return_value'] .'" ';
$checkbox .= ($element['#value'] == $element['#return_value']) ? ' checked="checked" ' : ' ';
$checkbox .= drupal_attributes($element['#attributes']) . ' />';
if (!is_null($element['#title'])) {
$checkbox = '<label class="option">'. $checkbox .' '. $element['#title'] .'</label>';
return theme('form_element', NULL, $checkbox, $element['#description'], $element['#name'], $element['#required'], form_get_error($element));
}
/**
* Format a set of checkboxes.
*
* @param $element
* An associative array containing the properties of the element.
* @return
* A themed HTML string representing the checkbox set.
*/
function theme_checkboxes($element) {

Dries Buytaert
committed
if ($element['#title'] || $element['#description']) {
return theme('form_element', $element['#title'], $element['#children'], $element['#description'], 'edit-'. $element['#name'], $element['#required'], form_get_error($element));

Dries Buytaert
committed
return $element['#children'];
}
}
function expand_checkboxes($element) {

Dries Buytaert
committed
$value = is_array($element['#value']) ? $element['#value'] : array();

Dries Buytaert
committed
if (count($element['#options']) > 0) {
if (!isset($element['#default_value']) || $element['#default_value'] == 0) {
$element['#default_value'] = array();

Dries Buytaert
committed
foreach ($element['#options'] as $key => $choice) {
if (!isset($element[$key])) {
$element[$key] = array('#type' => 'checkbox', '#processed' => TRUE, '#title' => $choice, '#default_value' => in_array($key, $value), '#attributes' => $element['#attributes']);
}
}
}
return $element;
}
function theme_submit($element) {
return theme('button', $element);
}
function theme_button($element) {

Dries Buytaert
committed
return '<input type="submit" class="form-'. $element['#button_type'] .'" name="'. $element['#name'] .'" value="'. check_plain($element['#value']) .'" '. drupal_attributes($element['#attributes']) ." />\n";
}
/**
* Format a hidden form field.
*
* @param $element
* An associative array containing the properties of the element.
* Properties used : value, edit
* @return
* A themed HTML string representing the hidden form field.
*/
function theme_hidden($element) {

Dries Buytaert
committed
return '<input type="hidden" name="'. $element['#name'] . '" id="' . $element['#id'] . '" value="'. check_plain($element['#value']) ."\" " . drupal_attributes($element['#attributes']) ." />\n";
}
/**
* Format a textfield.
*
* @param $element
* An associative array containing the properties of the element.
* Properties used : title, value, description, size, maxlength, required, attributes autocomplete_path
* @return
* A themed HTML string representing the textfield.
*/
function theme_textfield($element) {

Dries Buytaert
committed
$size = $element['#size'] ? ' size="' . $element['#size'] . '"' : '';
if ($element['#autocomplete_path']) {
drupal_add_js('misc/autocomplete.js');
$class = ' form-autocomplete';

Dries Buytaert
committed
$extra = '<input class="autocomplete" type="hidden" id="'. $element['#id'] .'-autocomplete" value="'. check_url(url($element['#autocomplete_path'], NULL, NULL, TRUE)) .'" disabled="disabled" />';
$output = '<input type="text" maxlength="'. $element['#maxlength'] .'" class="'. _form_get_class("form-text$class", $element['#required'], form_get_error($element)) .'" name="'. $element['#name'] .'" id="'. $element['#id'] .'" '. $size .' value="'. check_plain($element['#value']) .'"'. drupal_attributes($element['#attributes']) .' />';
return theme('form_element', $element['#title'], $output, $element['#description'], $element['#id'], $element['#required'], form_get_error($element)). $extra;
}
/**
* Format a form.
*
* @param $element
* An associative array containing the properties of the element.
* Properties used : action, method, attributes, children
* @return
* A themed HTML string representing the form.
*/
function theme_form($element) {
// Anonymous div to satisfy XHTML compliancy.

Dries Buytaert
committed
$action = $element['#action'] ? 'action="' . check_url($element['#action']) . '" ' : '';
return '<form '. $action . ' method="'. $element['#method'] .'" '. drupal_attributes($element['#attributes']) .">\n<div>". $element['#children'] ."\n</div></form>\n";
}
/**
* Format a textarea.
*
* @param $element
* An associative array containing the properties of the element.
* Properties used : title, value, description, rows, cols, required, attributes
* @return
* A themed HTML string representing the textarea.
*/
function theme_textarea($element) {

Dries Buytaert
committed
$cols = $element['#cols'] ? ' cols="'. $element['#cols'] .'"' : '';
return theme('form_element', $element['#title'], '<textarea'. $cols .' rows="'. $element['#rows'] .'" name="'. $element['#name'] .'" id="' . $element['#id'] .'" class="'. _form_get_class('textarea', $element['#required'], form_get_error($element)) .'"'. drupal_attributes($element['#attributes']) .'>'. check_plain($element['#value']) .'</textarea>', $element['#description'], $element['#id'], $element['#required'], form_get_error($element));
}
/**
* Format HTML markup for use in forms.
*
* This is used in more advanced forms, such as theme selection and filter format.
*
* @param $element
* An associative array containing the properties of the element.
* Properties used : prefix, value, children and suffix.
* @return
* A themed HTML string representing the HTML markup.
*/
function theme_markup($element) {

Dries Buytaert
committed
return $element['#value'] . $element['#children'];
}
/**
* Format a password field.
*
* @param $element
* An associative array containing the properties of the element.
* Properties used : title, value, description, size, maxlength, required, attributes
* @return
* A themed HTML string representing the form.
*/
function theme_password($element) {

Dries Buytaert
committed
$size = $element['#size'] ? ' size="'. $element['#size'] .'" ' : '';
$output = '<input type="password" maxlength="'. $element['#maxlength'] .'" class="'. _form_get_class("form-text $class", $element['#required'], form_get_error($element)) .'" name="'. $element['#name'] .'" id="'. $element['#id'] .'" '. $size . drupal_attributes($element['#attributes']) .' />';
return theme('form_element', $element['#title'], $output, $element['#description'], $element['#id'], $element['#required'], form_get_error($element));
}
/**
* Format a weight selection menu.
*
* @param $element
* An associative array containing the properties of the element.
* Properties used : title, delta, description
* @return
* A themed HTML string representing the form.
*/
function theme_weight($element) {

Dries Buytaert
committed
for ($n = (-1 * $element['#delta']); $n <= $element['#delta']; $n++) {

Dries Buytaert
committed
$element['#options'] = $weights;
$element['#type'] = 'select';
return form_render($element);
}
/**
* Format a file upload field.
*
* @param $title
* The label for the file upload field.
* @param $name
* The internal name used to refer to the field.
* @param $size
* A measure of the visible size of the field (passed directly to HTML).
* @param $description
* Explanatory text to display after the form item.
* @param $required
* Whether the user must upload a file to the field.
* @return
* A themed HTML string representing the field.
*
* For assistance with handling the uploaded file correctly, see the API
* provided by file.inc.
*/
function theme_file($element) {
return theme('form_element', $element['#title'], '<input type="file" class="'. _form_get_class('form-file', $element['#required'], form_get_error($element)) .'" name="'. $element['#name'] .'" id="'. form_clean_id($element['#id']) .'" size="'. $element['#size'] ."\" />\n", $element['#description'], $element['#id'], $element['#required'], form_get_error($element));
}
function _form_get_class($name, $required, $error) {
return $name. ($required ? ' required' : '') . ($error ? ' error' : '');
}
/**
* Remove invalid characters from an HTML ID attribute string
*
* @param $id
* The ID to clean
* @return
* The cleaned ID
*/
function form_clean_id($id = NULL) {
$id = str_replace('][', '-', $id);
return $id;
}
/**
* @} End of "defgroup form".
*/