Средство проверки даты, которое проверяет, является ли дата больше или равной сегодняшней с помощью Zend Framework

$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!!!";

Предполагается, что элемент имеет формат даты. Как определить, что указанная дата больше или равна сегодняшнему дню?


person Brant Messenger    schedule 09.02.2010    source источник


Ответы (3)


Для этого вы можете создать простой валидатор:

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;
    }
}

И добавьте его к элементу:

$mockDate->addValidator(new My_Validate_DateGreaterThanToday());

Вероятно, вы захотите проверить дату с помощью Zend_Date для локализации дат и дальнейших действий. преимущества.

Для создания пользовательских валидаторов посмотрите написание валидаторов из Zend. руководство.

person Luiz Damim    schedule 10.02.2010
comment
Должно быть <=' for не больше или равно` - person stephen; 21.02.2014

Вопрос довольно старый. В текущей версии ZF2 нет необходимости писать новые валидаторы. Просто добавьте фильтр/валидатор следующим образом:

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;
}

И это делает работу. Существует также параметр под названием «включительно», который, если установлено значение «истина» (в «параметрах» GreaterThan), позволит «сегодня» быть действительной датой.

person vivanov    schedule 14.07.2015

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;
    }
}

это лучше, потому что использует стандартизированные методы Zend_Date для проверки дат, а другой пользователь awsner — сравнение строк, которое может привести к непредсказуемым значениям...

person Florian    schedule 07.11.2011
comment
Ваш пост, вероятно, должен включать описание того, почему вы считаете, что это лучше. - person LarsTech; 08.11.2011
comment
Не лучше, если вы просто добавили еще один файл для включения в Zend_Date. Как вы думаете, что вызывает Zend_Date. - person Brant Messenger; 11.04.2012