Zend_Filter PregReplace in ini-Config

Heute hatte ich das Problem, dass die Config für ein Zend_Form-Formular in einer ini-Datei stehen musste. Dabei sollte auch PregReplace zum Einsatz kommen, um nichtgewollte Worte gegen Sternchen auszutauschen. Es gibt aber scheinbar kein Tutorial oder Beispiel für die Einbindung von Filtern per ini-Datei, bei denen man dem Filter Optionen hinzufügen kann. Man findet immer nur einfache Filter-Einbindungen ohne Optionen wie

[code lang=”bash” inline=”yes”]elements.nachricht.options.filters.bigger.filter = “StringToUpper”[/code]

zum Vergrößern aller Buchstaben.

Durch einiges Probieren mit den Kollegen und Durchforsten der Zend_Filter-Library, kamen wir dann auf folgendes:

[code lang=”bash” inline=”yes”]elements.nachricht.options.filters.badword.filter = “PregReplace”
elements.nachricht.options.filters.badword.options.match = “/(\bpoo\b|\bfuck\b|\bsuck\b)/i”
elements.nachricht.options.filters.badword.options.replace = “*****”[/code]

Man muss also nach dem selbstgewählten Namen des Filters, in meinem Fall “badword”, den verwendeten Filter mit “.filter” einbinden. Die Optionen werden mit “.options” ebenfalls direkt nach “badword” eingebracht. In der Option “match” steht dabei ein regulärer Ausdruck mit dem zu filternden Format und in “replace” die dafür vorgesehene Zeichenkette als Ersatz für die gefundenen Worte. “\b” markiert Wortanfänge und -enden. “i” steht dabei als caseinsensitive, also werden Groß- und Kleinschreibung ignoriert. Die Trennung der bösen Worte erfolgt per “|”.

CamelCase mit Bindestrich und umgekehrt in Zend Framework

Ich hatte gestern das Problem, dass in unserem Zend Framework Projekt die Actions in CamelCase geschrieben sind, also zum Beispiel:

[code lang=”php” inline=”no”]public function editUserAccountAction()[/code]

In der Navigation, im Routing und in der ACL stehen diese aber ohne CamelCase und mit Bindestrich drin, also nach obigen Beispiel:

[code parse=”no” inline=”no”]http://www.domain.com/irgendwas/edit-user-account/[/code]

In der ACL wie folgt.

[code lang=”php” inline=”no”]$acl->deny(‘guest’, array(‘irgendwas’), array(‘edit-user-account’));[/code]

Nun hab ich eine Rechteverwaltung geschrieben, welche die Actions anhand der Controller aus der Datei ausliest und bei Erlaubnis des Users vergleicht. Das Problem dabei ist, dass edit-user-account, wie es in der ACL steht, und editUserAccount, wie es aus dem Controller ausgelesen wird, im Vergleich immer false, also ungültig bzw falsch,  zurückgeben. Das Problem habe ich dadurch umgangen, indem ich einen Filter auf den ausgelesenen Actionnamen angewendet habe. Genauer den Zend_Filter_Word_CamelCaseToDash(). Darüber habe ich noch einen strtolower() laufen lassen, um auch vorhandene Großbuchstaben in kleine ändern zu lassen.

[code lang=”php” inline=”no”][…]
$ausgelesenerName = ‘editUserAccount’;
$filter = new Zend_Filter_Word_CamelCaseToDash();
$bereinigterName = strtolower($filter->filter($ausgelesenerName));
[…][/code]

[via /dev/notes ]