Problem:
Eine über eine xml-Datei konfiguierte Zend_Form sollte validiert werden. Es sollte u.a. überprüft werden, ob HTML-Tags eingegeben wurden. Falls dies der Fall war, sollte das Formular nicht abgeschickt werden. Dazu wurde folgende Konfiguration (Auszug) verwendet:
<text type="textarea"> <options required="1"> <validators> <regex validator="Regex"> <options> <pattern>(/[^<].*[>]/)</pattern> </options> </regex> </validators> </options> </text>
Das Pattern ist in diesem Fall noch inkorrekt, da innerhalb von XML keine Zeichen wie „<" und "&" erlaubt sind. Der nächste Versuch war, die Zeichen mittels SQL Entities darzustellen.
Das Pattern sah dann wie folgt aus:
<pattern>(/[^<].*[>]/)</pattern>
Aber selbst dieser Ansatz brachte keine Lösung. Ein nächster Versuch war das einbetten des Codes in einen CDATA-Block.
<pattern><![CDATA["(/[^<].*[>]/)"]]></pattern>
Doch selbst dieser Ansatz lieferte weiterhin keine Lösung. Das Formular wurde nicht korrekt validiert.
Ein anderer Lösungsansatz brachte letztendlich den Erfolg: Das Schreiben einer eigenen Validatorklasse. In der XML-Konfiguration des Formulars muss nun nur noch folgender Aufruf stehen:
<text type="textarea"> <options required="1"> <validators> <regex validator="HtmlCheck" /> </validators> </options> </text>
Es wird nun der Validator HtmlCheck aufgerufen. Diesen müssen wir nun noch definieren. Wir legen dazu eine passende Validatorklasse an:
class Validate_HtmlCheck extends Zend_Validate_Abstract { // [...] public function isValid($value) { //Prüfen, ob HTML Tags gesetzt wurden if($value!=strip_tags($value)) { return false; } //Ansonsten true return true; } }
Eventuell müsst ihr den Klassennamen entsprechend eurer eigenen Projektstruktur anpassen. Damit funktionierte das Validieren des Formulars auf HTML-Tags, wenn ihr euer Formular über XML definiert habt.
Vielleicht habt ihr ja noch eine elegantere Lösung?