You are here

class SearchApiViewsFacetsBlockDisplay in Search API 7

Plugin class for displaying search facets in a block.

Hierarchy

Expanded class hierarchy of SearchApiViewsFacetsBlockDisplay

1 string reference to 'SearchApiViewsFacetsBlockDisplay'
search_api_views_views_plugins in contrib/search_api_views/search_api_views.views.inc
Implements hook_views_plugins().

File

contrib/search_api_views/includes/display_facet_block.inc, line 11
Display plugin for displaying the search facets in a block.

View source
class SearchApiViewsFacetsBlockDisplay extends views_plugin_display_block {
  public function displays_exposed() {
    return FALSE;
  }
  public function uses_exposed() {
    return FALSE;
  }
  public function option_definition() {
    $options = parent::option_definition();
    $options['linked_path'] = array(
      'default' => '',
    );
    $options['facet_field'] = '';
    $options['hide_block'] = FALSE;
    return $options;
  }
  public function options_form(&$form, &$form_state) {
    parent::options_form($form, $form_state);
    if (substr($this->view->base_table, 0, 17) != 'search_api_index_') {
      return;
    }
    switch ($form_state['section']) {
      case 'linked_path':
        $form['#title'] .= t('Search page path');
        $form['linked_path'] = array(
          '#type' => 'textfield',
          '#description' => t('The menu path to which search facets will link. Leave empty to use the current path.'),
          '#default_value' => $this
            ->get_option('linked_path'),
        );
        break;
      case 'facet_field':
        $form['facet_field'] = array(
          '#type' => 'select',
          '#title' => t('Facet field'),
          '#options' => $this
            ->getFieldOptions(),
          '#default_value' => $this
            ->get_option('facet_field'),
        );
        break;
      case 'use_more':
        $form['use_more']['#description'] = t('This will add a more link to the bottom of this view, which will link to the base path for the facet links.');
        $form['use_more_always'] = array(
          '#type' => 'value',
          '#value' => $this
            ->get_option('use_more_always'),
        );
        break;
      case 'hide_block':
        $form['hide_block'] = array(
          '#type' => 'checkbox',
          '#title' => t('Hide block'),
          '#description' => t('Hide this block, but still execute the search. ' . 'Can be used to show native Facet API facet blocks linking to the search page specified above.'),
          '#default_value' => $this
            ->get_option('hide_block'),
        );
        break;
    }
  }
  public function options_validate(&$form, &$form_state) {
    if (substr($this->view->base_table, 0, 17) != 'search_api_index_') {
      form_set_error('', t('The "Facets block" display can only be used with base tables based on Search API indexes.'));
    }
  }
  public function options_submit(&$form, &$form_state) {
    parent::options_submit($form, $form_state);
    switch ($form_state['section']) {
      case 'linked_path':
        $this
          ->set_option('linked_path', $form_state['values']['linked_path']);
        break;
      case 'facet_field':
        $this
          ->set_option('facet_field', $form_state['values']['facet_field']);
        break;
      case 'hide_block':
        $this
          ->set_option('hide_block', $form_state['values']['hide_block']);
        break;
    }
  }
  public function options_summary(&$categories, &$options) {
    parent::options_summary($categories, $options);
    $options['linked_path'] = array(
      'category' => 'block',
      'title' => t('Search page path'),
      'value' => $this
        ->get_option('linked_path') ? $this
        ->get_option('linked_path') : t('Use current path'),
    );
    $field_options = $this
      ->getFieldOptions();
    $options['facet_field'] = array(
      'category' => 'block',
      'title' => t('Facet field'),
      'value' => $this
        ->get_option('facet_field') ? $field_options[$this
        ->get_option('facet_field')] : t('None'),
    );
    $options['hide_block'] = array(
      'category' => 'block',
      'title' => t('Hide block'),
      'value' => $this
        ->get_option('hide_block') ? t('Yes') : t('No'),
    );
  }
  protected $field_options = NULL;
  protected function getFieldOptions() {
    if (!isset($this->field_options)) {
      $index_id = substr($this->view->base_table, 17);
      if (!($index_id && ($index = search_api_index_load($index_id)))) {
        $table = views_fetch_data($this->view->base_table);
        $table = empty($table['table']['base']['title']) ? $this->view->base_table : $table['table']['base']['title'];
        throw new SearchApiException(t('The "Facets block" display cannot be used with a view for @basetable. ' . 'Please only use this display with base tables representing search indexes.', array(
          '@basetable' => $table,
        )));
      }
      $this->field_options = array();
      if (!empty($index->options['fields'])) {
        foreach ($index
          ->getFields() as $key => $field) {
          $this->field_options[$key] = $field['name'];
        }
      }
    }
    return $this->field_options;
  }

