function better_exposed_filters_exposed_form_plugin::exposed_form_alter in Better Exposed Filters 7
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()
- 6 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()
Overrides views_plugin_exposed_form::exposed_form_alter
File
- ./
better_exposed_filters_exposed_form_plugin.inc, line 205 - 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);
/*
* Handle exposed sort elements
*/
if (isset($this->options['bef']['sort'])) {
// Check for combined sort_by and sort_order
if ($this->options['bef']['sort']['combine']) {
// Combine sort_by and sort_order into a single element
$form['sort_bef_combine'] = array(
'#type' => 'radios',
'#title' => $form['sort_by']['#title'],
);
$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']);
}
else {
$form['sort_bef_combine']['#default_value'] = '';
}
$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';
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';
if (empty($form['sort_by']['#process'])) {
$form['sort_by']['#process'] = array();
}
array_unshift($form['sort_by']['#process'], 'form_process_radios');
$form['sort_by']['#prefix'] = '<div class="bef-sortby bef-select-as-radios">';
$form['sort_by']['#suffix'] = '</div>';
$form['sort_order']['#type'] = 'radios';
if (empty($form['sort_order']['#process'])) {
$form['sort_order']['#process'] = array();
}
array_unshift($form['sort_order']['#process'], 'form_process_radios');
$form['sort_order']['#prefix'] = '<div class="bef-sortorder bef-select-as-radios">';
$form['sort_order']['#suffix'] = '</div>';
}
elseif ('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'])) {
switch ($this->options['bef']['pager']['bef_format']) {
case 'bef':
$form['items_per_page']['#type'] = 'radios';
if (empty($form['items_per_page']['#process'])) {
$form['items_per_page']['#process'] = array();
}
array_unshift($form['items_per_page']['#process'], 'form_process_radios');
$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 ($this->options['bef'] as $label => $options) {
// Sanity check: Ensure this filter is an exposed filter
if (empty($filters[$label]) || !$filters[$label]->options['exposed']) {
continue;
}
// Form element is designated by the element ID which is user-configurable
$field_id = $form['#info']["filter-{$label}"]['value'];
if (!isset($options['bef_format'])) {
$options['bef_format'] = '';
}
switch ($options['bef_format']) {
case 'bef_links':
$form[$field_id]['#theme'] = 'select_as_links';
break;
case 'bef_ul':
$form[$field_id]['#bef_nested'] = TRUE;
// Intentionally falling through to case 'bef':
case 'bef':
if (empty($form[$field_id]['#multiple'])) {
// Single-select -- display as radio buttons
$form[$field_id]['#type'] = 'radios';
if (empty($form[$field_id]['#process'])) {
$form[$field_id]['#process'] = array();
}
array_unshift($form[$field_id]['#process'], 'form_process_radios');
// 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)) {
list($key, $val) = each($opt->option);
$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']['multiple']) {
// 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'])) {
// 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.
if (isset($form['#info']["filter-{$label}"]['label'])) {
$form[$field_id]['#bef_title'] = $form['#info']["filter-{$label}"]['label'];
unset($form['#info']["filter-{$label}"]['label']);
}
if (!empty($options['more_options']['bef_filter_description'])) {
$form[$field_id]['#bef_description'] = $options['more_options']['bef_filter_description'];
if (isset($form[$field_id]['#description'])) {
unset($form[$field_id]['#description']);
}
}
// Add collapse/expand Javascript and BEF CSS to prevent collapsed
// fieldset from disappearing.
if (empty($form[$field_id]['#attached']['js'])) {
$form[$field_id]['#attached']['js'] = array(
base_path() . 'misc/form.js',
base_path() . 'misc/collapse.js',
);
}
else {
$form[$field_id]['#attached']['js'][] = base_path() . 'misc/form.js';
$form[$field_id]['#attached']['js'][] = base_path() . 'misc/collapse.js';
}
if (empty($form[$field_id]['#attached']['css'])) {
$form[$field_id]['#attached']['css'] = array(
drupal_get_path('module', 'better_exposed_filters') . '/better_exposed_filters.css',
);
}
else {
$form[$field_id]['#attached']['css'][] = drupal_get_path('module', 'better_exposed_filters') . '/better_exposed_filters.css';
}
// 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'])) {
// 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.
if (isset($form['#info']["filter-{$label}"]['label'])) {
$form[$field_id]['#bef_title'] = $form['#info']["filter-{$label}"]['label'];
unset($form['#info']["filter-{$label}"]['label']);
}
if (!empty($options['more_options']['bef_filter_description'])) {
$form[$field_id]['#bef_description'] = $options['more_options']['bef_filter_description'];
if (isset($form[$field_id]['#description'])) {
unset($form[$field_id]['#description']);
}
}
// Add collapse/expand Javascript and BEF CSS to prevent collapsed
// fieldset from disappearing.
if (empty($form[$field_id]['#attached']['js'])) {
$form[$field_id]['#attached']['js'] = array(
base_path() . 'misc/form.js',
base_path() . 'misc/collapse.js',
);
}
else {
$form[$field_id]['#attached']['js'][] = base_path() . 'misc/form.js';
$form[$field_id]['#attached']['js'][] = base_path() . 'misc/collapse.js';
}
if (empty($form[$field_id]['#attached']['css'])) {
$form[$field_id]['#attached']['css'] = array(
drupal_get_path('module', 'better_exposed_filters') . '/better_exposed_filters.css',
);
}
else {
$form[$field_id]['#attached']['css'][] = drupal_get_path('module', 'better_exposed_filters') . '/better_exposed_filters.css';
}
// Take care of adding the fieldset in the theme layer
$form[$field_id]['#theme'] = 'select_as_checkboxes_fieldset';
}
else {
$form[$field_id]['#theme'] = 'select_as_checkboxes';
}
if ($options['more_options']['bef_select_all_none']) {
// Add BEF's JavaScript to the mix to handle select all/none functionality
// @TODO: move to #attached
drupal_add_js(drupal_get_path('module', 'better_exposed_filters') . '/better_exposed_filters.js');
// Add select all/none functionality to this filter.
if (!isset($form[$field_id]['#attributes']['class'])) {
$form[$field_id]['#attributes']['class'] = array();
}
$form[$field_id]['#bef_select_all_none'] = TRUE;
}
}
// if (empty($form[$field_id]['#multiple'])) { ... } else {
break;
// case 'bef':
case 'bef_hidden':
$form['#info']["filter-{$field_id}"]['label'] = '';
// Hide the label
if (empty($form[$field_id]['#multiple'])) {
$form[$field_id]['#type'] = 'hidden';
}
else {
$form[$field_id]['#theme'] = 'select_as_hidden';
}
break;
default:
// Handle functionality for exposed filters that are not limited to BEF only filters
// Add a description to the exposed filter
if (!empty($options['more_options']['bef_filter_description'])) {
$form[$field_id]['#description'] = t($options['more_options']['bef_filter_description']);
}
break;
}
// switch ($options['bef_format'])
}
// foreach ($this->options['bef']...)
}