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
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…)
Display Suite Search
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'] = '';
}
Tags
#Drupal #PHP