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

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

http://alastaira.wordpress.com/2011/01/07/customising-the-search-results-snippet-in-drupal-7

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

http://drupal.org/node/968308

<?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ájlokkkal…

Display Suite Search

https://drupal.org/project/ds
Pro:

  • Egyedi view módot használhatunk a találatok megjelenésére, így bármilyen mezőt megjeleníthetünk ill. elrejthetünk (metaadatok 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

https://drupal.org/project/custom_search
Pro:

  • Jó része a keresődoboz megjelenésével foglalkozik, de
  • szabályozható, hogy mely tartalomtípusokban legyen keresés és
  • letiltható a metaadatok 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('/

/', '', $paragraph); $paragraph = preg_replace('/' . $key . '/i', '$0', $paragraph); $access = TRUE; } } $return .= $access ? '

(…) ' . $paragraph . ' (…)

' : ''; } $variables['snippet'] = $return; $variables['info'] = ''; }
Megosztó személyiség vagy?

2 thoughts on “A Drupal 7 keresési eredmények oldalának formázása

  1. Tamás, nagyon jól bemutattad, mennyi lehetőség van Drupalban egy adott feladat megoldására, illetve azt, hogy mindig megtalálhatjuk a nekünk megfelelőt. Köszi! :)

  2. Létezik egy másik megoldás is, nevezetesen a jó öreg Views segítségével építhetünk sajátot.
    Konkrétabban, felfedett szűrőként kell használni a “Search: Search Terms”-t.

    Pro:
    – A Views formázható, ahogy szeretnénk.

    Contra:
    – Csak teljes kifejezésre működik, szótöredékre nem.
    – Mezőknek megfelelő találatot ad vissza, pl. címet, teljes tartalmat stb. Viszont nem a ténylegese részt kiemelve, ahol az adott kifejezés található.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöljük.