• ABOUT THIS SITE
  • MY CV
  • MY SOCIAL STREAM
  • CONTACT
  • SEARCH

olav.net

  • content
  • technology
  • life
  • bonn
Home › Integration von Drupal mit einer bestehenden Site

Die Integration von Inhalten programmieren

olav — Fri, 10/31/2008 - 14:31

Als erstes wollen wir Ihnen einen Ansatz zeigen, mit dem Sie Artikelbestände im SixCMS und in Drupal synchronisieren können. Die erforderlichen Schritte sind zwar spezifisch für das gewählte Fremdsystem, lassen sich aber analog auch auf andere Systeme übertragen, falls diese über einen Mechanismus verfügen, eigenen Code an bestimmten Punkten im Lebenszyklus eines Content-Objektes auszuführen.

Wir gehen davon aus, dass das SixCMS als Redaktionssystem für Artikel dient. Wir wollen erreichen, dass mit jedem neuen Content-Objekt im SixCMS eine Story in Drupal angelegt wird. Änderungen an einem Content-Objekt im SixCMS sollen ebensolche Änderungen an der Story in Drupal auslösen. Wir schaffen die Verbindung zwischen den beiden Objekten, indem wir in SixCMS die Node-ID der Story in einem eigens definierten Feld des Content-Objektes ablegen. Diese ID wird beim Neuanlegen des Objektes eingetragen und dient bei Änderungen des SixCMS-Objektes dazu, die Änderungen in Drupal nachzuziehen.

Haben wir erst einmal eine Drupal-Node zu einem Content-Objekt, können wir über diese Node Drupal-Funktionalitäten mit dem Objekt im SixCMS verbinden. Wir wollen hier als Beispiel das Anhängen von Kommentaren vorführen. Artikel werden über das SixCMS angezeigt, Kommentare dazu werden über ein eingebundenes Drupal angelegt und in einem SixCMS-Template angezeigt.

Für die Implementierung der Verbindung zwischen SixCMS und Drupal bedienen wir uns der Event-Trigger auf Seite des SixCMS und des Blog-APIs auf Drupal-Seite. Ein Event-Trigger ruft vor oder nach bestimmten Aktionen im Lebenszyklus eines Content-Ojektes eines PHP-Funktion auf. In dieser Funktion haben wir Zugriff auf das Content-Objekt vor und nach der Änderung. Die Blog-Programmierschnittstelle haben wir in unserem Drupalbuch im Abschnitt Mit anderen Blog-Editoren arbeiten vorgestellt, dort als Schnittstelle zwischen Drupal und Desktop-Editoren. Durch Verwendung dieser XMLRPC-basierenden Programmierschnittstelle gehen wir Problemen bei der Integration der beiden Content Management Systeme aus dem Weg. Dieser Ansatz wird auch in schwierigen Fällen funktionieren, etwa wenn die Session-Verwaltung des fremden CMS und die von Drupal nicht kompatibel zueinander sind.

Als ersten Schritt legen wir im Unterverzeichnis custom_functions der SixCMS-Installation eine Datei dbuch_node.php mit folgendem Inhalt an:


