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?