Am un câmp de dată pe sute de noduri indexate. Am creat o fațetă pentru câmpul de dată, dar afișează toate datele disponibile (ew). În schimb, am dori un filtru pentru nodurile „Disponibil acum” și nodurile „Disponibil în viitor”.
Soluție pentru fațete: creați un procesor personalizat pentru a înlocui rezultatele fațetelor (sute de marcaje temporale) cu „Disponibil acum” și „Disponibil în viitor”.
/**
* Oferă un procesor pentru disponibilitate.
*
* @FacetsProcessor(
* id = "availability_processor",
* label = @Translation ("Procesor de disponibilitate"),
* descriere = @Translation ("Disponibilitatea acum vs. viitoare"),
* etape = {
* „construire” = 14
*}
* )
*/
clasa DateProcessorHandler extinde UrlProcessorHandler implementează BuildProcessorInterface {
/**
* {@inheritdoc}
*/
construirea funcției publice (FacetInterface $față, matrice $rezultate) {
/** @var \Drupal\facets\Utility\FacetsUrlGenerator $url_generator */
$url_generator = \Drupal::service('facets.utility.url_generator');
/** @var ResultInterface $now_result */
$now_result = new Result($față, 'acum', 'Disponibil acum', 1);
$now_url = $url_generator->getUrl([$facet->id() => ['acum']]);
$now_result->setUrl($now_url);
/** @var ResultInterface $future_result */
$rezultat_viitor = rezultat nou ($față, 'viitor', 'Disponibil în viitor', 1);
$future_url = $url_generator->getUrl([$facet->id() => ['viitor']]);
$rezultat_viitor->setUrl($url_viitor);
$noi_rezultati = [$now_result, $future_result];
$fațetă->setResults($new_results);
returnează $noi_rezultate;
}
}
Funcționează grozav până acum; link-urile de pe fațetă adaugă și elimină parametrii URL „acum” și „viitor”, așa cum era de așteptat.
Cu toate acestea, rezultatele arată 0. Am încercat să mă abonez la SearchApiEvents::QUERY_PRE_EXECUTE
și modificarea interogării pentru a modifica condiția:
funcția protejată alterExploreQuery(QueryPreExecuteEvent $query_event) {
$availability_active_facet = ?????
$acum = \Drupal::service('datetime.time')->getRequestTime();
$operator = $availability_active_facet === 'acum' ? '=<': '>';
$query->getConditionGroup()->addCondition('field_date', $now, $operator);
}
Acest eveniment este declanșat cu mult înainte ca orice procesor să seteze elementele fațete active, așa că cum obțin valoarea fațetei active?
De asemenea, există vreo modalitate de a scoate link-urile „Disponibil acum/viitor” în locul datelor în afară de utilizarea unui procesor personalizat? Motivul pentru care întreb, procesorul personalizat apare ca o opțiune activată toate fațete, nu doar data la care vreau.