Skip to content

Agavi Form Population Filter (FPF) und HTML5

Ich arbeite gelegentlich mit dem PHP-Framework Agavi. Um hier Formularfelder vorauszufüllen und insbesondere auch um Fehlermeldungen nach dem Ausfüllen von Formularen anzeigen zu können, setzt Agavi den Form Population Filter (FPF) ein. Die Idee ist, dass das Framework den DOM-Baum analysiert und die Meldungen direkt an die entsprechende Stelle einfügt, die der Entwickler somit nur einmal global spezifizieren muss (z. B. immer vor dem jeweiligen Feld). Soweit die Theorie.

In der Praxis ist der Form Population Filter einer der größten Teufeleien, die ich jemals erlebt habe, er verursacht alle möglichen ärgerlichen Seiteneffekte, da er ja das Markup der ausgegebenen Seite massiv verändert und funktioniert häufiger nicht, als er es tut.  So führt zum Beispiel eine nicht-wohlgeformte Seite (falsche Tags, illegale Entities etc.) dazu, dass der FPF entweder seinen Dienst komplett einstellt, der zugrunde liegenden libxml sei Dank, oder im Besten Fall die Seite mit falsch codierten Entities wieder ausgibt. Insbesondere bei HTML5-Seiten ist dies ein Problem, da libxml kein HTML5 unterstützt (oder zumindest der FPF nicht). Laut Dokumentation sollte es ausreichen, dem FPF mit dem Parameter ignore_parse_errors klar zu machen, dass er eben dies tun solle, dies funktioniert jedoch nicht.

Wer das gleiche Problem hat, so konnte ich mir helfen:

<ae:parameter name="ignore_parse_errors">true</ae:parameter>
 <ae:parameter name="force_output_mode">xhtml</ae:parameter>
 <ae:parameter name="parse_xhtml_as_xml">false</ae:parameter>

Durch force_output_mode wird der FPF gezwungen, anstatt HTML XHTML auszugeben. Das ist natürlich großer Unsinn und führt zu allen möglichen Fehlern, die man jedoch wieder abfangen kann, indem man parse_xhtml_as_xml abstellt, sodass intern wieder loadHtml anstatt loadXml verwendet wird. Alle verbleibenden Fehler werden mit ignore_parse_errors ignoriert (was kurioserweise beim output_mode xhtml funktioniert, nicht jedoch bei html). Bei ignore_parse_errors sind neben true und false auch noch LIBXML_ERR_… möglich, siehe Release Notes von Agavi 1.0.5.

Man beachte, dass diese Methode ebenfalls gewisse Seiteneffekte nach sich zieht (aus <script src=”foo”></script> wird z. B. <script src=”foo”/>, was aus XHTML-Sicht völlig korrekt ist, aber, zumindest bei meinem Browser in Verbindung mit HTML5  nicht mehr funktioniert).

One Comment

  1. Update:
    Obowhl die parse_errors “ignoriert” werden, werden sie dennoch ins Logfile geschrieben. Um auch das abzuschalten (diese Logfiles können sehr groß werden…) einfach noch den Parameter log_parse_errors auf false setzen.

Leave a Reply