A Drupal 7 keresési eredmények oldalának formázása

2013. Dec. 9. · 2 min read

A feladat

  • A Drupal kereső által adott találati listában ne csak “x” karakternyi szöveg jelenjen meg a keresett kifejezés előtt és után, hanem a teljes bekezdés, amiben az adott találat szerepel.
  • A találati listában a dátum és a szerző ne jelenjen meg, és csak meghatározott tartalomtípus(ok) címében és szövegében legyen keresés.
  • Nézzük meg azt is, hogy az egy oldalon megjelenő találatok számát meg lehet-e egyszerűen emelni 10-ről mondjuk 25-re.

Lehetőségek

A találati lista egyes elemeinek megjelenését a seach-result.tpl.php és azon belül a $snippet szabályozza. Azt nem tudom mi szabályozza, hogy hány darab keresett kifejezés jelenik meg a $snippet-ben. (Alapbeállítás szerint úgy látom, hogy kettő.) Ellenben a találat megjelenített karakterszáma (elvileg) szabályozható template.php-ban és tpl.php-ban is.

template.php

function mytheme_preprocess_search_result(&$variables) {
  $result = $variables['result'];
  $variables['snippet'] = drupal_substr($result['node']->body['und'][0]['value'], 0, 160);
}

Problémák:

  • Ez a kód felülírja a teljes találati megjelenést, így pl. a keresett szavak kiemelése nem működik, mert eltűnik a html tag a keresett kifejezés körül
  • a beállítás nem a keresett kifejezéshez viszonyítva határozza meg a megjelenített karakterszámot, hanem a node első karakteréhez képest

search-result.tpl.php

<?php print $snippet ?>

helyett ez a forma kell:

<?php print substr($snippet, 0, 300); ?>

Probléma:

  • nekem egyszerűen nem működött (bár lehet, hogy valamit rosszul csináltam a tpl.php fájlokkal…)

Pro:

  • Egyedi „view-mode”-ot használhatunk a találatok megjelenésére, így bármilyen mezőt megjeleníthetünk ill. elrejthetünk (meta adatok is kezelhetőek) a találati oldalon.
  • Szabályozható, hogy egy oldalon hány találat jelenjen meg. Pl. beállíthatjuk azt is, hogy egyszerre csak egy node jelenjen meg, de az teljes tartalmával, összes mezőjével (l. az előző pontot) és az alján ott a lapozó. (Mondjuk ez sok találat esetén nem túl kényelmes…)
  • Ki tudjuk íratni, hogy összesen hány találat van és azt is, hogy mi volt a kereső-kifejezés
  • Entitás típusonként (page, article) stb. csoportosíthatóak a találatok, viszont…

Con:

  • …nem lehet beállítani, hogy csak meghatározott típusokban keressen (igaz, erre van külön modul – Search Restrict – de nem próbáltam)
  • A search $snippet működése nem szabályozható

Custom Search modul

Pro:

  • Jó része a keresődoboz megjelenésével foglalkozik, de
  • szabályozható, hogy mely tartalomtípusokban legyen keresés és
  • letiltható a meta adatok megjelenítése

Con:

  • Nem lehet beállítani, hány találat legyen egy oldalon
  • A search $snippet működése nem szabályozható

A megoldás

A megoldást végül Varga Tomi kollégám szállította egy egyedi preprocess kód formájában (vagyis ennek a template.php-ban a helye):

function MYTHEME_theme_preprocess_search_result(&$variables) {
  $node = $variables['result']['node'];
  $node_body = $node->body['und'][0]['safe_value'];
  $keys = explode(' ', arg(2));
  $node_paragraphes = explode("", $node_body);

  $return = '';
  foreach($node_paragraphes as $paragraph){
    $access = FALSE;
    foreach($keys as $key){
      if(strpos(strtolower($paragraph), strtolower($key))) {
        $paragraph = preg_replace('/<p>/', '', $paragraph);
        $paragraph = preg_replace('/' . $key . '/i', '<strong>$0</strong>', $paragraph);
        $access = TRUE;
      }
    }
    $return .= $access ? '</p><p class="search-snippet">(…) ' . $paragraph . ' (…)</p>' : '';
  }

  $variables['snippet'] = $return;
  $variables['info'] = '';
}