21.3 Mambots 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-Mambots 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="iso-8859–1"?>
2 <mosinstall type="mambot" group="search"
3 version="1.1">
4 <name>Title Searchbot</name>
5 <files>
6 <filename mambot="title.searchbot">ð
7 title.searchbot.phpð
8 </filename>
9 </files>
10 <params />
11 </mosinstall>
Listing 21.6 title.searchbot.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 21.2 angegeben werden.
Tabelle 21.2 Mögliche Spalten bei der Rückgabe von Suchergebnissen
| 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( '_VALID_MOS' ) or die( 'Direct Access to this
3 script is not allowed');
4 $_MAMBOTS->registerFunction( 'onSearch',
5 'botSearchTitles' );
6 function botSearchTitles( $text )
7 {
8 global $database;
9 $text = trim( $text );
10 if ($text == '') { return array(); }
11 $query = "SELECT con.title AS title,"
12 ." con.created AS created,"
13 ." con.introtext AS text,"
14 ." CONCAT( 'index.php?option=com_content"
15 ."&task=view&id=', con.id ) AS href,"
16 ." '2' AS browsernav"
17 ." FROM #__content AS con"
18 ." WHERE con.title LIKE '%$text%'"
19 ." ORDER BY con.title";
20 $database->setQuery( $query );
21 return $database->loadObjectList();
22 }
23 ?>
Listing 21.7 title.searchbot.php
Die einleitenden Zeilen des Skripts dürften mittlerweile kein Problem mehr sein. In Zeile 9 wird der Suchstring bereinigt, indem führende und folgende Leerzeichen entfernt werden. Zeile 10 ist eine Sicherheitsabfrage, falls kein Suchwort eingegeben wurde. Als Nächstes wird das SQL-Statement erstellt (Zeilen 11–19); dazu 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 20 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 17. 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 18 wird das Suchkriterium formuliert. Das Wort der Suchabfrage, das in $text gespeichert ist, soll irgendwo im Titel vorkommen. Zeile 19 legt die Sortierung fest. Sortiert wird alphabetisch aufsteigend nach dem Titel. Die Zeilen 11–16 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 11), created einfach als created (Zeile 12) und introtext als text (Zeile 13). Der Link unter dem Namen href wird aus einer Zeichenkette und der id mit dem SQL-Befehl CONCAT zusammengesetzt (Zeilen 14 und 15). Für die Spalte browsernav legen wir einfach den Wert 2 fest (Zeile 16). Wie man beispielsweise an text oder href sieht, erlaubt es 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 den Mambot jetzt installieren. Damit Sie auch sicher gehen können, dass die Treffer von Ihrem Mambot kommen, sollten Sie die anderen Suchbots im Mambot 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.
|