Средство проверки даты, которое проверяет, является ли дата больше или равна сегодняшней с Zend Framework - PullRequest
3 голосов
/ 10 февраля 2010
$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!!!";

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

Ответы [ 3 ]

6 голосов
/ 10 февраля 2010

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

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.

1 голос
/ 14 июля 2015

Вопрос довольно старый. В текущей версии 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), позволит «сегодня» быть действительной датой

0 голосов
/ 07 ноября 2011
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 сравнивает строки, которые могут привести к непредсказуемым значениям ...

...