// 1
define(‘XMLRPC_SERVER’, ‘dev.drupalbuch.de’);
// 2
define(‘DRUPAL_DIR’, $_SERVER[‘DOCUMENT_ROOT’] . ‘/community’);
// 3
define(‘DRUPAL_URL’, ‘http://’ . XMLRPC_SERVER . ‘/community’);
// 4
define(‘DRUPAL_USERNAME’, ‘drupaluser’);
define(‘DRUPAL_PASSWORD’, ‘geheim’);

// 5
function chdrupal() { static $here;

if (!isset($here) || !$here) { $here = getcwd(); chdir(DRUPAL_DIR); } else { chdir($here); $here = NULL; } }

// 6
chdrupal();
require_once ‘./includes/bootstrap.inc’;
require_once ‘./includes/common.inc’;
chdrupal();

// 7
function dbuch_xmlrpc() { chdrupal(); $args = func_get_args(); $result = call_user_func_array(‘xmlrpc’, $args); chdrupal(); return $result;
}

// 8
function dbuch_node(&$new, $old, $options) { if ($options[‘event’][‘testmode’] > 0) { return array(); } $server_url = DRUPAL_URL . ‘/xmlrpc.php’;

$blogid = ‘story’; $username = DRUPAL_USERNAME; $password = DRUPAL_PASSWORD; $publish = TRUE; $appkey = ‘0123456789ABCDEF’; $content = array( ‘title’ => $new[‘title’], ‘description’ => $new[‘text’], );

// 9 switch ($options[‘event’][‘type’]) {
// 10 case ‘onNew’: case ‘onChange’: if (!$new[‘drupal_id’]) { $new[‘drupal_id’] = dbuch_xmlrpc($server_url, ‘metaWeblog.newPost’, $blogid, $username, $password, $content, $publish); } else { dbuch_xmlrpc($server_url, ‘metaWeblog.editPost’, (string)$new[‘drupal_id’], $username, $password, $content, $publish); } break; case ‘onDelete’: dbuch_xmlrpc($server_url, ‘blogger.deletePost’, $appkey, (string)$old[‘drupal_id’], $username, $password, $publish); break; } return array();
}
?>

Für die XMLRPC-Aufrufe hätten wir uns einer beliebige XMLRPC-Client-Bibliothek bedienen können. Da Drupal ebenfalls eine solche Bibliothek enthält, nutzen wir diese hier. Dazu müssen wir allerdings Drupal einbinden und soweit initialisieren, dass diese Bibliothek funktioniert.

In Zeile 1 tragen Sie bitte Ihre eigene Domain ein. In Zeile 2 geben Sie den Ort Ihrer Drupal-Installation und in Zeile 3 die zugehörige Web-Adresse an. In Zeile 4 tragen Sie das Konto eines Drupal-Nutzers ein, der die Stories in Drupal anlegen soll. Die Funktion chdrupal() ab Zeile 5 ist unsere wichtigste Krücke bei der Integration eines fremden CMS mit Drupal. Drupal benutzt nämlich bei der Einbindung von Include-Dateien ein „./“ vor jedem Dateinamen. Dies wurde zur Performance-Optimierung eingeführt. Genau diese Optimierung verhindert leider, dass der PHP-Include-Pfad zum Auffinden von Include-Dateien bei require und include genutzt würde. Dieses Verhalten wird im PHP-Handbuch beschrieben. Die Funktion chdrupal() wird immer paarweise aufgerufen, um Drupal-Code zu klammern. Bei ihrem ersten Aufruf speichert die Funktion das aktuelle Arbeitsverzeichnis in einer statischen Variable und setzt das Arbeitsverzeichnis auf den Ort der Drupal-Installation. Damit funktionieren dann innerhalb von Drupal alle Include-Anweisungen und sonstigen Dateioperationen wie gewohnt. Bei Ihrem zweiten Aufruf stellt chdrupal() das Arbeitsverzeichnis wieder her.

Die Verwendung einer statischen Variable hat noch einen weiteren Vorteil: Die Funktion drupal_bootstrap(), welche wir gleich bei der Darstellung der Kommentare in einem SixCMS-Template benötigen, löscht alle globalen Variablen und verhindert so die Nutzung einer globalen Variable als Zwischenspeicher für das Arbeitsverzeichnis.

Ab Zeile 6 binden wir die erforderlichen Drupal-Dateien für das XMLRPC-Client-Interface ein. Die Funktion dbuch_xmlrpc() ab Zeile 7 stellt die Drupal-Funktion xmlrpc() zur Verfügung. Da diese Funktion bei ihrem ersten Aufruf noch weitere Dateien einbindet, ist auch hier die Klammerung mittels chdrupal() notwendig.

Ab Zeile 8 beginnt die eigentliche Implementierung des Event-Triggers. SixCMS übergibt der Funktion drei Parameter:

  • Die zu verändernden Feldwerte als Objektreferenz, so dass die Fuktion selbst noch Wertänderungen vornehmen kann,
  • Die alten Werte bei einer Änderung
  • Schalter zur Steuerung des Ablaufes

Im Aufrufparameter $options[‘event’][‘type’] erhält die Funktion die Operation, anhand derer in der Switch-Anweisung ab Zeile 9 die Operationen zum Anlegen, Ändern und Löschen implementiert sind. Die Fälle für das Anlegen und Ändern sind ab Zeile 10 zusammengefaßt. Auf diese Weise können wir bei Änderungen an einem Objekt im SixCMS – wenn dessen Feld drupal_id noch nicht gefüllt ist – eine zugehörige Story in Drupal anlegen und deren Node-Id über den Referenzparameter zum Eintrag in dieses Feld an das aufrufende SixCMS übergeben.

Beim Ändern und Löschen gibt Drupal einen Status zurück, den wir hier allerdings nicht auswerten, um den Code kurz zu halten.

Als nächstes muss dieser Code dem SixCMS bekannt gemacht werden. In der Redaktionsoberfläche des SixCMS gelangen Sie zu den Formularen zur Definition von Event-Triggern über das Menü Tools. Die folgende Abbildung zeigt die Eingabemaske in der SixCMS-Redaktionsoberfläche.

Die Funktion dbuch_node() wird danach vor (pre-Action) Anlegen, Ändern oder Löschen eines Content-Objektes ausgeführt.

Nun muss dieser Event-Trigger noch mit einem Content-Container verbunden werden. Im Container mit den Artikeln, die Sie mit Drupal synchronisieren wollen, benötigen Sie als erstes ein Integer Feld namens drupal_id zur Aufnahme der Node-Id der verbundenen Story. Fügen Sie also ein solches Feld in gewohnter Weise über Tools | Vorgaben hinzu:

Als letztes fehlt noch die Verbindung des Containers mit dem Event-Trigger. Diese Verbindung stellen Sie über den Menüpunkt Vorgaben | Meta im Redaktionssystem des SixCMS her:

Jedes mal, wenn Sie nun einen Artikel aus dem so ausgerüsteten Container anfassen, wird über die XMLRPC-Aufrufe in der zugehörigen Drupal-Instanz die verbundene Story manipuliert. Die folgende Abbildung zeigt einen synchronisierten Artikel in beiden Systemen.

Im Prinzip können wir damit bereits an einen Artikel im SixCMS Drupal-Kommentare anhängen. Tatsächlich werden diese über die Story verwaltet, deren Node-Id nun aber mit dem Artikel im SixCMS verbunden ist. Für die Anzeige von Drupal-Kommentaren in einem SixCMS-Template sind allerdings noch ein paar Vorarbeiten notwendig, die wir uns im nächsten Abschnitt näher ansehen.

‹ Nutzer up Drupal-Inhalte im SixCMS anzeigen ›
  • Add new comment

Praxiswissen Drupal 6. oreillys basics

Mein Buch ist erschienen:

Image of Praxiswissen Drupal 6. oreillys basics

Hier ist die Zusammenfassung.

Hm, lecker!

Selber Punkte verschicken oder sammeln unter browniepunkt.de.

Mitglied der Drupal Association

Kreativ mit Elektronik

Basteln mit Elektronik, Arduino, PICAXE, kombiniert mit Malerei, Textilien, Holz oder Metall können Eltern und Kinder regelmäßig bei meinen Workshops. Nächster Termin: 3./4.4.2012 im Deutschen Museum in Bonn . Ein kleines Side Project war der Benzoltisch im Deutschen Museum im Bonn.

Wir sind alle Atheisten

... in Bezug auf die meisten Götter, an die die Menschheit jemals geglaubt hat. Manche von uns gehen einfach noch einen Gott weiter – Richard Dawkins.

Das Syndicat

Unter syndikate.it blogge ich über Cloud-Technologien. Dort gibt es auch Links zu meinen anderen Websites .

Navigation

  • Recent posts

User login

What is OpenID?
  • Log in using OpenID
  • Cancel OpenID login
  • Create new account
  • Request new password

Kommentiert

  • Wenn dieses Framework nichts
    11 weeks 6 days ago
  • Kindle version of book
    13 weeks 3 days ago
  • Susanna
    13 weeks 4 days ago
  • Tami
    17 weeks 2 days ago
  • Anti-Glare?
    49 weeks 5 days ago
  • Ein erstes Release des CakePHP-Frontends für TYPO3
    1 year 20 weeks ago
  • Geniuos!
    1 year 28 weeks ago
  • Mobile
    1 year 39 weeks ago
  • Dat Buch
    1 year 46 weeks ago
  • Känguru weiß es
    2 years 6 days ago

Freunde

Powered by Drupal, an open source content management system
  • content
  • technology
  • life
  • bonn