У меня есть поле даты на сотнях проиндексированных узлов. Я создал фасет для поля даты, но он отображает все доступные даты (фу). Вместо этого нам нужен фильтр для узлов «Доступно сейчас» и «Доступно в будущем».
Решение фасетов: создайте собственный процессор для замены результатов фасетов (сотни меток времени) на «Доступно сейчас» и «Доступно в будущем».
/**
* Обеспечивает процессор для доступности.
*
* @FacetsProcessor(
* id = "доступность_процессор",
* label = @Translation("Процессор доступности"),
* description = @Translation("Текущая и будущая доступность"),
* этапы = {
* "сборка" = 14
* }
* )
*/
class DateProcessorHandler расширяет UrlProcessorHandler, реализует BuildProcessorInterface {
/**
* {@inheritdoc}
*/
публичная функция сборки (FacetInterface $facet, массив $results) {
/** @var \Drupal\facets\Utility\FacetsUrlGenerator $url_generator */
$url_generator = \Drupal::service('facets.utility.url_generator');
/** @var ResultInterface $now_result */
$now_result = новый результат($facet, 'сейчас', 'Доступно сейчас', 1);
$now_url = $url_generator->getUrl([$facet->id() => ['now']]);
$now_result->setUrl($now_url);
/** @var ResultInterface $future_result */
$future_result = новый результат($facet, 'будущее', 'Доступно в будущем', 1);
$future_url = $url_generator->getUrl([$facet->id() => ['future']]);
$future_result->setUrl($future_url);
$new_results = [$now_result, $future_result];
$facet->setResults($new_results);
вернуть $new_results;
}
}
Пока отлично работает; ссылки на фасете добавляют и удаляют параметры URL «сейчас» и «будущее», как и ожидалось.
Однако результаты показывают 0. Я пытался подписаться на SearchApiEvents::QUERY_PRE_EXECUTE
и изменение запроса для изменения условия:
защищенная функция alterExploreQuery(QueryPreExecuteEvent $query_event) {
$availability_active_facet = ?????
$now = \Drupal::service('datetime.time')->getRequestTime();
$operator = $availability_active_facet === 'сейчас'? '=<' : '>';
$query->getConditionGroup()->addCondition('field_date', $now, $operator);
}
Это событие запускается задолго до того, как какой-либо процессор установит активные элементы фасета, так как же мне получить значение активного фасета?
Кроме того, есть ли способ вывести ссылки «Доступно сейчас/будущее» вместо дат, помимо использования специального процессора? Причина, по которой я спрашиваю, пользовательский процессор отображается как опция на все грани, а не только дату, которую я хочу.