问题
$form = new Zend_Form();
$mockDate = new Zend_Form_Element_Text('mock');
$mockDate->addValidator(???????);
$form->addElements(array($mockDate));
$result = $form->isValid();
if ($result) echo "YES!!!";
else echo "NO!!!";
Assumption that the element is in a date format. How do I determine that the date given is greater than or equal to today?
回答1:
You can create a simple validator to do this:
class My_Validate_DateGreaterThanToday extends Zend_Validate_Abstract
{
    const DATE_INVALID = 'dateInvalid';
    protected $_messageTemplates = array(
        self::DATE_INVALID => "'%value%' is not greater than or equal today"
    );
    public function isValid($value)
    {
        $this->_setValue($value);
        $today = date('Y-m-d');
        // expecting $value to be YYYY-MM-DD
        if ($value < $today) {
            $this->_error(self::DATE_INVALID);
            return false;
        }
        return true;
    }
}
And add it to the element:
$mockDate->addValidator(new My_Validate_DateGreaterThanToday());
You probably want to check the date with Zend_Date for localization of dates and further benefits.
For creating custom validates, take a look at writing validators from Zend´s manual.
回答2:
The question is rather old. In the current version of ZF2 it is not necessary to write new validators. Simply add a filter / validator like this:
public function getInputFilter()
{
    if(!$this->inputFilter){
        $inputFilter = new InputFilter();
        $inputFilter->add(array(
            'name' => 'mock',
            'validators' => array(
                array('name' => 'Date'),
                array(
                    'name' => 'GreaterThan',
                    'options' => array(
                        'min' => date('Y-m-d'),
                    ),
                ),
            ),
        ));
        $this->inputFilter = $inputFilter;
    }
    return $this->inputFilter;
}
And it does the job. There is also an option called 'inclusive' which if set to 'true' (in the 'options' of GreaterThan), will allow 'today' to be a valid date
回答3:
class My_Validate_DateGreaterThanToday extends Zend_Validate_Abstract
{
    const DATE_INVALID = 'dateInvalid';
    protected $_messageTemplates = array(
        self::DATE_INVALID => "'%value%' is not greater than today"
    );
    public function isValid($value) {
        $this->_setValue($value);
        $date = new Zend_Date($value);
        $date->addDay(1);
        $now = new Zend_Date();
        // expecting $value to be YYYY-MM-DD
        if ($now->isLater($date)) {
            $this->_error(self::DATE_INVALID);
            return false;
        }
        return true;
    }
}
that's better because uses standardized Zend_Date methods to check dates, the other awsner user a string comparison that can evaluate to impredictable values...
来源:https://stackoverflow.com/questions/2232949/date-validator-that-validates-if-the-date-is-greater-than-or-equal-to-today-with