Development Weblog-Engine

Serendipity definiert eine klare Ansage an die PHP-Weblog-Engine Serendipity – Underdog mit Biss

Garvin Hicking

Serendipity ist der unterschätzte Underdog der -Szene, der sich vor den populären Konkurrenten wie WordPress und MoveableType aber nicht zu verstecken braucht. Viele bekannte Namen in der PHP-Szene [1] setzen das System bereits schon seit einer Weile ein. Dieser Artikel kann vielleicht auch Ihnen einen Anreiz zur Re-Dekoration der eigenen vier Webwände geben…

Die Entwicklung der Blog-Engine begann erweitert, das Templatesystem • Web-basierter Installations-Wizard für Anfang 2003, initiiert von Jannis Her- hielt Einzug in den Kern und Mehrbe- einfache und fortgeschrittene Konfi- manns [2] und damals noch unter dem nutzer- sowie CMS-Fähigkeiten wurden guration. Upgrades aller Versionen seit Namen jBlog. Schnell war in dem größer ausgebaut. Erscheinen auf die aktuelle Version kön- werdenden Entwicklerumfeld der tref- Die konstante Entwicklung des Systems nen ebenfalls mittels des integrierten Up- fendere Name Serendipity aus der Taufe gipfelt heute in einem stabilen, Feature- date-Managers durchgeführt werden. gehoben und soll sowohl das Konzept des kompletten Paket, das auch sicher dem- • Übersichtliche, funktionale Bedienung Blogsystems verdeutlichen, als auch ei- nächst noch Kaffee wird kochen können. mit (optionalen) WYSIWYG-Editoren. ner Figur des Films Dogma Tribut zollen. • Integrierte Mediendatenbank (Bilder, Serendipity stand von da an für zielgerich- Features PDFs, MP3, ...) mit Rechtemanagement, tete Bedienung, maximale Flexibilität und Das Aufzählen aller Features würde Keywords, Thumbnail-Erzeugung, dy- ausbaufähige, solide Technik. deutlich den Rahmen sprengen, denn namischer Verzeichnisnavigation, Lay- Wie die Blogszene selbst hat sich auch nicht umsonst wird Serendipity als bes- outmanager zum Einfügen von Dateien. das Blogsystem sprunghaft entwickelt te Weiterentwicklung des geschnitten‘ • Gruppenbasiertes Rollenkonzept mit und von Version zu Version über die Jah- Brot bezeichnet. Da man aber gerade zu unbegrenzt vielen Autorengruppen und re zahlreiche Innovationen erfahren. So Web-2.0-Zeiten mit Buzzwords sparsam individuellen Rechten. wurde nach und nach die Plugin-Infra- umgehen sollte, hier kurz die wichtigsten • Thread-basierte Kommentare, ver- struktur auf ein Event-basiertes Konzept Eigenschaften: schachtelbare Kategorien, Zuweisung

42 PHP Magazin 4.2007 www.phpmagazin.de Weblog-Engine Development

