Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Einleitung
2 Installation
3 Frontend
4 Backend
5 Eine erste Webseite
6 Inhalte erstellen und verändern
7 Module, Mambots, Komponenten
8 Konfiguration von Joomla!
9 Eine Site aufbauen
10 Der Joomla!-Baukasten
11 Formulare: Facile Forms
12 Benutzer und Bereiche
13 Joomla! als Community-Treff
14 Forum: Simpleboard
15 Blog: WordPress
16 Wiki: MamboWiki
17 Noch mehr Kommunikation
18 Systemwartung
19 Weiterführende Themen
20 Eigene Erweiterungen schreiben
21 Mambots erstellen
22 Eine eigene Komponente
23 Troubleshooting
A Die Joomla!-API
B Glossar
C Inhalt der CD
Index
Index
Download: - ZIP, ca. 19,6 MB
Buch bestellen
Ihre Meinung?
<< zurück | Galileo Computing / <openbook> / Joomla! | vor >>
Joomla! von Anja Ebersbach, Markus Glaser, Radovan Kubani Das Handbuch für Einsteiger
Joomla! 496 S., mit CD, 29,90 Euro Galileo Computing ISBN 3-89842-632-7 |
| Kapitel 20 Eigene Erweiterungen schreiben
|  | 20.1 Hallo Joomla!
|  | 20.2 Die API nutzen
|  | 20.3 Parametrisieren
|  | 20.4 Auf die Datenbank zugreifen
|  | 20.5 Unterschiedliche Layouts mit Templates
## 20.4 Auf die Datenbank zugreifen Fast alle maßgeblichen Daten von Joomla! sind in der Datenbank kodiert. Aus diesem Grund ist es auch für die Erweiterungen essenziell, Zugriff auf die Datenbank zu haben. Das wird über das database-Objekt realisiert.
Hinweis: Beachten Sie, dass alle Tabellen im Folgenden ohne Präfix angegeben werden. Wenn Sie bei der Installation so ein Präfix eingestellt haben, müssen Sie das konsequenterweise auch hier vor die Tabellennamen stellen.
Bevor wir mit der Abfrage beginnen, sollten wir uns über die wichtigsten Tabellen der Datenbank klar werden.

Tabelle 20.4 Tabellen in der Datenbank

Tabelle | Beschreibung
categories | Daten und Einstellungen der Kategorien
components | Die installierten Komponenten
content | Inhalte und Daten der Inhaltselemente
core_acl_aro_groups | Die Usergruppen. Diese Tabelle haben Sie bereits in Abschnitt 12.6, Für Profis: Eigene Usergruppen und Berechtigungen, gesehen.
mambots | Die installierten Mambots
menu | Alle Menüpunkte aus allen Menüs
messages | Mitteilungen an die User
modules | Die installierten Module
sections | Daten und Einstellungen der Sektionen
users | Daten der registrierten User
Wie Sie sehen, hat man durch einen Datenbankzugriff sehr weit reichende Möglichkeiten, auf das System Einfluss zu nehmen. Um dieses Potenzial ausschöpfen zu können, sollten Sie also ruhig mal – beispielsweise mit phpMyAdmin – einen Blick auf die Tabellen werfen. Die Abfrage der Datenbank wird über die Sprache SQL durchgeführt. Um Daten aus der Datenbank zu holen, müssen wir zunächst die Abfrage vorbereiten und dann das Ergebnis in einer Variablen abholen. Nehmen wir an, wir wollen die Titel aller Content Items ausgeben, die der aktuelle Benutzer geschrieben hat. Dazu müssen wir die ID des Users kennen. Die ist, wie oben bereits erwähnt, in $my->userid enthalten. Das SQL-Statement dazu lautet so:
    SELECT title FROM content WHERE created_by = ID
