Einen eigenen Zend_Filter erstellen
Zend_Filter sind kleine Hilfsfunktionen, die Eingaben filtern und eine eventuell geänderte Ausgabe zurück liefern falls die Eingabe nicht den Kriterien entsprach. Dabei besteht die Ausgabe immer aus einer Untermenge der Eingabe, ungültige Zeichen werden heraus gefiltert. Oder aber Eingabezeichen werden transformiert, sprich umgewandelt. Häufig genutzte Filter sind beispielsweise
Zend_Filter_Alpha <- filtert alle Zeichen raus die keine Buchstaben sind Zend_Filter_HtmlEntities <- transformiert alle Sonderzeichen in ihre HTML Entities Zend_Filter_Digits <- filtert alle Zeichen raus die keine Zahlen sind Zend_Filter_StringToLower <- transformiert alle Zeichen in Kleinbuchstaben
Hier einige Beispiele wie man sie nutzen kann:
$htmlEntities = new Zend_Filter_HtmlEntities(); echo $htmlEntities->filter('&'); // &
echo Zend_Filter::filterStatic('Michael123Kliewe', 'Alpha');
$form = new Zend_Form(); $form->addElement('text', 'name', array( 'filters' => array( array('StripTags', array(array( 'allowTags' => array('p', 'br', 'strong'), 'allowAttribs' => array('style', 'title') ))) ) ));
Man kann Filter nicht nur einzeln anwenden, sondern auch eine Kette (Chain) bilden. Eingaben werden dann von Filter zu Filter gereicht, bis am Ende ein Ergebnis herauskommt.
Das Zend Framework bietet zwar bereits 42 Filter, jedoch benötigt man manchmal auch eigene. Ich erstelle hier einen einfachen Filter, der prüft ob die Eingabe innerhalb eines bestimmten Bereichs liegt, und falls nicht setzt er das Ergebnis auf den kleinsten bzw. größten Wert. Danach kann man sicher sein dass man eine Zahl aus dem Bereich vorliegen hat.
<?php class App_Filter_Between implements Zend_Filter_Interface { protected $_min = 0; protected $_max = 1; public function __construct($min, $max) { $this->_min = $min; $this->_max = $max; } public function filter($value) { return min(max($value, $this->_min), $this->_max); } }
Und so benutzt man ihn, wenn man sicherstellen will dass $amount zwischen 1 und 10 liegt:
$betweenFilter = new App_Filter_Between(1, 10); $this->_value = $betweenFilter->filter($amount);
Das war die Minimalvariante, die die Aufgabe löst. Natürlich kann man ihn auch in einer Filter Chain oder in einem Zend_Form benutzen. Etwas aufgebohrter, mit Gettern, Settern und erweitertem Konstruktor sieht das dann so aus:
<?php class App_Filter_Between implements Zend_Filter_Interface { protected $_min = 0; protected $_max = 1; public function __construct($options = null) { if ($options instanceof Zend_Config) { $options = $options->toArray(); } else if (!is_array($options)) { $options = func_get_args(); $temp['min'] = array_shift($options); if (!empty($options)) { $temp['max'] = array_shift($options); } $options = $temp; } if (array_key_exists('min', $options)) { $this->setMin($options['min']); } if (array_key_exists('max', $options)) { $this->setMax($options['max']); } } public function filter($value) { return min(max($value, $this->_min), $this->_max); } public function setMin($min) { if (is_numeric($min)) { $this->_min = $min; } return $this; } public function getMin() { return $this->_min; } public function setMax($max) { if (is_numeric($max)) { $this->_max = (int)$max; } return $this; } public function getMax() { return $this->_max; } }
[…] https://www.phpgangsta.de/einen-eigenen-zend_filter-erstellen […]
Zend Framework News » Blog Archive » Erstellung von eigenen Zend_Filtern
28 Apr 10 at 20:15
Kann man dafür nicht auch einfach Typecasting $var=(int)$var; verwenden? Und wäre es nicht sinnvoller (aus PHP-Core-Entwicklersicht) Typecasting und somit den normalen PHP Core so zu erweitern, dass er eben diese Filter unterstützt?
Gast
29 Jun 10 at 20:20
@Gast: Typecasting ist etwas anderes als dieser Filter.
$digits = new Zend_Filter_Digits();
echo $digits->filter('23f4');
gibt „234“ aus, wohingehen
echo (int)'23f4';
einfach nur „23“ ausgibt.
Deinen zweiten Satz habe ich noch nicht verstanden.
Michael Kliewe
29 Jun 10 at 22:27