von Einträgen in mehrere Kategorien, ausprobiert und mit keinem richtig glück- Version 1.1 bot nach der Konsolidie- Trackback, , XML-RPC, lich wird, gibt es hier ein umfangreiches rungsphase und Logo-Umgestaltung der XHTML 1.1, CSS, RSS, Atom, ... Tagging-Plugin, das alle Geschmäcker Vorgängerversion erstmals wieder um- • Flexible Plugin-API für Seitenleisten- befriedigen kann. Und wenn nicht, dann fangreiche neue Features. Beispielsweise und Ereignisplugins, die effektiv jede kann es zukünftig leicht gemeinsam durch die komplett überarbeitete Medienda- Stelle des Systems ohne Eingriffe in den die Community verbessert werden. tenbank, die nun mittels Smarty-Temp- Core-Code erweitern können. Online Weiterhin ist Serendipity mit einer lating individuell anpassbar und mit au- Plugin-Repository (Spartacus) für 1- zweckmäßigeren, abstrakteren Codebase tomatischer Datei-Synchronisierung und Click-Installation von mehr als 150 Plug- ausgestattet. PHPDoc-Funktionskom- AJAX-basierter Verzeichnisnavigation ins. Drag‘n‘Drop-Pluginverwaltung zur mentare, aufgeräumte Verschachtelung noch einfacher benutzbar wurde. Änderung von Seitenleisten-Layouts. und Benutzung von Objekt-Orientierung Der AJAX-Trend wurde natürlich • Dynamisches, Smarty-basiertes Temp- in der Plugin-API lassen das Entwickler- auch bei Serendipity aufgegriffen, aber late-Konzept. Strukturelle Änderungen herz höher schlagen. Die Trennung von nur dezent an den Stellen eingesetzt, wo er aller Elemente des Frontends sind so mit Layout und Code im Templatebereich wirklich Verbesserung bringen konnte. So einzelnen, aufeinander aufbauenden macht Änderungen fühlbar angenehmer. zum Beispiel in der Verwaltung der Plug- Templatedateien umsetzbar. Unüberschaubare PHP-Konstrukte, Plug- ins, deren Reihenfolge nun per einfachem • Integration in bestehende Webseiten in-Hacks und Modi!kationen an Dateien Drag and Drop änderbar wurde – und die einfach möglich. Shared Installation des Sourcecodes sucht man hier vergebens. Möglichkeit, dass Templates eine belie- ermöglicht Betrieb von beliebig vielen Woran es Serendipity noch mangelt, bige Anzahl von Seitenleisten de!nieren Blog-Instanzen mit nur einer Codebase. ist eine ausführlichere Dokumentation können sowie andere templatespezi!sche • Umfangreiche, konfigurierbare Anti- und auch mehr Beteiligung der Nutzer an Optionen kon!gurierbar machen. Spam-Maßnahmen (Captcha, Modera- Plugin- und Template-Entwicklung. Für Eine Verbesserung der Plugin-API tion, Akismet, ...). die Zukunft ist neben der OpenID-Inte- bringt nun auch die Möglichkeit, die Aus- • Unterstützung von MySQL(i), Post- gration (bereits in Arbeit) auch die stär- führung gewisser Plugins für definierte greSQL und SQLite. kere Integration von PEAR-Channels, Autorengruppen zu verhindern, und auch • OpenSource. Und zwar richtig, nämlich Unit-Tests, Performance-Tuning und bestimmte Textformatierungen nur auf durch Verwendung der BSD-Lizenz. So- Work"ow-Integration gewünscht – wer kon!gurierte Artikel anwenden zu können. mit kann Serendipity auch in kommerzi- sich also schon immer einmal an einem Auch RSS-Feeds können nun mittels Smar- ellen Programmen seinen Einsatz !nden. Open-Source-Projekt messen wollte und ty-Templating individualisiert werden • Importieren aus zahlreichen anderen etwas beitragen möchte, darf sich in der (ebenso wie Feeds nun auch logingeschützt Blog-Systemen (WordPress, Moveable- einfachen Welt der Serendipity-Entwick- per HTTP-Authentication abgerufen wer- Type, b2Evo, blogger, ...) lung gerne jederzeit beteiligen. [3] den können). Die Integration von PEAR Für den geneigten PHP-Entwickler ist wurde verbessert, und vorhandene Kom- Aber ist das auch besser als ... Serendipity eine sehr gute Anlaufstelle, um ponenten auf dem Server können genutzt Bei allen Vorzügen des Systems sollte man sich mit Plugin-API basierten Systemen nä- werden. Auch bei der SQL-Performance dennoch neutral beim Vergleich mit ande- her zu befassen und selbst Nutznießer der wurde einiges untersucht und verbessert. ren etablierten Systemen am Markt blei- angebotenen Flexibilität und Erweiterbar- Für Pro!s kam die Möglichkeit hinzu, ben. Der Blogger an sich ist ja ein possier- keit zu werden. Wer nutzt als Entwickler alternative Templating-Prozessoren wie liches, individuelles Wesen und tut sich schon gerne ein System Out-of-the-Box, XSLT oder PHP zu nutzen. Damit !el ei- daher bei der Wahl seines Systems ähnlich ohne sich selbst in der Kon!guration und ne weitere Hürde von (unverstandenen) schwer wie bei der Wahl der Religion. Gestaltung des ausdrücken zu kön- Smarty-Hassern, Spaß an Serendipity !n- Der weiten Verbreitung und monoli- nen? Genau dies war schon immer die den zu können. thischen Popularitätskost von WordPress Grundanforderung bei den Entwicklern Hervorzuheben ist, dass seit dem entgegensetzen kann Serendipity vor – am Ende möchte man ein System indivi- Bestehen des Projekts größter Wert auf allem eine zielgerichtete, zentrale Com- duell so nutzen, als hätte man es selber ent- Rückwärts-Kompatibilität gelegt wurde. munity. Dort sind die Entwickler noch am wickelt. Und dieses Gefühl, mit einem soli- Selbst Templates und Plugins der ersten Ohr der Benutzer und können den Code den Framework in der Hinterhand, möchte Version sind in heutigen Versionen noch genau in die Richtung entwickeln, die von Serendipity vermitteln. nutzbar, alle Updates der vergangenen den Benutzern gewünscht wird. Ganz Versionen waren immer nicht-destruktiv, ohne visionäre Marketinggedanken [8]. Neuerungen von Serendipity notwendige Code-Änderungen wurden Zudem kann Serendipity durch sein zen- Wer das System schon länger kennt, aber automatisch durchgeführt. trales, leicht zugängliches Plugin-Archiv vielleicht auch schon mit früheren Versi- auf stabile und größtenteils of!ziell unter- onen beinahe wunschlos glücklich war, Serendipity 1.2 stützte Plugins zurückgreifen. Bevor man dürfte vielleicht an den Neuerungen der Nachdem das letzte Major Release im 10 Pluginlösungen für ein Tagging-Plugin letzten Versionen interessiert sein. Dezember 2006 stattfand, wird Version

