Drupal steuert über Eingabeformate, welche Textinhalte im Textkörper eines Nodes oder im Textfeld eines Kommentars erlaubt sind. Leider kann man in Drupal 6 nur ein Eingabeformat als Standard festlegen, welches dann überall und für jeden gilt.
Deswegen hatte ich lange Zeit das Modul Filter Default installiert, da mit diesem zumindest die Möglichkeit bestand, den Standard je nach Benutzerrolle zu ändern. Optimal war das Modul jedoch nicht, da nur das wer und nicht das wo bestimmbar ist.
Gevatter Zufall
Im Rahmen meiner regelmäßigen Updates hätte ich gestern das alte Modul aktualisieren müssen und deswegen habe ich mir einmal die Projektseite genauer angesehen. Am Modul selbst hat sich von den Features her nicht wirklich etwas getan, es gab nun jedoch einen Hinweis auf das Modul Better Formats im Text. Mit diesem kann man für jede Benutzerrolle für Nodes, Kommentare und Blöcke separat das Standard-Eingabeformat festlegen.
Der Umstieg selbst war völlig schmerzfrei:
- Deinstallation Filter Default
- Installation Better Formats 6.x Version 1.2
- Umstellung des Standard-Eingabeformats von Drupal (zurück) auf Filtered HTML
- Änderung für Nodes/Blöcke und angemeldete Benutzer in der Lasche Standards auf Full HTML
- Umstellung der Rollenreihenfolge in derselben Lasche mit der wichtigsten Benutzergruppe oben
Das Problem
Die neuen Features des Moduls funktionierten problemlos, doch leider tauchten in der Auswahl der Eingabeformate nun mehrere eigentlich versteckte Formate wieder auf.
Die Recherche
In meiner Testumgebung (lokales XAMPP) begann ich nun also Better Formats manuell zu debuggen. Ich stellte fest, daß das Modul genauso wie das betroffene Pingback einen speziellen Hook (hook_form_alter) verwendet.
An dieser Stelle verhält sich das Modul jedoch nicht wirklich sauber, da die aufgerufene Funktion better_formats_set_comment_format einen Teil des Kommentarformulars ($form['comment_filter']['format']) komplett neu über einen Aufruf der Funktion filter_formats erstellt (in der Funktion better_formats_filter_form) und hierbei den bisherigen Inhalt nicht berücksichtigt. Dieser Inhalt war jedoch schon durch das Modul Pingback verändert, um das Modul-interne Eingabeformat für anonyme Besucher zu verstecken (was durchs Überschreiben hinfällig war).
Die Lösung V1
Meine erste Lösung sah ein erneutes Ausführen der Hook-Integrationen der anderen Module am Ende der Funktion better_formats_form_alter vor. Dies ist auch durchaus möglich, auch wenn es hierfür keine fertige Funktion in der Drupal API gibt. Nach dem Vorbild der Funktion node_invoke_nodeapi kann man jedoch selbst etwas stricken. Nach der erfolgreichen Implementierung dieser Lösung und Meldung des Problems auf drupal.org störte mich jedoch die Gefahr einer potentiellen Endlosschleife.
Die Lösung V2
Der Modulautor dragonwize deutete in seiner Antwort auf meine Meldung an, daß Hooks abhängig von einem weight-Wert abgearbeitet werden. Eine Recherche mit Big G bestätigte, daß die Hooks abhängig von der Spalte weight in der system-Tabelle der Drupal-Datenbank abgearbeitet werden. Better Formats setzt den Wert derzeit leider fest auf die Zahl 100, besser wäre jedoch eine Festlegung auf Basis der derzeitigen Werte der anderen Module. Genau diese Möglichkeit habe ich mit Big G gefunden und dem Modul-Autor als zweite Lösung vorgeschlagen.
Die Lösung V3
Leider teilte mir dragonwize mit, daß der Wert absichtlich auf 100 gesetzt wurde, da einige andere Module vorher ihre Hooks abarbeiten müssen. Somit bleibt leider nur die Möglichkeit, daß alle betroffenen Module ebenfalls ihre weight anpassen müssen. Deswegen habe ich nun einen Feature Request für das Modul Pingback aufgemacht und hoffe auf eine positive Antwort.
Fazit
Nach diesem Debugging, welches mich mehr als einen halben Nachmittag gekostet hat, bin ich nun äußerst zufrieden mit dem neuen Modul und habe als Übergangslösung mittels phpMyAdmin für das Modul Pingback den Inhalt der weight-Spalte auf 200 gesetzt.



Kommentar hinzufügen