我正在编写一个自定义验证程序,它将验证多个其他表单元素值。在我的表单中,我调用我的自定义验证器:
$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;
}
我的解决方案是......
$value
,强制您传递所有元素(与第一个选项没有太大区别)。$fieldsWithValue
列表中忽略它。我认为没有办法在表单上应用验证器而不将其附加到元素上,但如果它是一个选项,那就更好了。
我该如何解决这个问题?
答案 0 :(得分:1)
Normaly我建议反对这些事情,但是,在这种情况下,我相信你班上的静态成员实际上可以很好地解决这个问题。
使用静态成员,您可以在第一次调用isValid时将其设置为值,并在后续调用中对其进行检查,从而为您提供一种机制。
您可能希望将其设置为在配置选项中使用某个数组,以便您可以命名空间并允许验证程序的多个实例彼此快乐地存在于不同的集合中。
您真正必须决定如何克服的唯一问题是您希望显示错误的位置,因为表单本身不会使用验证器。如果你想在第一个之后显示所有重复项来显示错误,那就不是问题了。