Form builder for the exposed widgets form.
Be sure that $view and $display are references.
function views_exposed_form($form, &$form_state) {
// Don't show the form when batch operations are in progress.
if ($batch = batch_get() && isset($batch['current_set'])) {
return array(
// Set the theme callback to be nothing to avoid errors in template_preprocess_views_exposed_form().
'#theme' => '',
);
}
// Make sure that we validate because this form might be submitted
// multiple times per page.
$form_state['must_validate'] = TRUE;
$view =& $form_state['view'];
$display =& $form_state['display'];
$form_state['input'] = $view
->getExposedInput();
// Let form plugins know this is for exposed widgets.
$form_state['exposed'] = TRUE;
// Check if the form was already created
if ($cache = views_exposed_form_cache($view->storage
->get('name'), $view->current_display)) {
return $cache;
}
$form['#info'] = array();
// Go through each handler and let it generate its exposed widget.
foreach ($view->display_handler->handlers as $type => $value) {
foreach ($view->{$type} as $id => $handler) {
if ($handler
->canExpose() && $handler
->isExposed()) {
// Grouped exposed filters have their own forms.
// Instead of render the standard exposed form, a new Select or
// Radio form field is rendered with the available groups.
// When an user choose an option the selected value is split
// into the operator and value that the item represents.
if ($handler
->isAGroup()) {
$handler
->group_form($form, $form_state);
$id = $handler->options['group_info']['identifier'];
}
else {
$handler
->buildExposedForm($form, $form_state);
}
if ($info = $handler
->exposedInfo()) {
$form['#info']["{$type}-{$id}"] = $info;
}
}
}
}
$form['submit'] = array(
// Prevent from showing up in $_GET.
'#name' => '',
'#type' => 'submit',
'#value' => t('Apply'),
'#id' => drupal_html_id('edit-submit-' . $view->storage
->get('name')),
);
$form['#action'] = url($view->display_handler
->getUrl());
$form['#theme'] = views_theme_functions('views_exposed_form', $view, $display);
$form['#id'] = drupal_clean_css_identifier('views_exposed_form-' . check_plain($view->storage
->get('name')) . '-' . check_plain($display['id']));
// $form['#attributes']['class'] = array('views-exposed-form');
// If using AJAX, we need the form plugin.
if ($view->use_ajax) {
$form['#attached']['library'][] = array(
'system',
'jquery.form',
);
}
$exposed_form_plugin = $form_state['exposed_form_plugin'];
$exposed_form_plugin
->exposed_form_alter($form, $form_state);
// Save the form
views_exposed_form_cache($view->storage
->get('name'), $view->current_display, $form);
return $form;
}