You are here

function better_exposed_filters_exposed_form_plugin::exposed_form_alter in Better Exposed Filters 7

Same name and namespace in other branches
  1. 6.3 better_exposed_filters_exposed_form_plugin.inc \better_exposed_filters_exposed_form_plugin::exposed_form_alter()
  2. 6 better_exposed_filters_exposed_form_plugin.inc \better_exposed_filters_exposed_form_plugin::exposed_form_alter()
  3. 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']...)
}