Zend Framework:有没有办法从自定义验证器中访问元素名称?

时间:2008-12-24 00:28:24

标签: zend-framework zend-form zend-validate custom-validators

我正在编写一个自定义验证程序,它将验证多个其他表单元素值。在我的表单中,我调用我的自定义验证器:

$textFieldOne = new Zend_Form_Element_Text('textFieldOne');
$textFieldOne->setAllowEmpty(false)
             ->addValidator('OnlyOneHasValue', false, array(array('textFieldTwo', 'textFieldThree')));

我的验证器将检查这三个字段中只有一个(textFieldOne,textFieldTwo,textFieldThree)是否有值。我想阻止未来的开发人员意外地两次传递相同的字段。

$textFieldOne->addValidator('OnlyOneHasValue', false, array(array('textFieldOne', 'textFieldTwo', 'textFieldThree')));

到目前为止,我的验证器工作正常,除非我传递的字段名称与在其上设置了valiator的字段相同。

在我的验证器中,您可以看到我正在检查(设置了验证器的元素的值)。我还检查传递给验证器的其他字段的值。

public function isValid($value, $context = null) {

    $this->_setValue($value);
    $this->_context = $context;

    if ($this->valueIsNotEmpty()) {
        if ($this->numberOfFieldsWithAValue() == 0) {
            return true;
        }
        $this->_error(self::MULTIPLE_VALUES);
        return false;
    }

    if ($this->numberOfFieldsWithAValue() == 0) {
        $this->_error(self::ALL_EMPTY);
        return false;
    }

    if ($this->numberOfFieldsWithAValue() == 1) {
        return true;
    }

    if ($this->numberOfFieldsWithAValue() > 1) {
        $this->_error(self::MULTIPLE_VALUES);
        return false;
    }
}

private function valueIsNotEmpty() {
    return Zend_Validate::is($this->_value, 'NotEmpty');
}

private function numberOfFieldsWithAValue() {

    $fieldsWithValue = 0;

    foreach ($this->_fieldsToMatch as $fieldName) {

        if (isset($this->_context[$fieldName]) && Zend_Validate::is($this->_context[$fieldName], 'NotEmpty')) {
            $fieldsWithValue++;
        }
    }
    return $fieldsWithValue;
}

我的解决方案是......

  • 甲。让开发人员弄清楚是否有某种方法可以做到这一点。
  • B中。忽略$value,强制您传递所有元素(与第一个选项没有太大区别)。
  • 或C.(如果可能)首先找到调用我的验证器的元素的名称,并从$fieldsWithValue列表中忽略它。

我认为没有办法在表单上应用验证器而不将其附加到元素上,但如果它是一个选项,那就更好了。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

Normaly我建议反对这些事情,但是,在这种情况下,我相信你班上的静态成员实际上可以很好地解决这个问题。

使用静态成员,您可以在第一次调用isValid时将其设置为值,并在后续调用中对其进行检查,从而为您提供一种机制。

您可能希望将其设置为在配置选项中使用某个数组,以便您可以命名空间并允许验证程序的多个实例彼此快乐地存在于不同的集合中。

您真正必须决定如何克服的唯一问题是您希望显示错误的位置,因为表单本身不会使用验证器。如果你想在第一个之后显示所有重复项来显示错误,那就不是问题了。