Aus der Tabelle content werden alle Einträge der Spalte title ausgegeben, bei denen der zugehörige Wert der Spalte created_by mit der ID übereinstimmt. Wir wollen denjenigen Eintrag zuerst sehen, der als Letztes bearbeitet wurde. Diese Information findet sich in der Spalte modified. Daher ist an das SQL-Statement noch ein
    ORDER BY modified DESC
anzuhängen. Viele Betreiber einer Joomla!-Seite verwenden ein Präfix für alle Tabellen der Datenbank, um nicht mit anderen Systemen und Installationen in Konflikt zu geraten. Da Sie nicht wissen können, welches Präfix verwendet wird, wenn ein User Ihr Modul installiert, gibt es hierfür in Joomla! eine Abkürzung. Verwenden Sie #__ vor der Tabelle, also beispielsweise
    SELECT * FROM #__content
Joomla! setzt dann automatisch das richtige Präfix ein. Damit ergibt sich die Abfrage in PHP, die wir einfach an das Ende der Datei joomla/modules/mod_ usercontent_1.php anfügen:
    21  $id = $my->id;
    22  $query = "SELECT * FROM #__content
    23                     WHERE created_by = $id
    24                     ORDER BY modified DESC";
    25  $database->setQuery($query);
    26  if ( !$database->query() ) {
    27     echo "<script type='text/javascript'>
    28              alert('".$database->getErrorMsg()."');
    29           </script>";
    30  } else {
    31     $rows = $database->loadObjectList();
    32  }
Listing 20.7 Auschnitt aus mod_usercontent.php Dieses Statement wird zunächst mit der Methode setQuery in das Datenbank-Objekt geladen (Zeile 25) und dann in Zeile 26 über query ausgeführt. Der Block von Zeile 27 bis 29 behandelt den Fehlerfall, z. B. wenn das SQL-Statement nicht korrekt ist. In diesem Fall wird die Fehlermeldung, die MySQL generiert, über die Methode getErrorMsg mittels eines JavaScripts als Hinweis-Fenster ausgegeben. In Zeile 31 wird das Ergebnis der erfolgreichen Abfrage in eine Variable $rows gelesen, die wir dann weiterverarbeiten können. Die Ergebnisliste ist ein Array, das für jeden Datenbankeintrag ein Objekt mit den Spalten als Eigenschaften enthält. Der Zugriff erfolgt also nach dem Schema, das Sie in der folgenden Skizze sehen können:
| SpalteA | SpalteB | SpalteC
0 | $rows[0]->SpalteA | $rows[0]->SpalteB | $rows[0]->SpalteC
1 | $rows[1]->SpalteA | $rows[1]->SpalteB | $rows[1]->SpalteC
2 | $rows[2]->SpalteA | $rows[2]->SpalteB | $rows[2]->SpalteC
Nachdem wir nicht genau wissen, wie viele Einträge die Abfrage bringt, verwenden wir im Folgenden die foreach-Schleife, die jede Zeile aus $rows nimmt und innerhalb der geschweiften Klammern als $row verfügbar macht. Die eigentliche Ausgabe des Titels erfolgt in Zeile 35:
    33  foreach ($rows as $row)
    34  {
    35      echo $row->title.'<br />';
    36  }
Listing 20.8 Ausschnitt aus mod_usercontent_1.php Das Ziel unseres kleinen Moduls ist, dass ein Benutzer einen schnellen Zugriff auf seine – auch unveröffentlichten – Beiträge hat und diese per Link bearbeiten kann. Dazu ist in der Schleife etwas mehr Arbeit nötig. Pro Eintrag muss ein Link in den Bearbeitungsmodus generiert werden. Außerdem sollte der User sehen, ob es sich um einen bereits publizierten Artikel handelt. Schematisch sieht jede Zeile also so aus:
    <Bearbeiten-Link><Bearbeiten-Bild /><Bearbeiten-Link>
    <Ansicht-Link><Published-Bild/>Titel</Ansicht-Link>