www.phpmagazin.de PHP Magazin 4.2007 43 Development Weblog-Engine

Abb. 1: Der Installati- onsmanager erstellt eine Analyse des Systems

Abb. 2: Daten- bankanbindung über eine übersichtliche Eingabemaske

1.2 auch nicht mehr lange auf sich warten daher lohnt sich ein Blick auf das Online- packen sollte darauf geachtet werden, dass lassen. Die derzeit aktuelle 1.2-Alpha3- Plugin Repository [4]. die Verzeichnisse templates_c, uploads und Version bietet bereits jetzt folgende Neu- archives sowie das Serendipity-Stammver- erungen: Installation zeichnis für den Webserver schreibbar sind. Wer sich bis zu dieser Stelle noch zurück- Nach der Installation kann für das Stamm- • Verbesserte Konnektivität mit dem halten konnte und Serendipity nicht di- verzeichnis das Schreibrecht wieder entzo- Online-Repository Spartacus, verbes- rekt selbständig installiert hat, sollte spä- gen werden, da es nur für die Erstellung der serte Erkennung von Firewall-Proble- testens jetzt tätig werden. Dateien .htaccess und serendipity_con!g_ men. Benötigt wird ein Webserver (Apache, local.inc. wichtig ist. • Technisch verbesserter Login-Work- lighttpd, IIS) mit mindestens PHP 4.3.1 Der automatische Installationswizard flow, so dass Plugins bereits vor dem und einem Datenbanksystem der Wahl kann dann über den Browser z.B. via ht- Login in Zukunft Aktionen ausführen (MySQL(i) > 3.23, SQLite, PostgreSQL). tp://127.0.0.1/serendipity/ aufgerufen können (z.B. OpenID-Integration). In der Datenbank sollte bereits eine leere werden. Der Wizard zeigt erst eine Ana- • Neue RSS-Varianten können nun auch Datenbank mit beliebigem Namen exis- lyse des Systems und dessen Einstellungen direkt von Plugins ausgegeben werden tieren und ein Benutzeraccount für diese sowie etwaiger Hinweise oder Fehlermel- (z.B. iTunes feeds) Datenbank eingerichtet worden sein. Bei dungen (vergleiche Abb. 1). Am Ende der • Verbesserte Speichernutzung, mehrere Windows-Servern ist besonders darauf Seite kann man auf den Link Einfache In- Usability-Tweaks, feinere Anti-Spam zu achten, dass der session.save_path für stallation klicken, um fortzufahren. Maßnahmen, Bug!xe für gewisse Per- PHP-Sessions korrekt kon!guriert ist. Im ersten Abschnitt der Folgeseite malink-Konstellationen Nach dem Download des aktuellen Re- (siehe Abb. 2) müssen die Zugänge der leases [5] (oder über diese Heft-CD) sollte erwähnten Datenbank eingetragen wer- Wie man sieht, liegt das Augenmerk der- die heruntergeladene Datei entpackt wer- den, im zweiten Abschnitt können Sie den zeit bei weiteren Änderungen für gestei- den und in das Zielverzeichnis des Web- Loginnamen und den Titel des Blogs fest- gerte Flexibilität. Viele zusätzliche Fea- servers unterhalb des Document-Roots legen. Nach der Installation können Sie tures von Serendipity werden inzwischen gespeichert werden (z.B. /www/httpdocs/ sämtliche Werte auch über die Kon!gura- vordergründig als Plugins entwickelt, serendipity/). Beim Hochladen und Ent- tion nochmals ändern.

44 PHP Magazin 4.2007 www.phpmagazin.de Weblog-Engine Development

