XML definierte Zend_Forms – Validierung auf HTML Tags

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>(/[^&lt;].*[&gt;]/)</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?

Kommentar verfassen