我正在编写一个自定义验证器,它将针对多个其他表单元素值进行验证。在我的表单中,我这样称呼我的自定义验证器:
$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
.
我认为没有办法在不将验证器附加到元素的情况下在表单上应用验证器,但如果可以选择的话,那会更好。
我怎么解决这个问题?