Nach einem Klick auf Installation Abb. 3: Der eigene Blog kurz abschließen werden Zugangsdaten ein- nach der Installation gerichtet, die Tabellen erstellt und Kon!- gurationsdateien gespeichert. Einen Klick später be!ndet man sich dann schon, wie in Abbildung 3 zu sehen, im eigenen Blog. Sollte bei der Installation ein Fehler aufgetreten sein, hilft natürlich ein Blick in die Serendipity-Dokumentation [6] oder in das Forum [3]. Übliche Fehlerquellen sind nicht anwendbare .htaccess Regeln, fehlende Schreibrechte oder fehlende Zu- griffsrechte des Datenbankbenutzers. Ein Klick auf die Administrationso- berfläche führt schließlich zum eigent- kumentation [6] und die Community [3] mentaren größtenteils ausreichend doku- lichen Herzen von Serendipity. natürlich stets gerne weiter. mentiert und liegen zur Benutzung durch Plugins o.ä. bereit. Serendipity benutzen Serendipity erweitern Um sämtliche Funktionen des Systems Damit auch die Techniker und poten- Plugin API hier zu beschreiben, fehlen sowohl der tiellen Liebhaber des Blogs noch etwas In der plugin_api.inc.php werden alle Platz als auch die Notwendigkeit. Seren- Nützliches erfahren, gibt es an dieser Objekt-Klassen für die Ableitung eines dipity ist in fast all seinen Ober"ächen Stelle noch eine kleine Einführung in den eigenen Plugins de!niert. auf Eindeutigkeit und schnelle Zugäng- Rohbau des Codes. lichkeit getrimmt, so dass sich nahezu Die zentralen Funktionsbibliotheken 1. serendpity_plugin_api alle Optionen selbst erklären. Und wenn be!nden sich im Verzeichnis include. Alle Diese meist statisch aufgerufene Klasse dennoch etwas unklar ist, helfen die Do- Funktionen sind mittels PHPDoc-Kom- enthält zentrale Verwaltungsmethoden

Anzeige Development Weblog-Engine