Sehen wir uns den Code einmal an:
    33  foreach ($rows as $row)
    34  {
    35  # --- Link in den Bearbeitungsmodus
    36      $link = 'index.php?option=com_content&amp;'
    37             .'task=edit&amp;id='. $row->id;
    38      echo "&nbsp;<a href='".$link."'>";
    39      echo "<img src='images/M_images/edit.png'
    40                 height='12' border='0'>";
    41      echo "</a>";
    42  # --- Link zur normalen Ansicht
    43      $link = sefRelToAbs(
    44                'index.php?option=com_content&amp;'
    45                .'task=edit&amp;id='. $row->id );
    46      echo "&nbsp;<a href='".$link."'>";
    47  # --- Anzeige, ob publiziert
    48      echo "<img src='";
    49      if ($row->state)
    50         echo "administrator/images/publish_g.png";
    51      else
    52         echo "administrator/images/publish_x.png";
    53      echo "' border='0'>&nbsp;";
    54  # --- Ausgabe des Titels
    55      echo $row->title.'</a><br />';
    56  }
Listing 20.9 Ausschnitt aus mod_usercontent_2.php Wie im Skript zuvor wird der Code in einer foreach-Schleife ausgeführt, um auch alle Einträge ausgeben zu können. In den Zeilen 36–37 wird der Link zur Bearbeitungsseite des Inthaltselements generiert. Die Content-Komponente (option=com_content) wird im Bearbeitungsmodus (task=edit) und der aktuellen Seiten-ID verlinkt. Die ID wird dabei aus der Datenbank entnommen ($row–>id). In den Zeilen 38–41 wird der Link mit dem üblichen Icon für die Bearbeitung ausgegeben. Danach folgt der Link zur normalen Ansicht (task=view), der den Rest der Ausgabe umspannt. In Zeile 43 wird der Befehl sefRelToAbs verwendet. Dieser bewirkt, dass die URL, die als Parameter angegeben wird, gegebenenfalls in eine suchmaschinenfreundliche URL umgewandelt wird. In den Zeilen 48–53 legen wir anhand des Publikationsstatus ($row->state) fest, welches Icon diesbezüglich ausgegeben werden soll. Zeile 55 gibt den Titel aus und beendet den Ansichtslink. Achten Sie darauf, dass hier im Vergleich zum vorherigen Skript ein </a> dazugekommen ist. Hat alles geklappt, dann sollte unser Modul jetzt in etwa so aussehen wie in Abbildung 20.4.
Hier klicken, um das Bild zu vergrößern Abbildung 20.4 Das Benutzer-Modul
Nun wollen wir das Modul noch dahingehend ausbauen, dass der Benutzer seine eigenen Beiträge auch selbst freischalten kann. Dies soll über einen Klick auf das entsprechende Icon geschehen. Das bestehende Skript muss also in zweierlei Hinsicht ergänzt werden: Zum einen müssen wir die gewünschte Aktion ausführen, und zum anderen brauchen wir einen Link mit eigenen Parametern, der über das Icon aufgerufen wird, das den Publikationsstatus anzeigt. Die Kommunikation zwischen User und Modul erfolgt über die URL. Daher benötigen wir zwei neue Parameter. Einen (h_act), der festlegt, ob ein Artikel gezeigt oder versteckt werden soll, und einen zweiten (h_pid), der die ID des Artikels enthält. Der SQL-Befehl, der den Publikationsstatus ändert, sieht folgendermaßen aus: UPDATE content SET state = 1 WHERE id = ID Sehen wir uns den ersten Teil der Veränderungen einmal an. Diese werden am Anfang des Skripts vorgenommen, damit mögliche Änderungen auch gleich im Modul ausgegeben werden.
    1   <?php
    2   defined( '_VALID_MOS' ) or die( 'Direct Access to this
    3      location is not allowed.' );
    4   # --- Parameter entgegen nehmen
    5   if ($act = mosGetParam($_GET, 'h_act'))
    6   {
    7      $pubid = mosGetParam($_GET, 'h_pid');
    8   # --- SQL-Statement erstellen
    9      $sql = "UPDATE #__content SET state=";
    10     if ($act == "pub")
    11        $sql .= '1';
    12     else
    13        $sql .= '0';
    14     $sql .= " WHERE Id = ".$pubid;
    16  # --- Datenbankabfrage ausführen
    17     $database->setQuery($sql);
    18     if ( !$database->query() ) {
    19        echo "<script type='text/javascript'>
    20                 alert('".$database->getErrorMsg()."');
    21              </script>";
    22     }
    23  }
Listing 20.10 Auschnitt aus mod_usercontent_3.php Ist eine Anfrage angekommen (Zeile 5), so werden die beiden URL-Parameter in lokale Variablen übernommen (Zeilen 5, 7). In Abhängigkeit von der gewünschten Aktion wird in den Zeilen 9–14 das SQL-Statement generiert, das in Zeile 17 in das Database-Objekt geladen und in Zeile 18 ausgeführt wird. Falls etwas schief geht, wird in den Zeilen 19–21 eine Fehlermeldung ausgegeben. Jetzt müssen wir die Ausgabe noch so modifizieren, dass die Icons, die den Publikationsstatus anzeigen, mit den richtigen Links unterlegt werden. Wir befinden uns hier wieder in der Schleife, die die einzelnen Datensätze ausgibt.
    52  # --- URL von alten Parametern säubern
    53  $uri = preg_replace('/(&h_act=.[^&]*)|(&h_pid=.[^&]*)/',
    54                      '', $_SERVER['REQUEST_URI']);
    55  foreach ($rows as $row)
    56  {
    ... # --- Link in den Bearbeitungsmodus
    64  # --- Publizier-Link zusammenbauen
    65     echo '<a href="'.$uri.'&h_act=';
    66     if ($row->state)
    67        echo "unpub";
    68     else
    69        echo "pub";
    70     echo '&h_pid='.$row->id.'">';
    71  # --- Anzeige, ob publiziert
    72     echo "<img src='";
    73     if ($row->state)
    74        echo "administrator/images/publish_g.png";
    75     else
    76        echo "administrator/images/publish_x.png";
    77     echo "' border='0'></a>&nbsp;";
    78  # --- Ausgabe des Titels
    79     $link = sefRelToAbs(
    80               .'index.php?option=com_content&amp;'
    81               .'task=edit&amp;id='.$row->id );
    82     echo "&nbsp;<a href='".$link."'>";
    83     echo $row->title.'</a><br />';
    84  }
    85  ?>
Listing 20.11 Ausschnitt aus mod_usercontent_3.php In den Zeilen 53 und 54 wird mit Hilfe eines regulären Ausdrucks die alte URI, die in der Variable $_SERVER['REQUEST_URI'] zu finden ist, von den Parametern bereinigt, die bisher durch unser Modul erzeugt wurden. Das ist nötig, da sich ansonsten bei wiederholtem Gebrauch der Funktion ganze Kaskaden von h_act und h_pid in der URL finden würden. Daraufhin wird der Link in Abhängigkeit vom Publikationsstatus zusammengesetzt (Zeilen 65–70) und das Icon ausgegeben (Zeilen 72–77). Den Rest ab Zeile 79 kennen Sie schon. Damit haben wir die Funktionalität unseres Moduls fertig gestellt.
<< zurück | <top> | vor >>
Zum Katalog
Joomla! bestellen
Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen? Ihre Meinung
Buchtipps
| NEU: Joomla! 1.5 - für Einsteiger
| Einstieg in Joomla! - Das Video-Training
| CSS-Layouts
| Webseiten erstellen für Einsteiger
| Suchmaschinen-Optimierung für Webentwickler
| Professionelles Webdesign mit (X)HTML und CSS
| Einstieg in osCommerce/xt:Commerce
Shopping
Versandkostenfrei bestellen in Deutschland und Österreich Info

Copyright © Galileo Press 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

[Galileo Computing]
Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de