Ez is egy olyan bejegyzés, amit leginkább magamnak írok. Nem egy bejegyzést írtam már, amit újra meg újra visszakeresek, hogy kimásoljam a benne lévő kódrészletet. Bár a logfájlok alapján, úgy tűnik másokat is érdekelnek ezek a bejegyzések.
Szóval, többször előfordult már, hogy a Drupal kereső funkciójának az adatait integrálni akartam egy saját megoldásba, és mindig elég nehezen sikerült megtalálni a jó megoldást, ezért most leírom egyet, ami nekem bevált.
Mikor is van erre szükség? Legutóbb egy meglehetősen összetette kereső funkciót kellett kivitelezni, aminek a kulcsszavas kereső funkció csak egy kis része volt. Máskor pedig a hírekhez rendelt címkéket használtam kereső kifejezésnek, így implementáltam hasonló tartalom ajánló funkciót a oldalra, mert a meglévő megoldások nem váltak be.
Ezeknek az eseteknek közös eleme, hogy a Drupal keresővel egy keresést kell végeztetni, de az eredményeket nem megjeleníteni kell, ehelyett további feldolgozás vár az adatokra.
Az első ötlet, hogy közvetlenül a search_* adatbázis táblákon végzünk keresést. Bár ez is egy lehetőség, meglehetősen összetettek ezek a táblák, nem arra vannak kitalálva, hogy egyetlen SELECT utasítással hozzájussunk az eredményhez. Ennél sokkal egyszerűbben, egyetlen függvény hívással is el lehet intézni a dolgot.
Drupal 6-ban:
<?php
$talalatok = node_search('search', 'kereső kifejezés');
?>
Drupal 7-ben:
<?php
$talalatok = node_search_execute('kereső kifejezés');
?>
A Drupal a node-okon kívül a felhasználókban és potenciálisan még ezer másik dologban is tud keresni, de nekünk most elég lesz a node-okban keresni. Általában úgyis ez érdekel minket. Ráadásul ha más objektumban akarunk keresni, akkor elég a node_search helyett pl. a user_search függvényt használni.
De nézzük egy kicsit tovább a dolgot, mi van ha csak egy node típust várunk eredményként? Ezt az információt a kereséséi kifejezéshez kell hozzáadni, így:
Drupal 6-ban:
<?php
$talalatok = node_search('search', 'kereső kifejezés type:nodetipus');
?>
Drupal 7-ben:
<?php
$talalatok = node_search_execute('kereső kifejezés type:nodetipus');
?>
A Drupal mag összetett keresője több más szűrő paramétert is ismer, nem csak a típust. Ezek használatát a legegyszerűbben úgy deríthetjük ki, ha a /search oldalon használjuk az összetett keresőt és megnézzük, hogy mi kerül a keresési kifejezés mezőbe.
Ahhoz hogy, a fenti megoldás működjön természetesen szükséges az, hogy a Drupal mag kereső modulja be legyen kapcsolva és a tartalmakat folyamatosan indexelje, azaz hogy az ütemezett feladatok (cron) be legyen állítva.