如何在Zend_Form :: isValid()方法中获取表单元素值?

时间:2012-01-05 16:08:33

标签: zend-framework validation zend-form

我正在寻找在isValid()方法中获取表单元素值的最佳方法。

我有类似的东西isValid():

public function isValid($data) {

    $start = (int)($data['start_hour'] . $data['start_minute']);
    $end   = (int)($data['end_hour'] . $data['end_minute']);

    if ($start >= $end) {
        $this->getElement('start_hour')->addError('Start time should be less than end time');
        return false;
    }

    return parent::isValid($data);
}

但问题是,当我的数据结构发生变化时,我也必须更改验证。 例如,现在 start_hour start_minute 等的值成为多维数组的元素,我需要编辑验证,如

public function isValid($data) {

    $start = (int)($data['send']['start_hour'] . $data['send']['start_minute']);
    $end   = (int)($data['send']['end_hour'] . $data['send']['end_minute']);

    .......
}

通过永久密钥(如元素名称)获取元素的值会很棒,所以我的isValid看起来像:

public function isValid($data) {

    $start = (int)($this->getElement('start_hour')->getValue() . $this->getElement('start_minute')->getValue());
    $end   = (int)($this->getElement('end_hour')->getValue() . $this->getElement('end_minute')->getValue());

    .......
}

但验证方法中的 $ this-> getElement('start_hour') - > getValue()会返回一个空值。

这可能以这种方式获得元素值吗?

感谢。

3 个答案:

答案 0 :(得分:3)

尝试使用$ this-> getValue('start_hour');

答案 1 :(得分:1)

尝试拨打

$form->populate($data)

在以这种方式调用isValid之前,数据将在您的表单中。 然后$this->getValue('start_hour');应该在isValid()内工作。

所以要确定: 代码中的某个地方(可能是控制器)有类似的东西:

    $this->view->form = new MyForm();
$this->populate($data); //add this
if($this->view->form->isValid($data)){
//do stuff
}

答案 2 :(得分:1)

如果此代码在表单的isValid()方法中进行,那么请确保您可以按照您的描述进行操作。只是isValid()通常需要传递一些数据 - 例如$form->isValid($_POST) - 而你最终会忽略它(假设父级是Zend_Form,它有一个空的isValid()方法;中间祖先可能会检查传递的数据)。我认为这可能会引起混淆。

替代方案可以是创建custom validator,将其附加到表单元素的一个(例如,start_hour元素)。验证者isValid()的签名可以使用可选的$context参数 - isValid($value, $context = null)。当您致电$form->isValid($data)时,它会将$data作为$context传递给元素验证程序。然后,您可以使用该$context变量检查其他值(start_minend_hourend_min等。