You are here

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\Block

Code

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;
}