class SearchApiViewsFacetsBlockDisplay in Search API 7
Plugin class for displaying search facets in a block.
Hierarchy
- class \views_object
- class \views_plugin
- class \views_plugin_display
- class \views_plugin
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
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
SearchApiViewsFacetsBlockDisplay:: |
protected | property | ||
SearchApiViewsFacetsBlockDisplay:: |
public | function |
Determine if this display should display the exposed filters widgets. Overrides views_plugin_display:: |
|
SearchApiViewsFacetsBlockDisplay:: |
public | function |
The display block handler returns the structure necessary for a block. Overrides views_plugin_display_block:: |
|
SearchApiViewsFacetsBlockDisplay:: |
protected | function | ||
SearchApiViewsFacetsBlockDisplay:: |
public | function |
Provide the default form for setting options. Overrides views_plugin_display_block:: |
|
SearchApiViewsFacetsBlockDisplay:: |
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:: |
|
SearchApiViewsFacetsBlockDisplay:: |
public | function |
Provide the summary for page options in the views UI. Overrides views_plugin_display_block:: |
|
SearchApiViewsFacetsBlockDisplay:: |
public | function |
Validate the options form. Overrides views_plugin_display:: |
|
SearchApiViewsFacetsBlockDisplay:: |
public | function |
Information about options for all kinds of purposes will be held here. Overrides views_plugin_display_block:: |
|
SearchApiViewsFacetsBlockDisplay:: |
public | function |
Inject anything into the query that the display handler needs. Overrides views_plugin_display:: |
|
SearchApiViewsFacetsBlockDisplay:: |
public | function |
Render this display. Overrides views_plugin_display:: |
|
SearchApiViewsFacetsBlockDisplay:: |
public | function |
Render the 'more' link Overrides views_plugin_display:: |
|
SearchApiViewsFacetsBlockDisplay:: |
public | function |
Block views use exposed widgets only if AJAX is set. Overrides views_plugin_display_block:: |
|
views_object:: |
public | property | Handler's definition. | |
views_object:: |
public | property | Except for displays, options for the object will be held here. | 1 |
views_object:: |
function | Collect this handler's option definition and alter them, ready for use. | ||
views_object:: |
public | function | Views handlers use a special construct function. | 4 |
views_object:: |
public | function | ||
views_object:: |
public | function | Always exports the option, regardless of the default value. | |
views_object:: |
public | function | Set default options on this object. | 1 |
views_object:: |
public | function | Set default options. | |
views_object:: |
public | function | Let the handler know what its full definition is. | |
views_object:: |
public | function | Unpack options over our existing defaults, drilling down into arrays so that defaults don't get totally blown away. | |
views_object:: |
public | function | Unpack a single option definition. | |
views_object:: |
public | function | Unpacks each handler to store translatable texts. | |
views_object:: |
public | function | ||
views_plugin:: |
public | property | The current used views display. | |
views_plugin:: |
public | property | The plugin name of this plugin, for example table or full. | |
views_plugin:: |
public | property | The plugin type of this plugin, for example style or query. | |
views_plugin:: |
public | function | Provide a list of additional theme functions for the theme info page. | |
views_plugin:: |
public | function | Return the human readable name of the display. | |
views_plugin:: |
public | function | Returns the summary of the settings in the display. | 8 |
views_plugin:: |
public | function | Provide a full list of possible theme templates used by this style. | |
views_plugin_display:: |
public | property | Stores all available display extenders. | |
views_plugin_display:: |
public | property | List of handlers for this display. | |
views_plugin_display:: |
public | property |
The top object of a view. Overrides views_plugin:: |
|
views_plugin_display:: |
public | function | Can this display accept attachments? | |
views_plugin_display:: |
public | function | Determine if the user has access to this display of the view. | |
views_plugin_display:: |
public | function | Allow displays to attach to other views. | 2 |
views_plugin_display:: |
public | function | List which sections are defaultable and what items each section contains. | 1 |
views_plugin_display:: |
public | function |
Destructor. Overrides views_object:: |
|
views_plugin_display:: |
public | function | Special method to export items that have handlers. | |
views_plugin_display:: |
public | function |
Override of export_option() Overrides views_object:: |
|
views_plugin_display:: |
public | function | Special handling for plugin export. | |
views_plugin_display:: |
public | function | Special handling for the style export. | |
views_plugin_display:: |
public | function | Format a list of theme templates for output by the theme info helper. | |
views_plugin_display:: |
public | function | Returns to tokens for arguments. | |
views_plugin_display:: |
public | function | Provide some helpful text for the arguments. | 1 |
views_plugin_display:: |
public | function | List of fields for the current display with the associated relationship. | |
views_plugin_display:: |
public | function | Get the handler object for a single handler. | |
views_plugin_display:: |
public | function | Get a full array of handlers for $type. This caches them. | |
views_plugin_display:: |
public | function | Check to see which display to use when creating links. | |
views_plugin_display:: |
public | function | Intelligently get an option either from this or default display. | |
views_plugin_display:: |
public | function | Provide some helpful text for pagers. | 1 |
views_plugin_display:: |
public | function | Return the base path to use for this display. | |
views_plugin_display:: |
public | function | Get the instance of a plugin, for example style or row. | |
views_plugin_display:: |
public | function | Provide the block system with any exposed widget blocks for this display. | |
views_plugin_display:: |
public | function | Displays can require a certain type of style plugin. | 1 |
views_plugin_display:: |
public | function | ||
views_plugin_display:: |
public | function | Check to see if the display has a 'path' field. | 1 |
views_plugin_display:: |
public | function | If this display creates a block, implement one of these. | |
views_plugin_display:: |
public | function | If this display creates a page with a menu item, implement it here. | |
views_plugin_display:: |
public | function | 1 | |
views_plugin_display:: |
public | function | Determine if a given option is set to use the default or current display. | |
views_plugin_display:: |
public | function | If this display is the 'default' display which contains fallback settings. | 1 |
views_plugin_display:: |
public | function | Check if the provided identifier is unique. | |
views_plugin_display:: |
public | function | If override/revert was clicked, perform the proper toggle. | |
views_plugin_display:: |
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:: |
public | function | Set an option and force it to be an override. | |
views_plugin_display:: |
public | function | Fully render the display. | 1 |
views_plugin_display:: |
public | function | Set up any variables on the view prior to execution. | |
views_plugin_display:: |
public | function | ||
views_plugin_display:: |
public | function | ||
views_plugin_display:: |
public | function | Not all display plugins will support filtering. | |
views_plugin_display:: |
public | function | Render the footer of the view. | |
views_plugin_display:: |
public | function | Render the header of the view. | |
views_plugin_display:: |
public | function | Not all display plugins will suppert pager rendering. | 1 |
views_plugin_display:: |
public | function | Intelligently set an option either from this display or from the default display, if directed to do so. | |
views_plugin_display:: |
public | function | Flip the override setting for the given section. | |
views_plugin_display:: |
public | function | Special method to unpack items that have handlers. | |
views_plugin_display:: |
public | function | Special handling for plugin unpacking. | |
views_plugin_display:: |
public | function | ||
views_plugin_display:: |
public | function | Check to see if the display needs a breadcrumb. | 1 |
views_plugin_display:: |
public | function | Check to see if the display can put the exposed form in a block. | |
views_plugin_display:: |
public | function | Determine if the display's style uses fields. | |
views_plugin_display:: |
public | function | Check to see if the display has some need to link to another display. | 1 |
views_plugin_display:: |
public | function | Does the display use AJAX? | |
views_plugin_display:: |
public | function | Does the display have groupby enabled? | |
views_plugin_display:: |
public | function | Does the display have a more link enabled? | |
views_plugin_display:: |
public | function | Should the enabled display more link be shown when no more items? | |
views_plugin_display:: |
public | function | Should the enabled display more link being opened in an new window? | |
views_plugin_display:: |
public | function | Does the display have custom link text? | |
views_plugin_display:: |
public | function | Does the display have a pager enabled? | 1 |
views_plugin_display:: |
public | function |
Make sure the display and all associated handlers are valid. Overrides views_plugin:: |
1 |
views_plugin_display:: |
public | function | Render any special blocks provided for this display. | |
views_plugin_display_block:: |
public | function | Provide a list of core's block caching modes. | |
views_plugin_display_block:: |
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:: |
public | function | Provide a single method to figure caching type, keeping a sensible default for when it's unset. | |
views_plugin_display_block:: |
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:: |
public | function | Update the block delta when the machine name of the display changes. |