3

我有一个有两个日期的表格,开始和结束。我有一个启动验证器,我想验证停止,而且停止是在启动之后。但是只有在 start 有效时,after 验证才有意义。

isValid($value, $context = null)可以传递上下文变量中的其他值,但是我必须再次进行开始检查。

那么是否有可能在停止验证器的isValid()功能中检查启动验证的结果?

4

1 回答 1

3

您可以使用回调

或者只是编写自己的验证器

------ 编辑 - 我建议的答案 - 带有回调或验证器的输入过滤器 ------

我这样做是这样的。

首先创建一个包含所有参数的过滤器:

namespace MyGreatNameSpace\Filter;

use Zend\InputFilter\InputFilter;
use Zend\InputFilter\Factory as InputFactory;

class MyDateFilter extends InputFilter
{

    public function __construct($myGreatClass)
    {

        $factory = new InputFactory();

        $this->add($factory->createInput(array(
            'name'       => 'start_date',
            'required'   => true,
            'validators' => array(
                array(
                    'name' => 'Date',
                    'options' => array(
                        'format' => '2000-10-10',
                    ),
                )
            ),
        )));

        $this->add($factory->createInput(array(
            'name'       => 'end_date',
            'required'   => true,
            'validators' => array(
                array(
                    'name' => 'Date',
                    'options' => array(
                        'format' => '2000-10-10',
                    ),
                ),
                array(
                    'name'              => 'Callback',
                    'options'           => array(
                        'callback'      => array($myGreatClass, 'isDateNewer'),
                        'messages'      => array(
                            'callbackValue'  => "The end date is Older then the start date",
                        ),
                    ),
                ),
            ),
        )));


    } // End of __construct
}

创建回调函数

public function isDateNewer($date, $params)
{
    $date2 = $params['start_date'];

    if ($date > $date2) { // Over simplistic
        return TRUE;
    }
}

植入控制器(我使用服务来拉取表单/过滤器类)

// Get the form / validator objects from the SM
$form   = $this->getServiceLocator()->get('date_form');
$filter = $this->getServiceLocator()->get('date_filter');

// Inject the input filter object to the form object, load the form with data and bind the result to the model
$form->setInputFilter($filter);
$form->setData($post);
$form->bind($myModel); // (if you wish to bind the data to whatever)

if (!$form->isValid()) {
    return $this->forward()->dispatch.... (or whatever)
}

另一种稍微不同的方法(虽然更简洁)是编写一个验证器。检查Zend\Validator\Identical(注意令牌)

array(
    'name' => '\Application\Validator\myNewNamedValidator',
    'options' => array(
        'token' => 'start_date',
        'messages' => array(
            'older' => "The end date is Older then the start date",
        ),
    ),
),
于 2013-10-08T05:40:38.057 回答