RSS-Feed  

30

Mar

Customizing

Wie in meinem letzten Beitrag beschrieben hatte ich mit diesem Blog System noch das ein oder andere Problem. Die gebotenen Funktionen entsprachen nicht meinen Anforderungen. Daher habe ich mich ein wenig mit dem Plugin System von Habari auseinandergesetzt.

Im ersten Schritt habe ich ein Plugin für TinyMCE installiert oder es zumindest versucht. Bis ich eines gefunden habe, welches auch Funktioniert ist allerdings ein wenig Zeit ins Land gegangen. Eine doch irgendwo abschreckende Erfahrung, aber nachdem ich soviel Zeit und Mühe investiert habe wollte ich auch nicht locker lassen. Schlussendlich habe ich ein funktionierendes Plugin gefunden. Trotzdem war ich immer noch nicht zufrieden. Die Symbolleiste war am unteren Rand des Eingabefeldes angesiedelt und hatte sinnloserweise drei Leisten, welche nicht einmal annähernd gefüllt waren. Das konnte ich natürlich nicht so belassen und habe mich dazu entschlossen direkt Hand an den Code zu legen.

Das Plugin System schien auf den ersten Blick gar nicht so kompliziert und hatte übersichtlichen Quelltext. Jedes Plugin bildet eine Klasse, die von einer Plugin-Mutterklasse erbt. Innerhalb dieser Klasse werden dann verschiedene Methoden implementiert die die Funktionen des Plugins bilden. An der Stelle wo das Plugin Konfiguriert wird habe ich dann auch in den Code eingegriffen und einige zusätzliche Optionen hinzugefügt, welche an TinyMCE übergeben werden. So gelang es mir schonmal die Symbolleiste an den oberen Rand zu verschieben. Die Einstellungen der Leisten selbst konnte ich an dieser stelle leider nicht beeinflussen, dazu musste ich auch noch Hand an das entsprechende TinyMCE Theme legen. Nachdem auch diese Hürde mit ein bischen getüftel genommen war, hatte ich endlich einen WYSIWYG-Editor, welcher meinen Anforderungen entsprach. Doch da kam mir schon die nächste schwachstelle in den Kopf.

Ich musste feststellen, dass Habari direkt HTML verwendet und nicht auf solche dinge wie BBCode zurückgreit. Dementsprechend gibt es auch keine Unterstützung für die farbige Darstellung von Quelltexten. Doch nachdem ich nun schon einen ersten Vorgeschmack in Sachen Plugins bekommen hatte beschloss ich dieses Problem selbst anzupacken und mit einem eigenen Plugin in den Griff zu bekommen. Also auf in den Habari Wiki und wühlen. Schnell wurde ich fündig und fand einen Artikel, welcher mir das Prinzi der Habari Plugins näher erläuterte.

Wie schon erwähnt ist jedes Plugin eine Klasse. Diese Klasse hat eine Methode, welche Informationen über ein Plugin zurückliefert. Soweit so gut, das war noch der einfache Teil. Alle weiteren Methoden der Klasse können sogenannte Actionen oder Filter sein, die vom System dann an einer bestimmten Stelle aufgerufen werden. Der Unterschied von Filtern und Aktionen ist, dass Filter den ihnen übergebenen Inhalt beeinflussen können und Aktionen nur darauf reagieren. Daher kam für meine Zwecke nur ein Filter in Frage, da ich ja den Inhalt eines Postings manipulieren wollte. Aber wie muss die Methode heißen, um ein Posting vor der ausgabe zu filtern? Ich wusste nur eins, es musste mit filter_ beginnen.

An dieser Stelle möchte ich ein wenig über die Dokumentation motzen. Es gibt zwar eine Auflistung aller Anker, an denen man angreiben kann aber diese ist weder übersichtlich noch sind die einzelnden Anker weiter erläutert. Bis ich dahinter gekommen bin, dass das was ich suche sich möglicherweise in der folgenden Zeile versteckt, hat eine Weile gedauert.

$out = Plugins::filter( "post_{$name}", $out, $this );

Nach einigem Probieren und einer menge Hirnschmalz bin ich also darauf gekommen, dass die Methode, welche ich benötige, möglicherweise den Namen filter_post_content tragen muss. Der Rest war dann ganz einfach. Ein wenig mit Regex rumgespielt und schon sollte es funktionieren.

Leider hat es noch nicht so optimal funktioniert. Das Plugin wird nicht nur beim Anzeigen des Postings auf der Website aktiv sondern bereits im Backend beim bearbeiten. Dies ist noch ein wenig suboptimal, da es den Beitrag total zerstört. Auch die verwendeten Regulären Ausdrücke funktionieren noch nicht fehlerfrei, da sie scheinbar etwas zu gierig sind. Eine weiter Frage die geklärt werden muss ist, ob TinyMCE beim einfügen von Quelltexten stark dazwischen funkt. Dies scheint leider auch der Fall zu sein. Ob ich auch hierfür auch noch ein Plugin schreiben muss? Ich hoffe nicht, denn sonst ist der Zeitpunkt an dem ich resigniere relativ nahe.