PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Einen eigenen Zend_Filter erstellen

with 3 comments

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('&'); // &amp;
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;
	}
}

Written by Michael Kliewe

April 28th, 2010 at 9:07 am

3 Responses to 'Einen eigenen Zend_Filter erstellen'

Subscribe to comments with RSS or TrackBack to 'Einen eigenen Zend_Filter erstellen'.

  1. Zend_Filter_Digits <- filtert alle Zeichen raus die keine Zahlen sind

    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

  2. @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

Leave a Reply

You can add images to your comment by clicking here.