41.4 Plug-ins für die Suche 

Wenn Sie im Suchfeld des Search-Moduls etwas eingeben, wird das Ereignis onSearch ausgelöst. Die Anfrage wird der Reihe nach an die Such-Plug-ins weitergeleitet, die für ihren Bereich jeweils eine SQL-Anfrage an die Datenbank richten und das Ergebnis dann mit standardisierten Spaltenbezeichnern zurückliefern. Der Vorteil dieses Mechanismus liegt auf der Hand. Wenn Sie als Entwickler eigene Daten in Joomla! verwalten, beispielsweise über eine Komponente, dann können Sie diese auch sehr einfach durchsuchbar machen. Wir wollen uns eine Suche schreiben, die nur in den Titeln der Artikel sucht.
Das zugehörige XML-File, wieder auf das Nötigste reduziert, sieht dann so aus:
1 <?xml version="1.0" encoding="utf-8"?> 2 <install type="plugin" group="search" 3 version="1.5"> 4 <name>Title Searchbot</name> 5 <files> 6 <filename plugin="titlesrch">titlesrch.php</filename> 9 </files> 10 <params /> 11 </install>
Listing 41.7 titlesrch.xml
Sie sehen, dass als Gruppe search angegeben wurde. Unser Suchroboter hat der Einfachheit halber nur eine Datei und keine Parameter. Die PHP-Datei ist eigentlich ebenfalls sehr leicht zu verstehen, schwierig daran ist nur das SQL-Statement. Für die Weiterverarbeitung des Suchergebnisses müssen die Spalten aus Tabelle 41.2 angegeben werden.
Spalte | Beschreibung |
title |
Der Titel des Suchergebnisses |
created |
Das Erstellungsdatum |
text |
Ein Text, der den Inhalt beschreibt |
section |
Ein Bereich, zu dem der Inhalt gehört |
href |
Eine URL, über die der Inhalt verlinkt werden kann |
browsernav |
Die Art und Weise, wie der Inhalt geöffnet werden soll. Wird standardmäßig auf 2 gestellt. |
Sie müssen nicht alle Spalten ausgeben. Wir werden der Übersichtlichkeit halber die Angabe des Bereiches weglassen. Sehen wir uns die PHP-Datei einmal an:
1 <?php 2 defined( '_JEXEC' ) or die( 'Restricted access' ); 3 jimport( 'joomla.plugin.plugin' ); 4 class plgSearchTitlesrch extends JPlugin { 5 function plgSearchTitlesrch( &$subject, $config) { 6 parent::__construct($subject, $config); 7 } 8 function onSearchAreas() { 9 static $areas = array( 10 'titlesrc' => 'Titel' 11 ); 12 return $areas; 13 } 14 function onSearch($text, $phr='', $order='', $areas=null) { 15 $db =& JFactory::getDBO(); 16 $text = trim( $text ); 17 if ($text == '') { return array(); } 18 $query = "SELECT con.title AS title," 19 ." con.created AS created," 20 ." con.introtext AS text," 21 ." CONCAT( 'index.php?option=com_content" 22 ."&view=article&id=', con.id ) AS href," 23 ." '2' AS browsernav" 24 ." FROM #__content AS con" 25 ." WHERE con.title LIKE '%$text%'" 26 ." ORDER BY con.title"; 27 $db->setQuery( $query ); 28 return $db->loadObjectList(); 29 } 30 ?>
Listing 41.8 titlesrch.php
Die einleitenden Zeilen des Skripts dürften mittlerweile kein Problem mehr sein. In Zeile 8–13 wird eine Funktion definiert, die einen neuen Suchraum aufmacht. Wenn Sie im Frontend suchen, wir Ihnen dieser als Checkbox angeboten. Der Schlüssel des Arrays entspricht dem Such-Plug-in, der Wert wird als Beschriftung ausgegeben.
Ab Zeile 14 wird die eigentliche Suche definiert. Der Event liefert vier Parameter, die wir – bis auf den Suchtext selbst – im folgenden Code nicht weiter berücksichtigen. Im Argument $phr wird festgelegt, ob der Suchtext genau gefunden werden muss (exact), ob alle Suchwörter vorkommen müssen (all) oder ob es reicht, dass nur einer der Suchterme gefunden wird (any). Die Variable $order bestimmt die Sortierung: alphabetisch (alpha), der älteste Eintrag zuerst (oldest), der neueste Eintrag zuerst (newest) oder der beliebteste Eintrag zuerst (popular). In $areas stehen die Suchräume, die ausgewählt wurden. Anhand dessen können Sie überprüfen, ob Ihr Plug-in überhaupt mit der Suche beginnen soll.
Zunächst wird der Suchstring bereinigt, indem führende und folgende Leerzeichen entfernt werden (Zeile 16). Zeile 17 ist eine Sicherheitsabfrage, falls kein Suchwort eingegeben wurde. Als Nächstes wird das SQL-Statement erstellt (Zeilen 18–26); dazu folgt gleich mehr. Die Punkte am Anfang jeder Zeile in diesem Abschnitt sind eine PHP-Notation, die es erlaubt, längere Zeichenketten über mehrere Zeilen zu verteilen. Die Abfrage wird in Zeile 27 ausgeführt, und in der folgenden Zeile wird das Ergebnis als Objekt zurückgeliefert.
Lassen Sie sich von der Datenbankabfrage nicht einschüchtern, sie sieht wilder aus, als sie ist. Beginnen wir in Zeile 24. Hier wird festgelegt, dass die Tabelle, die zu durchsuchen ist, content sein soll. Wir verwenden für die Tabelle in der weiteren Abfrage die Abkürzung con. Diese ist wichtig, um die Spalten zu referenzieren. In Zeile 25 wird das Suchkriterium formuliert. Das Wort der Suchabfrage, das in $text gespeichert ist, soll irgendwo im Titel vorkommen. Zeile 26 legt die Sortierung fest. Sortiert wird alphabetisch aufsteigend nach dem Titel. Die Zeilen 18–23 bestimmen, welche Spalten des Ergebnisses zurückgegeben werden und, nach AS, unter welchem Namen. Also soll der Titel aus content als title zurückgegeben werden (Zeile 18), created einfach als created (Zeile 19) und introtext als text (Zeile 20). Der Link unter dem Namen href wird aus einer Zeichenkette und der id mit dem SQL-Befehl CONCAT zusammengesetzt (Zeilen 21 und 22). Für die Spalte browsernav legen wir einfach den Wert 2 fest (Zeile 23). Wie man beispielsweise an text oder href sieht, erlaubt uns dieser Mechanismus, Daten aus der Datenbank umzubenennen und somit in der Suchausgabe an die richtige Stelle zu bringen.
Um unsere Suche zu testen, müssen Sie das Plug-in jetzt installieren. Damit Sie auch sicher gehen können, dass die Treffer von Ihrem Plug-in kommen, sollten Sie die anderen Suchbots im Plug-in-Manager deaktivieren. Gehen Sie dann ins Frontend, und geben Sie einen Begriff ins Suchfeld ein, von dem Sie wissen, dass er in mindestens einem Titel vorkommt. Dann sollten Sie ein Ergebnis sehen.