class SearchApiSortsBlock in Search API sorts 8
Exposes a search api sorts rendered as a block.
Plugin annotation
@Block(
id = "search_api_sorts_block",
deriver = "Drupal\search_api_sorts\Plugin\Block\SearchApiSortsBlockDeriver"
)
Hierarchy
- class \Drupal\Component\Plugin\PluginBase implements DerivativeInspectionInterface, PluginInspectionInterface
- class \Drupal\Component\Plugin\ContextAwarePluginBase implements ContextAwarePluginInterface
- class \Drupal\Core\Plugin\ContextAwarePluginBase implements CacheableDependencyInterface, ContextAwarePluginInterface uses DependencySerializationTrait, StringTranslationTrait, TypedDataTrait
- class \Drupal\Core\Block\BlockBase implements BlockPluginInterface, PluginWithFormsInterface, PreviewFallbackInterface uses BlockPluginTrait, ContextAwarePluginAssignmentTrait
- class \Drupal\search_api_sorts\Plugin\Block\SearchApiSortsBlock uses ConfigIdEscapeTrait
- class \Drupal\Core\Block\BlockBase implements BlockPluginInterface, PluginWithFormsInterface, PreviewFallbackInterface uses BlockPluginTrait, ContextAwarePluginAssignmentTrait
- class \Drupal\Core\Plugin\ContextAwarePluginBase implements CacheableDependencyInterface, ContextAwarePluginInterface uses DependencySerializationTrait, StringTranslationTrait, TypedDataTrait
- class \Drupal\Component\Plugin\ContextAwarePluginBase implements ContextAwarePluginInterface
Expanded class hierarchy of SearchApiSortsBlock
File
- src/
Plugin/ Block/ SearchApiSortsBlock.php, line 19
Namespace
Drupal\search_api_sorts\Plugin\BlockView source
class SearchApiSortsBlock extends BlockBase {
use ConfigIdEscapeTrait;
/**
* {@inheritdoc}
*/
public function build() {
$build = [];
/** @var \Drupal\search_api\Display\DisplayInterface $search_api_display */
$search_api_display = $this->pluginDefinition['search_api_display'];
if (!$search_api_display
->isRenderedInCurrentRequest()) {
// Display is not rendered in current request, hide block.
return [];
}
/** @var \Drupal\search_api_sorts\SearchApiSortsManagerInterface $search_api_sorts_manager */
$search_api_sorts_manager = \Drupal::service('search_api_sorts.manager');
$enabled_sorts = $search_api_sorts_manager
->getEnabledSorts($search_api_display);
if (!$enabled_sorts) {
// No fields are enabled for sorting, hide block.
return [];
}
$active_sort = $search_api_sorts_manager
->getActiveSort($search_api_display);
$current_sort_field = $active_sort
->getFieldName();
$current_sort_order = $active_sort
->getOrder();
if ($active_sort
->getFieldName() == NULL) {
$default_sort = $search_api_sorts_manager
->getDefaultSort($search_api_display);
$current_sort_field = $default_sort
->getFieldName();
$current_sort_order = $default_sort
->getOrder();
}
// Helper array to sort enabled sorts by weight.
$sorts = [];
foreach ($enabled_sorts as $enabled_sort) {
$sorts[$enabled_sort
->get('field_identifier')] = [
'label' => $enabled_sort
->get('label'),
'weight' => $enabled_sort
->get('weight'),
'default_order' => $enabled_sort
->get('default_order'),
];
}
uasort($sorts, [
'Drupal\\Component\\Utility\\SortArray',
'sortByWeightElement',
]);
// TODO: fetch path by configuration (data source?) instead of current path.
$url = \Drupal::request()
->getRequestUri();
$base_path = \Drupal::request()
->getBasePath();
$url = str_replace($base_path, '', $url);
$url_array = UrlHelper::parse($url);
$items = [];
foreach ($sorts as $sort_field => $sort) {
$order = $sort['default_order'];
if ($sort_field == $current_sort_field) {
$order = $current_sort_order == 'desc' ? 'asc' : 'desc';
}
$url_array['query']['sort'] = $sort_field;
$url_array['query']['order'] = $order;
$active = $sort_field == $current_sort_field;
$order_indicator = '';
if ($active) {
$order_indicator = [
'#theme' => 'tablesort_indicator',
'#style' => $order,
];
}
$items[] = [
'#theme' => 'search_api_sorts_sort',
'#label' => $sort['label'],
'#url' => Url::fromUserInput($url_array['path'], [
'query' => $url_array['query'],
'fragment' => $url_array['fragment'],
])
->toString(),
'#active' => $active,
'#order' => $order,
'#order_indicator' => $order_indicator,
'#sort_field' => $sort_field,
];
}
$build['links'] = [
'#theme' => 'item_list__search_api_sorts',
'#items' => $items,
'#attributes' => [
'class' => [
'search-api-sorts',
'search-api-sorts--' . Html::getClass($search_api_display
->getPluginId()),
],
],
];
$build['#contextual_links']['search_api_sorts'] = [
'route_parameters' => [
'search_api_index' => $search_api_display
->getIndex()
->id(),
'search_api_display' => $this
->getEscapedConfigId($search_api_display
->getPluginId()),
],
];
return $build;
}
/**
* {@inheritdoc}
*/
public function getCacheMaxAge() {
// A search api sorts block cannot be cached, because it must always match
// the current search results, and Search API gets those search results from
// a data source that can be external to Drupal. Therefore it is impossible
// to guarantee that the search results are in sync with the data managed by
// Drupal. Consequently, it is not possible to cache the search results at
// all. If the search results cannot be cached, then neither can the search
// api sorts, because they must always match.
// Fortunately, search api sorts blocks are rendered using a lazy builder
// (like all blocks in Drupal), which means their rendering can be deferred
// (unlike the search results, which are the main content of the page, and
// deferring their rendering would mean sending an empty page to the user).
// This means that search api sorts blocks can be rendered and sent *after*
// the initial page was loaded, by installing the BigPipe (big_pipe) module.
//
// When BigPipe is enabled, the search results will appear first, and then
// each search api sorts block will appear one-by-one, in DOM order.
// See https://www.drupal.org/project/big_pipe.
//
// In a future version of search api sorts API, this could be refined, but
// due to the reliance on external data sources, it will be very difficult
// if not impossible to improve this significantly.
return 0;
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
BlockPluginInterface:: |
constant | Indicates the block label (title) should be displayed to end users. | ||
BlockPluginTrait:: |
protected | property | The transliteration service. | |
BlockPluginTrait:: |
public | function | ||
BlockPluginTrait:: |
protected | function | Returns generic default configuration for block plugins. | |
BlockPluginTrait:: |
protected | function | Indicates whether the block should be shown. | 16 |
BlockPluginTrait:: |
public | function | 16 | |
BlockPluginTrait:: |
public | function | 13 | |
BlockPluginTrait:: |
public | function | 3 | |
BlockPluginTrait:: |
public | function | Creates a generic configuration form for all block types. Individual block plugins can add elements to this form by overriding BlockBase::blockForm(). Most block plugins should not override this method unless they need to alter the generic form elements. | 2 |
BlockPluginTrait:: |
public | function | ||
BlockPluginTrait:: |
public | function | 19 | |
BlockPluginTrait:: |
public | function | 1 | |
BlockPluginTrait:: |
public | function | 1 | |
BlockPluginTrait:: |
public | function | 3 | |
BlockPluginTrait:: |
public | function | ||
BlockPluginTrait:: |
public | function | ||
BlockPluginTrait:: |
public | function | ||
BlockPluginTrait:: |
public | function | Sets the transliteration service. | |
BlockPluginTrait:: |
public | function | Most block plugins should not override this method. To add submission handling for a specific block type, override BlockBase::blockSubmit(). | |
BlockPluginTrait:: |
protected | function | Wraps the transliteration service. | |
BlockPluginTrait:: |
public | function | Most block plugins should not override this method. To add validation for a specific block type, override BlockBase::blockValidate(). | 1 |
BlockPluginTrait:: |
public | function | 22 | |
ConfigIdEscapeTrait:: |
protected | function | Escape a config id which can be used to save as a config entity. | |
ConfigIdEscapeTrait:: |
protected | function | Get original config id after loading a config entity using an escaped id. | |
ContextAwarePluginAssignmentTrait:: |
protected | function | Builds a form element for assigning a context to a given slot. | |
ContextAwarePluginAssignmentTrait:: |
protected | function | Wraps the context handler. | |
ContextAwarePluginBase:: |
protected | property | The data objects representing the context of this plugin. | |
ContextAwarePluginBase:: |
private | property | Data objects representing the contexts passed in the plugin configuration. | |
ContextAwarePluginBase:: |
protected | function |
Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
The cache contexts associated with this object. Overrides CacheableDependencyInterface:: |
9 |
ContextAwarePluginBase:: |
public | function |
The cache tags associated with this object. Overrides CacheableDependencyInterface:: |
4 |
ContextAwarePluginBase:: |
public | function |
This code is identical to the Component in order to pick up a different
Context class. Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
Gets a mapping of the expected assignment names to their context names. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function |
Gets the defined contexts. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function |
Gets the value for a defined context. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function |
Gets the values for all defined contexts. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function |
Set a context on this plugin. Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
Sets a mapping of the expected assignment names to their context names. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function |
Sets the value for a defined context. Overrides ContextAwarePluginBase:: |
|
ContextAwarePluginBase:: |
public | function |
Validates the set values for the defined contexts. Overrides ContextAwarePluginInterface:: |
|
ContextAwarePluginBase:: |
public | function | Implements magic __get() method. | |
DependencySerializationTrait:: |
protected | property | An array of entity type IDs keyed by the property name of their storages. | |
DependencySerializationTrait:: |
protected | property | An array of service IDs keyed by property name used for serialization. | |
DependencySerializationTrait:: |
public | function | 1 | |
DependencySerializationTrait:: |
public | function | 2 | |
MessengerTrait:: |
protected | property | The messenger. | 29 |
MessengerTrait:: |
public | function | Gets the messenger. | 29 |
MessengerTrait:: |
public | function | Sets the messenger. | |
PluginBase:: |
protected | property | Configuration information passed into the plugin. | 1 |
PluginBase:: |
protected | property | The plugin implementation definition. | 1 |
PluginBase:: |
protected | property | The plugin_id. | |
PluginBase:: |
constant | A string which is used to separate base plugin IDs from the derivative ID. | ||
PluginBase:: |
public | function |
Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the definition of the plugin implementation. Overrides PluginInspectionInterface:: |
3 |
PluginBase:: |
public | function |
Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface:: |
|
PluginBase:: |
public | function | Determines if the plugin is configurable. | |
PluginWithFormsTrait:: |
public | function | ||
PluginWithFormsTrait:: |
public | function | ||
SearchApiSortsBlock:: |
public | function |
Builds and returns the renderable array for this block plugin. Overrides BlockPluginInterface:: |
|
SearchApiSortsBlock:: |
public | function |
The maximum age for which this object may be cached. Overrides ContextAwarePluginBase:: |
|
StringTranslationTrait:: |
protected | property | The string translation service. | 1 |
StringTranslationTrait:: |
protected | function | Formats a string containing a count of items. | |
StringTranslationTrait:: |
protected | function | Returns the number of plurals supported by a given language. | |
StringTranslationTrait:: |
protected | function | Gets the string translation service. | |
StringTranslationTrait:: |
public | function | Sets the string translation service to use. | 2 |
StringTranslationTrait:: |
protected | function | Translates a string to the current language or to a given language. | |
TypedDataTrait:: |
protected | property | The typed data manager used for creating the data types. | |
TypedDataTrait:: |
public | function | Gets the typed data manager. | 2 |
TypedDataTrait:: |
public | function | Sets the typed data manager. | 2 |