Wann ist Wie ist der Plugins, also z.B. das Laden eines Plug- meinname im Verzeichnis plugins erstel- Funktion kann man auch leicht erkennen, ins, die Introspection oder das Au"isten len.2. welche Möglichkeiten man als Entwickler Web 2.0? Web 2.0? aller installierten Plugins. • In dieses Verzeichnis muss eine Datei hat um das $serendipity[‘smarty‘]-Objekt Die zentrale Stelle der Plugin_API für gleichen Namens (mit .php-Endung) ge- selbständig zu verändern. den Aufruf von Plugins ist die Methode speichert werden.4. Um in einem eigenenständigen Temp- hook_event(). Sie wird an zahlreichen • Der Inhalt der Datei de!niert nur eine late (oder z.B. in der Seitenleiste des Blogs) Stellen des Serendipity-Codes wie folgt Plugin-Klasse (gleichen Namens wie des Einträge darzustellen, kann man sich der aufgerufen: Verzeichnisses). Diese muss eine Ablei- Smarty-Funktion {serendipity_fetchPrint- tung der serendipity_event oder serendi- Entries} bedienen, die ihrerseits auch Smar- serendipity_plugin_api::hook_event(‘frontend_ pity_plugin-Klasse sein und mindestens ty-Templates parst und zurückliefert. display‘, $entry); die notwendigen Methoden introspect() Beliebige Ausgaben von Plugins las- und event_hook() implementieren. sen sich mittels der Funktionen {serendi- Dieser Aufruf im Code führt dazu, dass die pity_hookPlugin} (für Ereignis-Plugins) Plugin-API jedes einzelne Plugin befragt, ob Viele Beispiele für solche Plugins gibt es oder {serendipity_showPlugin} (für Sei- es sich für den gerade ausgeführten Event bereits in der Standard-Installation von tenleisten-Plugins) an beliebigen Stellen zuständig fühlt. Ist dies der Fall, wird eine Serendipity, „Learning by Doing“ ist hier im Template positionieren. eigene Methode des Plugins aufgerufen sozusagen das praktischste Konzept. Da (event_hook()), die mit den Event-Daten sich ein Plugin üblicherweise nur auf ei- Ausblick (referenzierte Variable) operieren kann. ne Datei (zzgl. optionaler Sprachincludes Mit diesem System-Überblick ist die Stär- Sollte einmal der Bedarf eines neuen und Hilfsdateien) beläuft, ist es meist sehr ke des Serendipity-Blogs hoffentlich er- Event-Hooks für neuartige Plugins be- einfach zu warten und schnell entwickelt. läutert und Ihre Kreativität angestachelt stehen, kann man ihn mit nur einer Zeile worden. Als Mit-Entwickler von Serendi- im Sourcecode hinzufügen. Eine Liste der Smarty-Funktionen pity hoffe ich, dass Sie den Spaß am Blog- bisher bestehenden Hooks !ndet sich in Ein Template besteht aus einer Ansamm- gen durch Individualität und mit einer so- der Dokumentation [7]. lung von Smarty *.tpl Dateien und liegt in liden Codebasis neu entdecken können. einem Unterverzeichnis des templates-Ver- 2. serendipity_property_bag zeichnisses. Wenn ein Template die Stan- Garvin Hicking ist als Web-Entwickler bei der Faktor-E GmbH in Bonn tätig und ist Diese Klasse ist ein zentraler Datenhal- dard-Dateien des Systems benutzen will, leitender Entwickler von Serendipity. tungscontainer für Plugins, mittels dessen lässt es die entsprechende Datei einfach weg das Plugin Metadaten zur späteren Aus- und sie wird automatisch aus dem default- wertung angegeben kann. Dort werden Verzeichnis geladen. So kann ein Template z.B. eine Versionsnummer, der Pluginautor, auch schon einzig aus einer style.css Datei Links & Literatur o ist genutzte Event-Hooks etc. spezi!ziert. bestehen, wenn am eigentlichen HTML- [1] (nach Haarfarbe und -länge sortiert) W Layout nichts geändert werden soll. Sara Golemon, http://blog.libssh2.org/ eb 2.0? 3. serendipity_plugin Die zentrale Datei index.tpl enthält Ilia Alshanetsky, http://ilia.ws/ W Die einfache Form eines Plugins ist ein so- das Basislayout für jede Frontend-Sei- Tobias Schlitt, http://schlitt.info/ genanntes Seitenleistenplugin. Dies kann te des Blogs. Je nach angeforderter Seite George Schlossnagle, www.schlossnagle. nur Ausgaben im Frontend ausführen (dispatcht durch die index.php) werden org/~george/blog/ und hat sonst keinerlei „aktiven“ Inhalt. unterschiedliche Template-Dateien im Kristian Köhntopp, http://blog.koehntopp.de/ Sebastian Bergmann, Somit ist es geeignet für Flickr-Badges, Baukastenprinzip zusammengesteckt. www.sebastian-bergmann.de/ Currently-Listening-Informationen oder Fordert man z.B. eine einzelne Eintrags- Rasmus Lerdorf, http://toys.lerdorf.com/ eine Liste der aktuellsten Einträge. seite an, sind folgende Templates invol- [2] Jannis Hermanns, www.jannis.to/ viert: index.tpl, entries.tpl, comments.tpl 4. serendipity_event und commentform.tpl. [3] Serendipity Forum, http://board.s9y.org/ Eine auf serendipity_plugin aufbauende In jeder der Dateien kann man mit be- [4] Spartacus - Plugin/Theme Online Repository, 21. – 23. Mai 2007 http://spartacus.s9y.org Klasse dient einem Ereignis-Plugin dazu, an liebigem Smarty-Markup eingreifen, oder MedienRegion Stuttgart, am Film- den oben erwähnten Event-Hooks gewisse auch nur HTML-Änderungen vornehmen. [5] Serendipity Download, Operationen auszuführen. Die eigentliche Für individuelle Funktionsanpassungen www.s9y.org/12.html und Medienzentrum Ludwigsburg Aktion eines Plugins wird mittels einer gibt es erweiterte Smarty-Funktionen, die [6] Serendipity Dokumentation, großen event_hook()-Methode dispatcht. Serendipity bereitstellt. Diese befinden www.s9y.org/ Um ein Plugin zu erstellen, muss man sich in der Datei include/functions_smarty. [7] Plugin API Dokumentation, folgende Dinge tun: inc.php. Die Funktion serendipity_smar- www.s9y.org/116.html ty_init() ist dort für die Instanzierung des [8] www.waxy.org/archive/2005/03/30/ • Ein Unterverzeichnis in der Namens- Smarty-Objektes zuständig und gibt eini- wordpres.shtml konvention serendipity_(event|plugin)_ ge Standard-Variablen vor. Innerhalb der webinale 07 – Die Konferenz für das Next Generation Web

46 PHP Magazin 4.2007 www.phpmagazin.de Gold-Sponsoren: Silber-Sponsoren: Bronze-Sponsoren: Media-Sponsoren: Veranstalter: Powered by: