-
Notifications
You must be signed in to change notification settings - Fork 6
Konnektoren_ _Schnittstellen_fuer_andere_Anwendungen_schaffen
Wenn Ihre Anwendung Schnittstellen für andere Applikationen in papaya CMS anbieten soll, können Sie dazu eigene Konnektoren benutzen. Für die Beispielanwendung "Stickers" wird im folgenden vorgestellt, wie eine solche Schnittstelle aussehen kann, über die andere Anwendungen eine Übersicht der Sammlungen oder eine Anzahl Sticker abfragen können, ohne die interne Struktur der Stickers-Anwendung zu kennen.
Um eine Konnektorklasse zu erstellen, gehen Sie wie folgt vor:
-
Erstellen Sie eine Klasse
connector_stickers
, die vonbase_plugin
abgeleitet ist. Eine Konnektorklasse sollte immer den Namenspräfixconnector
haben: Konnektorklasse erstellenrequire_once(PAPAYA_INCLUDE_PATH.'base_plugin.php'); class connector_stickers extends base_plugin { }
-
Erstellen Sie den Konstruktor der Konnektorklasse. Im Konstruktor sollte die Basisklasse mit den Datenbankmethoden eingebunden und als Attribut
$this->stickersObj
instanziiert werden: Konstruktoren der Konnektorklassefunction __construct() { parent::__construct(); include_once(dirname(__FILE__).'/base_stickers.php'); $this->stickersObj = &new base_stickers; }
-
Erstellen Sie alle Schnittstellen-Methoden in der Klasse, die sie zur Verfügung stellen wollen. Im folgenden Beispiel sind das die Methoden
getCollections()
,getStickersByCollection()
undgetRandomSticker()
, die die entsprechenden Methoden auf dem Basisobjekt ausführen: Schnittstellenmethoden implementierenfunction getCollections() { return $this->stickersObj->getCollections(); } function getStickersByCollection($collectionId, $limit, $offset) { return $this->stickersObj->getStickersByCollection($collectionId, $limit, $offset); } function getRandomSticker($collectionId) { return $this->stickersObj->getRandomSticker($collectionId); }
-
Speichern Sie die Datei ab. Denken Sie daran, dass sich die Namenskonvention auch auf den Dateinamen auswirkt, sodass der Dateiname ebenso wie die Klasse mit dem Präfix
connector_
beginnen sollte. -
Registrieren Sie die Klasse als Konnektor in der
modules.xml
. Näheres dazu erfahren Sie in modules.xml erstellen.
Basisklasse anpassen
Manchmal ist es notwendig, die Basisklasse zu erweitern, weil der Konnektor zusätzliche Funktionen zur Verfügung stellen soll. Um die Anzahl der Sticker in einer Sammlung beispielsweise für eine seitenweise Darstellung zu ermitteln, können Sie die Basisklasse um entsprechende Funktionen erweitern. Dazu gehen Sie wie folgt vor:
-
Erweitern Sie die Methode
base_stickers::getStickersByCollection()
um das AttributabsCount
, in das die komplette Anzahl aller Sticker gespeichert wird. Die Methodeconnector_stickers::getStickersByCollection()
muss also entsprechend erweitert werden: Schnittstellenmethode getStickersByCollection() um Zähler erweiternfunction getStickersByCollection($collectionId, $limit, $offset) { if ($stickers = $this->stickersObj->getStickersByCollection($collectionId, $limit, $offset)) { $this->_stickersCount[$collectionId] = $this->stickersObj->absCount; return $stickers } else { $this->_stickersCount[$collectionId] = 0; } }
Wenn die Abfrage erfolgreich war, wird die Anzahl der ausgelesenen Sticker im Attribut
$_stickersCount
gespeichert. Falls die Abfrage fehlschlägt, wird der Wert des Attributs auf 0 gesetzt (die Sammlung ist leer). -
Erweitern Sie die Klasse
connector_stickers
um die MethodegetNumberOfStickersInCollection()
: Schnittstellenmethode getNumberOfStickersInCollection() implementierenfunction getNumberOfStickersInCollection($collectionId) { if (!isset($this->_stickersCount[$collectionId])) { $this->_stickersCount[$collectionId] = $this->getStickersCount($collectionId); } if (isset($this->_stickersCount[$collectionId])) { return $this->_stickersCount[$collectionId]; } return FALSE; }
Wurden bereits Sticker aus der Sammlung mit
getStickersByCollection()
abgefragt, ist die Anzahl der Sticker im Attribut$_stickersCount
abgelegt. Andernfalls ermitteln Sie die Anzahl, indem Sie die Methodebase_stickers::getStickersCount()
aufrufen. -
Erweitern Sie die Klasse
base_stickers
um die Methodebase_stickers::getStickersCount()
: base_stickers um Methode getStickersCount() erweiternfunction getStickersCount($collectionId) { $sql = "SELECT COUNT(*) AS count FROM %s WHERE collection_id = %d "; $params = array($this->tableSticker, $collectionId); if ($res = $this->databaseQueryFmt($sql, $params)) { return $res->fetchField(); } return FALSE; }
Die Methode fragt die Anzahl der Datensätze in der Tabelle
papaya_stickers
ab, derencollection_id
der angegebenen$collectionId
entspricht. Die Abfrage liefert nur einen Datensatz und nur ein Feld. Sie können daher die Auswertung der Abfrage vereinfachen, indem Sie stattbase_db::fetchRow()
und der Rückgabe des Feldwertes mit$row['count']
die Methodebase_db::fetchField()
verwenden. -
Passen Sie in der Konnektorklasse connector_stickers die Methode getRandomSticker() an. Erweitern Sie die Methoden dazu um den optionalen Parameter
$limit
: Konnektormethode getRandomSticker() anpassenfunction getRandomSticker($collectionId, $limit = 1) { return $this->stickersObj->getRandomSticker($collectionId, $limit); }
-
Erweitern Sie die Methode
base_stickers::getRandomSticker()
um den Parameter$limit
und passen Sie die Abfrage an: Methode getRandomSticker() in base_stickers anpassenfunction getRandomSticker($collectionId, $limit = 1) { $result = FALSE; $randomOrder = $this->databaseGetSQLSource('RANDOM'); $sql = "SELECT s.sticker_id, s.collection_id, s.sticker_text, s.sticker_image, s.sticker_date, s.sticker_author, s.sticker_source, s.sticker_source_url, s.sticker_explanation FROM %s AS s WHERE s.collection_id = %d ORDER BY $randomOrder "; $params = array($this->tableSticker, $collectionId); if ($res = $this->databaseQueryFmt($sql, $params, (int)$limit)) { return $res->fetchRow(DB_FETCHMODE_ASSOC); } return $result; }
Die Änderungen beschränken sich auf den Parameter
$limit
mit dem Defaultwert 1. Damit wird die Funktionsweise der Methode zur vorhergehenden Version nicht verändert. Zusätzlich wird die Variable$limit
in der Datenbankfunktionbase_db::databaseQueryFmt()
als dritter Parameter eingesetzt. Da die Auswahl zufällig ist, ist die Angabe des Offsets als vierter Parameter nicht sinnvoll anwendbar. -
Speichern Sie Ihre Änderungen ab.