Hi Gavin and Ziffers

Just to keep you in the loop Ralf and I are halfway through the Zend_Form component which tackles real-world implementations of Zend_FilterChain and Zend_Validator. Rather than wait for Christopher's proposal to be finalised, we've pushed these into Zend_Form so we can start using them and see what issues we come up against.

The two components above have been integrated as Zend_Form_Validator and Zend_Form_Rule which act as chains for a set of Zend_Form_Validator_xxx / Zend_Form_Rule_xxx respectively. Rather than bind these to a single source, though, Zend_Form creates these validators on a per-object basis to allow less looping through the chains and more light-weight/targetted validators and filters. So far they are working like a champ, thanks to Christopher's code, but we're yet to determine how much they can be abstracted for more generic Zend_Rule and Zend_Validate components.

Here's how they look so far:-

<?php

class Zend_Form_Filter
{
    protected $_chain = array();

    /**
     * Add a rule object to the chain
     *
     * @param string $key
     * @param object $rule
     * @return null
     */
    public function add(Zend_Form_Filter_Interface $filter)
    {
        array_push($this->_chain, $filter);
    }

    /**
     * Run all rules in chain and get messages
     *
     * @param mixed $field
     */
    public function filter(Zend_Form_Field $field)
    {
        foreach ($this->_chain as $filter) {
            $field->setValue($filter->filter($field->getValue()));
        }
    }
}

<?php

class Zend_Form_Validator
{
    protected $_chain = array();
    protected $_error = array();

    /**
     * Add a rule object to the chain
     *
     * @param object $rule
     * @return null
     */
    public function add(Zend_Form_Rule $rule)
    {
        array_push($this->_chain, $rule);
    }

    /**
     * Run all rules in chain and get messages
     *
     * @param object $field
     * @return mixed
     */
    public function validate(Zend_Form_Field $field)
    {
        foreach ($this->_chain as $rule) {
if (($result = $rule->validate($field->getValue())) !== true) {
                array_push($this->_error, $result);
            }
        }
        return empty($this->_error);
    }

    /**
     * get array of all error messages or those for a specific key
     *
     * @param mixed $key
     * @return mixed
     */
    public function getError()
    {
        return $this->_error;
    }
}

// An example of a simple regex validator

class Zend_Form_Rule_Regex extends Zend_Form_Rule
{
    protected $_args;

    /*
     * We're using identifiers rather than full strings so that we can
* match these up to 'rea'l messages in the view (for translation, etc)
     */
    protected $_message = 'non_regex';

    public function __construct($args = null, $message = null)
    {
        if (!is_null($args)) {
            $this->_args = $args;
        }

        if (!is_null($message)) {
            $this->_message = $message;
        }
    }

    /**
     * Check result
     *
     * @param mixed $value
     * @return string|boolean
     */
    public function validate($value)
    {
        if ($value != '' && !preg_match($this->_args, $value)) {
            return $this->_message;
        }
        return true;
    }
}

// An example of a simple trim filter

class Zend_Form_Filter_Trim extends Zend_Form_Filter_Abstract
{
    /**
     * Trim whitespace
     *
     * @param mixed $value
     * @return mixed
     */
    public function filter($value)
    {
        if (is_array($value)) {
            foreach ($value as $key => $val) {
                $value[$key] = $this->filter($val);
            }
        } else {
            $value = trim($value);
        }
        return $value;
    }
}


Will keep everyone posted when the proposal as a whole has come along a bit further and post code on the proposal Wiki.

Cheerio

--

Simon Mundy | Director | PEPTOLAB

""" " "" """""" "" "" """"""" " "" """"" " """"" "  """""" "" "
202/258 Flinders Lane | Melbourne | Victoria | Australia | 3000
Voice +61 (0) 3 9654 4324 | Mobile 0438 046 061 | Fax +61 (0) 3 9654 4124
http://www.peptolab.com


Reply via email to