  /**
   * Render the 'more' link
   */
  public function render_more_link() {
    if ($this
      ->use_more()) {
      $path = $this
        ->get_option('linked_path');
      $theme = views_theme_functions('views_more', $this->view, $this->display);
      $path = check_url(url($path, array()));
      return array(
        '#theme' => $theme,
        '#more_url' => $path,
        '#link_text' => check_plain($this
          ->use_more_text()),
      );
    }
  }
  public function query() {
    parent::query();
    $facet_field = $this
      ->get_option('facet_field');
    if (!$facet_field) {
      return NULL;
    }
    $base_path = $this
      ->get_option('linked_path');
    if (!$base_path) {
      $base_path = $_GET['q'];
    }
    $limit = empty($this->view->query->pager->options['items_per_page']) ? 10 : $this->view->query->pager->options['items_per_page'];
    $query_options =& $this->view->query
      ->getOptions();
    if (!$this
      ->get_option('hide_block')) {

      // If we hide the block, we don't need this extra facet.
      $query_options['search_api_facets']['search_api_views_facets_block'] = array(
        'field' => $facet_field,
        'limit' => $limit,
        'missing' => FALSE,
        'min_count' => 1,
      );
    }
    $query_options['search_api_base_path'] = $base_path;
    $this->view->query
      ->range(0, 0);
  }
  public function render() {
    if (substr($this->view->base_table, 0, 17) != 'search_api_index_') {
      form_set_error('', t('The "Facets block" display can only be used with base tables based on Search API indexes.'));
      return NULL;
    }
    $facet_field = $this
      ->get_option('facet_field');
    if (!$facet_field) {
      return NULL;
    }
    $this->view
      ->execute();
    if ($this
      ->get_option('hide_block')) {
      return NULL;
    }
    $results = $this->view->query
      ->getSearchApiResults();
    if (empty($results['search_api_facets']['search_api_views_facets_block'])) {
      return NULL;
    }
    $terms = $results['search_api_facets']['search_api_views_facets_block'];
    $filters = array();
    foreach ($terms as $term) {
      $filter = $term['filter'];
      if ($filter[0] == '"') {
        $filter = substr($filter, 1, -1);
      }
      elseif ($filter != '!') {

        // This is a range filter.
        $filter = substr($filter, 1, -1);
        $pos = strpos($filter, ' ');
        if ($pos !== FALSE) {
          $filter = '[' . substr($filter, 0, $pos) . ' TO ' . substr($filter, $pos + 1) . ']';
        }
      }
      $filters[$term['filter']] = $filter;
    }
    $index = $this->view->query
      ->getIndex();
    $options['field'] = $index->options['fields'][$facet_field];
    $options['field']['key'] = $facet_field;
    $options['index id'] = $index->machine_name;
    $options['value callback'] = '_search_api_facetapi_facet_create_label';
    $map = search_api_facetapi_facet_map_callback($filters, $options);
    $facets = array();
    $prefix = rawurlencode($facet_field) . ':';
    foreach ($terms as $term) {
      $name = $filter = $filters[$term['filter']];
      if (isset($map[$filter])) {
        $name = $map[$filter];
      }
      $query['f'][0] = $prefix . $filter;

      // Initializes variables passed to theme hook.
      $variables = array(
        'text' => $name,
        'path' => $this->view->query
          ->getOption('search_api_base_path'),
        'count' => $term['count'],
        'options' => array(
          'attributes' => array(
            'class' => 'facetapi-inactive',
          ),
          'html' => FALSE,
          'query' => $query,
        ),
      );

      // Override the $variables['#path'] if facetapi_pretty_paths is enabled.
      if (module_exists('facetapi_pretty_paths')) {

        // Get the appropriate facet adapter.
        $adapter = facetapi_adapter_load('search_api@' . $index->machine_name);

        // Get the URL processor and check if it uses pretty paths.
        $urlProcessor = $adapter
          ->getUrlProcessor();
        if ($urlProcessor instanceof FacetapiUrlProcessorPrettyPaths) {

          // Retrieve the pretty path alias from the URL processor.
          $facet = facetapi_facet_load($facet_field, 'search_api@' . $index->machine_name);
          $values = array(
            trim($term['filter'], '"'),
          );

          // Get the pretty path for the facet and remove the current search's
          // base path from it.
          $base_path_current = $urlProcessor
            ->getBasePath();
          $pretty_path = $urlProcessor
            ->getFacetPath($facet, $values, FALSE);
          $pretty_path = str_replace($base_path_current, '', $pretty_path);

          // Set the new, pretty path for the facet and remove the "f" query
          // parameter.
          $variables['path'] = $variables['path'] . $pretty_path;
          unset($variables['options']['query']['f']);
        }
      }

      // Themes the link, adds row to facets.
      $facets[] = array(
        'class' => array(
          'leaf',
        ),
        'data' => theme('facetapi_link_inactive', $variables),
      );
    }
    if (!$facets) {
      return NULL;
    }
    return array(
      'facets' => array(
        '#theme' => 'item_list',
        '#items' => $facets,
      ),
    );
  }
  public function execute() {
    $info['content'] = $this
      ->render();
    $info['content']['more'] = $this
      ->render_more_link();
    $info['subject'] = filter_xss_admin($this->view
      ->get_title());
    return $info;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
SearchApiViewsFacetsBlockDisplay::$field_options protected property
SearchApiViewsFacetsBlockDisplay::displays_exposed public function Determine if this display should display the exposed filters widgets. Overrides views_plugin_display::displays_exposed
SearchApiViewsFacetsBlockDisplay::execute public function The display block handler returns the structure necessary for a block. Overrides views_plugin_display_block::execute
SearchApiViewsFacetsBlockDisplay::getFieldOptions protected function
SearchApiViewsFacetsBlockDisplay::options_form public function Provide the default form for setting options. Overrides views_plugin_display_block::options_form
SearchApiViewsFacetsBlockDisplay::options_submit public function Perform any necessary changes to the form values prior to storage. There is no need for this function to actually store the data. Overrides views_plugin_display_block::options_submit
SearchApiViewsFacetsBlockDisplay::options_summary public function Provide the summary for page options in the views UI. Overrides views_plugin_display_block::options_summary
SearchApiViewsFacetsBlockDisplay::options_validate public function Validate the options form. Overrides views_plugin_display::options_validate
SearchApiViewsFacetsBlockDisplay::option_definition public function Information about options for all kinds of purposes will be held here. Overrides views_plugin_display_block::option_definition
SearchApiViewsFacetsBlockDisplay::query public function Inject anything into the query that the display handler needs. Overrides views_plugin_display::query
SearchApiViewsFacetsBlockDisplay::render public function Render this display. Overrides views_plugin_display::render
SearchApiViewsFacetsBlockDisplay::render_more_link public function Render the 'more' link Overrides views_plugin_display::render_more_link
SearchApiViewsFacetsBlockDisplay::uses_exposed public function Block views use exposed widgets only if AJAX is set. Overrides views_plugin_display_block::uses_exposed
views_object::$definition public property Handler's definition.
views_object::$options public property Except for displays, options for the object will be held here. 1
views_object::altered_option_definition function Collect this handler's option definition and alter them, ready for use.
views_object::construct public function Views handlers use a special construct function. 4
views_object::export_options public function
views_object::export_option_always public function Always exports the option, regardless of the default value.
views_object::options Deprecated public function Set default options on this object. 1
views_object::set_default_options public function Set default options.
views_object::set_definition public function Let the handler know what its full definition is.
views_object::unpack_options public function Unpack options over our existing defaults, drilling down into arrays so that defaults don't get totally blown away.
views_object::unpack_translatable public function Unpack a single option definition.
views_object::unpack_translatables public function Unpacks each handler to store translatable texts.
views_object::_set_option_defaults public function
views_plugin::$display public property The current used views display.
views_plugin::$plugin_name public property The plugin name of this plugin, for example table or full.
views_plugin::$plugin_type public property The plugin type of this plugin, for example style or query.
views_plugin::additional_theme_functions public function Provide a list of additional theme functions for the theme info page.
views_plugin::plugin_title public function Return the human readable name of the display.
views_plugin::summary_title public function Returns the summary of the settings in the display. 8
views_plugin::theme_functions public function Provide a full list of possible theme templates used by this style.
views_plugin_display::$extender public property Stores all available display extenders.
views_plugin_display::$handlers public property List of handlers for this display.
views_plugin_display::$view public property The top object of a view. Overrides views_plugin::$view
views_plugin_display::accept_attachments public function Can this display accept attachments?
views_plugin_display::access public function Determine if the user has access to this display of the view.
views_plugin_display::attach_to public function Allow displays to attach to other views. 2
views_plugin_display::defaultable_sections public function List which sections are defaultable and what items each section contains. 1
views_plugin_display::destroy public function Destructor. Overrides views_object::destroy
views_plugin_display::export_handler public function Special method to export items that have handlers.
views_plugin_display::export_option public function Override of export_option() Overrides views_object::export_option
views_plugin_display::export_plugin public function Special handling for plugin export.
views_plugin_display::export_style public function Special handling for the style export.
views_plugin_display::format_themes public function Format a list of theme templates for output by the theme info helper.
views_plugin_display::get_arguments_tokens public function Returns to tokens for arguments.
views_plugin_display::get_argument_text public function Provide some helpful text for the arguments. 1
views_plugin_display::get_field_labels public function List of fields for the current display with the associated relationship.
views_plugin_display::get_handler public function Get the handler object for a single handler.
views_plugin_display::get_handlers public function Get a full array of handlers for $type. This caches them.
views_plugin_display::get_link_display public function Check to see which display to use when creating links.
views_plugin_display::get_option public function Intelligently get an option either from this or default display.
views_plugin_display::get_pager_text public function Provide some helpful text for pagers. 1
views_plugin_display::get_path public function Return the base path to use for this display.
views_plugin_display::get_plugin public function Get the instance of a plugin, for example style or row.
views_plugin_display::get_special_blocks public function Provide the block system with any exposed widget blocks for this display.
views_plugin_display::get_style_type public function Displays can require a certain type of style plugin. 1
views_plugin_display::get_url public function
views_plugin_display::has_path public function Check to see if the display has a 'path' field. 1
views_plugin_display::hook_block_list public function If this display creates a block, implement one of these.
views_plugin_display::hook_menu public function If this display creates a page with a menu item, implement it here.
views_plugin_display::init public function 1
views_plugin_display::is_defaulted public function Determine if a given option is set to use the default or current display.
views_plugin_display::is_default_display public function If this display is the 'default' display which contains fallback settings. 1
views_plugin_display::is_identifier_unique public function Check if the provided identifier is unique.
views_plugin_display::options_override public function If override/revert was clicked, perform the proper toggle.
views_plugin_display::option_link public function Because forms may be split up into sections, this provides an easy URL to exactly the right section. Don't override this.
views_plugin_display::override_option public function Set an option and force it to be an override.
views_plugin_display::preview public function Fully render the display. 1
views_plugin_display::pre_execute public function Set up any variables on the view prior to execution.
views_plugin_display::render_area public function
views_plugin_display::render_empty public function
views_plugin_display::render_filters public function Not all display plugins will support filtering.
views_plugin_display::render_footer public function Render the footer of the view.
views_plugin_display::render_header public function Render the header of the view.
views_plugin_display::render_pager public function Not all display plugins will suppert pager rendering. 1
views_plugin_display::set_option public function Intelligently set an option either from this display or from the default display, if directed to do so.
views_plugin_display::set_override public function Flip the override setting for the given section.
views_plugin_display::unpack_handler public function Special method to unpack items that have handlers.
views_plugin_display::unpack_plugin public function Special handling for plugin unpacking.
views_plugin_display::unpack_style public function
views_plugin_display::uses_breadcrumb public function Check to see if the display needs a breadcrumb. 1
views_plugin_display::uses_exposed_form_in_block public function Check to see if the display can put the exposed form in a block.
views_plugin_display::uses_fields public function Determine if the display's style uses fields.
views_plugin_display::uses_link_display public function Check to see if the display has some need to link to another display. 1
views_plugin_display::use_ajax public function Does the display use AJAX?
views_plugin_display::use_group_by public function Does the display have groupby enabled?
views_plugin_display::use_more public function Does the display have a more link enabled?
views_plugin_display::use_more_always public function Should the enabled display more link be shown when no more items?
views_plugin_display::use_more_open_new_window public function Should the enabled display more link being opened in an new window?
views_plugin_display::use_more_text public function Does the display have custom link text?
views_plugin_display::use_pager public function Does the display have a pager enabled? 1
views_plugin_display::validate public function Make sure the display and all associated handlers are valid. Overrides views_plugin::validate 1
views_plugin_display::view_special_blocks public function Render any special blocks provided for this display.
views_plugin_display_block::block_caching_modes public function Provide a list of core's block caching modes.
views_plugin_display_block::execute_hook_block_list public function The default block handler doesn't support configurable items, but extended block handlers might be able to do interesting stuff with it.
views_plugin_display_block::get_cache_type public function Provide a single method to figure caching type, keeping a sensible default for when it's unset.
views_plugin_display_block::save_block_cache public function Save the block cache setting in the blocks table if this block already exists in the blocks table. Dirty fix until http://drupal.org/node/235673 gets in.
views_plugin_display_block::update_block_bid public function Update the block delta when the machine name of the display changes.