0

我正在编写一个自定义验证器,它将针对多个其他表单元素值进行验证。在我的表单中,我这样称呼我的自定义验证器:

$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')));

到目前为止,我的验证器运行良好,除非我传递与设置了验证器的字段相同的字段名称。

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

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

我的解决方案是...

  • A. 让开发人员弄清楚有某种方法可以做到这一点。
  • B. Ignore $value,迫使您传递所有元素(这与第一个选项没有太大区别)。
  • 或 C.(如果可能)首先找到调用我的验证器的元素的名称,然后从$fieldsWithValue.

我认为没有办法在不将验证器附加到元素的情况下在表单上应用验证器,但如果可以选择的话,那会更好。

我怎么解决这个问题?

4

1 回答 1

1

通常我会建议不要这样做,但是,在这种情况下,我相信你班级中的静态成员实际上会为这个问题提供一个很好的解决方案。

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

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

您真正必须决定如何克服的唯一问题是您希望在哪里显示错误,因为是的,表单本身不接受验证器。如果您希望第一个之后的所有重复项都显示错误,那不是什么大问题。

于 2009-07-27T16:17:26.847 回答