Hoppa till huvudinnehåll
Menu

Den här sidan använder cookies. Om du fortsätter använda sidan så accepterar du användandet av cookies. Läs mer om cookies

Jag förstår

Hur man slår ihop två facetter i Facet API

Att ändra en Sorl search query för en facett med hjälp av dessa moduler: Search API, Search API solr, facet API, Facet API bonus samt egen kod.

Jag har konfigurerat dessa moduler till en söksida som visar innehåll utefter en solr söksträng samt en list med innehållets nodtyp som facetter att filtrera sökresultat efter. Det finns en uppsjö med bloggposter om hur man gör detta redan, så jag tänker inte gå in djupare i hur man gör det, en bra start är Search API solr dokumentationen.

Min lista över facetter (representerar nodtyper av sökressultatet) ser ut så här:

  • Foo (22)
  • Bar (18)
  • Elit (10)
  • Ipsum (9)
  • Ultricies (5)
  • Mattis (2)
  • Quam (1)

Jag vill slå ihop två av dessa till en facett och vill alltså att listan ska se ut så här:

  • Foo and Bar (40)
  • Elit (10)
  • Ipsum (9)
  • Ultricies (5)
  • Mattis (2)
  • Quam (1)

Lösningen var att använda hooken hook_search_api_solr_query_alter() från Search API modulen. Jag ändrade solr search frågan för en av dessa facetter "Foo" och förde in att även filtrera på nodtypen "Bar". För att kunna göra det behöver du gräva fram facettnamnet (för att kunna ändra bara den facetten av alla) i argumentet $query.

<?php
function YOUR_CUSTOM_MODULE_search_api_solr_query_alter(array &$call_args, SearchApiQueryInterface $query) {

  // Fetching the facet name to change solr query on.
  $facet_item = $query->getFilter()->getFilters();
  if (!empty($facet_item)) {
    $facet_item = $facet_item[0]->getFilters();

    if (!empty($facet_item[0])) {
      if (!empty($facet_item[0][1])) {
        $facet_item = $facet_item[0][1];
        // This is my facet item I wont to change solr query on "Foo" and also add node type "Bar" to the filter.
        if ($facet_item === 'foo') {
          $call_args['params']['fq'][0] = $call_args['params']['fq'][0] . ' OR  ss_type:"bar"';
        }
      }
    }
  }
}
?>

Nu har vi lyckats ändra Solr sök frågan för facetten "Foo", men vi vill även ändra text så att man ser att den även filtrerar på nodtypen "Bar". För att kunna ändra den texten använder vi hooken hook_facet_items_alter() från modulen Facet API Bonus. Kom ihåg att man måste bocka i att man vill använda den hooken i konfigurationen av denna facetten.

<?php
function YOUR_CUSTOM_MODULE_facet_items_alter(&$build, &$settings) {

  if ($settings->facet == "type") {

    // Save this number to add on the combined facet item.
    $number_of_bar = $build['bar']['#count'];

    foreach($build as $key => $item) {
      switch ($key) {
        case 'foo':
          // Change the title of facet item to represent two facet items
          // (Foo & Bar).
          $build['foo']["#markup"] = t('Foo and Bar');

          // Smash the count of hits together.
          if ($build['foo']['#count'] > 0) {
            $build['foo']['#count'] = $build['foo']['#count'] + $number_of_bar;
          }
          break;

        // Remove this facet item now when Foo item will include this node type in the search result.
        case 'bar':
          unset($build['bar']);
          break;
      }
    }
  }
}
?>

Nu borde vå lista av facetter se ut så här.

  • Foo and Bar (40)
  • Elit (10)
  • Ipsum (9)
  • Ultricies (5)
  • Mattis (2)
  • Quam (1)

Jag har även skrivit ut söktexten och filtret man just filtrerat med Facet API submodul Current Search. Denna modul gör möjligt att lägga ut ett block med text och token. I mitt fall skrev jag ut texten "Din sökning på X med filtrering X gav X träff/ar". Detta va möjligt att göra med de tokens denna modul gav mig. Denna inställning återfinns på konfigurationssidan "admin/config/search/current_search". Problemet nu är att jag ändrat både frågan och texten för en av facetterna och behöver alltså ändra denna token så att texten blir "Din sökning på X med filtrering Foo och Bar gav X träff/ar". Detta kan man göra med hooken hook_tokens_alter().

<?php
function YOUR_CUSTOM_MODULE_tokens_alter(array &$replacements, array $context) {

  if (isset($replacements['facetapi_active:active-value'])) {
    switch ($replacements['[facetapi_active:active-value]']) {

      case 'Foo':
        $replacements['[facetapi_active:active-value]'] = 'Foo and Bar';
        break;
    }
  }
}
?>

Det var allt.

Länk till all kod

Vi hjälper dig nå resultat. Kontakta oss Ring direkt på 08-20 90 04.

Rädda Barnen tar sök på allvar

Lyssna på webinariet där Martin Svensson från Rädda Barnen berättar hur de jobbar med att göra sina digitala dokument sökbara.

Rädda barnen valde Drupal

När Rädda Barnen ville bygga om sitt resurscenter för alla tusentals dokument och rapporter föll valet på Wunderkraut.
MDN

Vi vill att vår sökfunktion ska fungera som Google

Vi får ofta höra av kunder att man vill att den interna sökfunktionen ska vara lika bra som Googles sökmotor. Det är faktisk…
MDN