You are here

function better_exposed_filters_exposed_form_plugin::exposed_form_alter in Better Exposed Filters 6

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. 7.3 better_exposed_filters_exposed_form_plugin.inc \better_exposed_filters_exposed_form_plugin::exposed_form_alter()
  3. 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;
}