Рейтинг:1

Search API + Facets: перезапись вывода фасета и условное изменение условия запроса на основе активного фильтра

флаг kr

У меня есть поле даты на сотнях проиндексированных узлов. Я создал фасет для поля даты, но он отображает все доступные даты (фу). Вместо этого нам нужен фильтр для узлов «Доступно сейчас» и «Доступно в будущем».

Решение фасетов: создайте собственный процессор для замены результатов фасетов (сотни меток времени) на «Доступно сейчас» и «Доступно в будущем».

/**
 * Обеспечивает процессор для доступности.
 *
 * @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);
}

Это событие запускается задолго до того, как какой-либо процессор установит активные элементы фасета, так как же мне получить значение активного фасета?

Кроме того, есть ли способ вывести ссылки «Доступно сейчас/будущее» вместо дат, помимо использования специального процессора? Причина, по которой я спрашиваю, пользовательский процессор отображается как опция на все грани, а не только дату, которую я хочу.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.