function better_exposed_filters_exposed_form_plugin::exposed_form_alter in Better Exposed Filters 6
Same name and namespace in other branches
- 6.3 better_exposed_filters_exposed_form_plugin.inc \better_exposed_filters_exposed_form_plugin::exposed_form_alter()
- 7.3 better_exposed_filters_exposed_form_plugin.inc \better_exposed_filters_exposed_form_plugin::exposed_form_alter()
- 7 better_exposed_filters_exposed_form_plugin.inc \better_exposed_filters_exposed_form_plugin::exposed_form_alter()
Overrides views_plugin_exposed_form::exposed_form_alter
File
- ./
better_exposed_filters_exposed_form_plugin.inc, line 184 - Provides an Better Exposed Filters exposed form plugin for View 3.x.
Class
- better_exposed_filters_exposed_form_plugin
- @file Provides an Better Exposed Filters exposed form plugin for View 3.x.
Code
function exposed_form_alter(&$form, &$form_state) {
parent::exposed_form_alter($form, $form_state);
// If we have no visible elements, we don't show the Apply button.
$show_apply = FALSE;
/*
* Handle exposed sort elements. Sort options can be removed after BEF
* settings are specified, so we sanity check here.
*/
if (isset($this->options['bef']['sort']) && !empty($form['sort_by']) && !empty($form['sort_order'])) {
$show_apply = TRUE;
// Check for combined sort_by and sort_order
if ($this->options['bef']['sort']['combine']) {
// Combine sort_by and sort_order into a single element
$options = array();
// Add reset sort option at the top of the list
if ($this->options['bef']['sort']['reset']) {
$options[' '] = t($this->options['bef']['sort']['reset_label']);
}
$selected = '';
foreach ($form['sort_by']['#options'] as $by_key => $by_val) {
foreach ($form['sort_order']['#options'] as $order_key => $order_val) {
// Use a space to separate the two keys, we'll unpack them in our submit handler
$options["{$by_key} {$order_key}"] = "{$by_val} {$order_val}";
}
}
$form['sort_bef_combine'] = array(
'#type' => 'radios',
'#options' => $options,
'#title' => $form['sort_by']['#title'],
);
// Handle display-specific details
switch ($this->options['bef']['sort']['bef_format']) {
case 'bef':
$form['sort_bef_combine']['#prefix'] = '<div class="bef-sort-combined bef-select-as-radios">';
$form['sort_bef_combine']['#suffix'] = '</div>';
break;
case 'bef_links':
$form['sort_bef_combine']['#theme'] = 'select_as_links';
unset($form['sort_bef_combine']['#title']);
break;
case 'default':
$form['sort_bef_combine']['#type'] = 'select';
break;
}
// Add our submit routine to process
$form['#submit'][] = 'bef_sort_combine_submit';
// Remove the existing sort_by and sort_order elements
unset($form['sort_by']);
unset($form['sort_order']);
}
else {
// Leave sort_by and sort_order as separate elements
if ('bef' == $this->options['bef']['sort']['bef_format']) {
$form['sort_by']['#type'] = 'radios';
$form['sort_by']['#process'] = array(
'expand_radios',
'views_process_dependency',
);
$form['sort_by']['#prefix'] = '<div class="bef-sortby bef-select-as-radios">';
$form['sort_by']['#suffix'] = '</div>';
$form['sort_order']['#type'] = 'radios';
$form['sort_order']['#process'] = array(
'expand_radios',
'views_process_dependency',
);
$form['sort_order']['#prefix'] = '<div class="bef-sortorder bef-select-as-radios">';
$form['sort_order']['#suffix'] = '</div>';
}
else {
if ('bef_links' == $this->options['bef']['sort']['bef_format']) {
$form['sort_by']['#theme'] = 'select_as_links';
$form['sort_order']['#theme'] = 'select_as_links';
}
}
// Add reset sort option if selected
if ($this->options['bef']['sort']['reset']) {
array_unshift($form['sort_by']['#options'], $this->options['bef']['sort']['reset_label']);
}
}
// if ($this->options['bef']['sort']['combine']) { ... } else {
}
// if (isset($this->options['bef']['sort'])) {
/*
* Handle exposed pager elements
*/
if (isset($this->options['bef']['pager'])) {
$show_apply = TRUE;
switch ($this->options['bef']['pager']['bef_format']) {
case 'bef':
$form['items_per_page']['#type'] = 'radios';
$form['items_per_page']['#process'] = array(
'expand_radios',
'views_process_dependency',
);
$form['items_per_page']['#prefix'] = '<div class="bef-sortby bef-select-as-radios">';
$form['items_per_page']['#suffix'] = '</div>';
break;
case 'bef_links':
if (count($form['items_per_page']['#options']) > 1) {
$form['items_per_page']['#theme'] = 'select_as_links';
$form['items_per_page']['#items_per_page'] = max($form['items_per_page']['#default_value'], key($form['items_per_page']['#options']));
}
break;
}
}
/*
* Changes to the display of BEF filters need to be mirrored in hook_form_alter in
* better_exposed_filters.module to maintain Views 2.x support
*/
// Shorthand for all filters in this view
$filters = $form_state['view']->display_handler->handlers['filter'];
// Go through each saved option looking for Better Exposed Filter settings
foreach ($filters as $label => $filter) {
// foreach ($this->options['bef'] as $label => $options) {
// Sanity check: Ensure this filter is an exposed filter
if (!$filter->options['exposed']) {
continue;
}
// Grab the options for this filter
$options = array();
if (empty($this->options['bef'][$label])) {
$show_apply = TRUE;
continue;
}
else {
$options = $this->options['bef'][$label];
}
// Form element is designated by the element ID which is user-configurable
$field_id = $form['#info']["filter-{$label}"]['value'];
// Add a description to the exposed filter
if (!empty($options['more_options']['bef_filter_description'])) {
$form[$field_id]['#description'] = $options['more_options']['bef_filter_description'];
}
switch ($options['bef_format']) {
case 'bef_links':
$show_apply = TRUE;
$form[$field_id]['#theme'] = 'select_as_links';
break;
case 'bef_ul':
$show_apply = TRUE;
$form[$field_id]['#bef_nested'] = TRUE;
// Intentionally falling through to case 'bef':
case 'bef':
$show_apply = TRUE;
if (empty($form[$field_id]['#multiple'])) {
// Single-select -- display as radio buttons
$form[$field_id]['#type'] = 'radios';
$form[$field_id]['#process'] = array(
'expand_radios',
'views_process_dependency',
);
// Clean up objects from the options array (happens for taxonomy-based filters)
$opts = $form[$field_id]['#options'];
$form[$field_id]['#options'] = array();
foreach ($opts as $index => $opt) {
if (is_object($opt)) {
foreach ($opt->option as $key => $val) {
$form[$field_id]['#options'][$key] = $val;
}
}
else {
$form[$field_id]['#options'][$index] = $opt;
}
}
if (isset($form[$field_id]['#options']['All'])) {
// @TODO: The terms 'All' and 'Any' are customizable in Views
if (!$filters[$label]->options['expose']['optional']) {
// Some third-party filter handlers still add the "Any" option even if this is not
// an optional filter. Zap it here if they do.
unset($form[$field_id]['#options']['All']);
}
else {
// Otherwise, make sure the "Any" text is clean
$form[$field_id]['#options']['All'] = check_plain($form[$field_id]['#options']['All']);
}
}
// Render as radio buttons or radio buttons in a collapsible fieldset
if (!empty($options['more_options']['bef_collapsible'])) {
// Use the option label for the title of the fieldset
$form[$field_id]['#title'] = $form['#info']["filter-{$label}"]['label'];
unset($form['#info']["filter-{$label}"]['label']);
// Pass the description and title along in a way such that it doesn't get rendered as part of
// the exposed form widget. We'll render them as part of the fieldset.
$form[$field_id]['#bef_description'] = $form[$field_id]['#description'];
unset($form[$field_id]['#description']);
$form[$field_id]['#bef_title'] = $form[$field_id]['#title'];
unset($form[$field_id]['#title']);
// Take care of adding the fieldset in the theme layer
$form[$field_id]['#theme'] = 'select_as_radios_fieldset';
}
else {
// Render select element as radio buttons
$form[$field_id]['#theme'] = 'select_as_radios';
}
}
else {
// Render as checkboxes or checkboxes enclosed in a collapsible fieldset
if (!empty($options['more_options']['bef_collapsible'])) {
// Use exposed filter widget label as legend for this fieldset
$form[$field_id]['#title'] = $form['#info']["filter-{$label}"]['label'];
unset($form['#info']["filter-{$label}"]['label']);
$form[$field_id]['#theme'] = 'select_as_checkboxes_fieldset';
}
else {
$form[$field_id]['#theme'] = 'select_as_checkboxes';
}
// Add BEF's JavaScript to the mix to handle select all/none functionality
drupal_add_js(drupal_get_path('module', 'better_exposed_filters') . '/better_exposed_filters.js');
// Add select all/none functionality to this filter.
if ($options['more_options']['bef_select_all_none']) {
if (!isset($form[$field_id]['#attributes']['class'])) {
$form[$field_id]['#attributes']['class'] = 'bef-select-all-none';
}
else {
$form[$field_id]['#attributes']['class'] .= ' bef-select-all-none';
}
}
}
// if (empty($form[$field_id]['#multiple'])) { ... } else {
break;
// case 'bef':
case 'bef_hidden':
$form['#info']["filter-{$field_id}"]['label'] = '';
// Hide the label
$form["filter-{$field_id}"]['label'] = '';
if (empty($form[$field_id]['#multiple'])) {
$form[$field_id]['#type'] = 'hidden';
}
else {
$form[$field_id]['#theme'] = 'select_as_hidden';
}
break;
case 'default':
$show_apply = TRUE;
break;
}
// switch ($options['bef_format'])
}
// foreach ($this->options['bef']...)
// If our form has no visible filters, hide the submit button.
$form['submit']['#access'] = $show_apply;
}