public function SearchApiSortsBlock::build in Search API sorts 8
Builds and returns the renderable array for this block plugin.
If a block should not be rendered because it has no content, then this method must also ensure to return no content: it must then only return an empty array, or an empty array with #cache set (with cacheability metadata indicating the circumstances for it being empty).
Return value
array A renderable array representing the content of the block.
Overrides BlockPluginInterface::build
See also
\Drupal\block\BlockViewBuilder
File
- src/
Plugin/ Block/ SearchApiSortsBlock.php, line 25
Class
- SearchApiSortsBlock
- Exposes a search api sorts rendered as a block.
Namespace
Drupal\search_api_sorts\Plugin\BlockCode
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;
}