Я пишу пользовательский валидатор, который будет проверять множество других значений элементов формы. В своей форме я называю свой пользовательский валидатор следующим образом:
$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. Игнорировать
$value
, заставляя вас пропустить все элементы (что мало чем отличается от первого варианта).
- или C. (если возможно) Найдите имя элемента, вызвавшего мой валидатор, и пропустите его из списка
$fieldsWithValue
.
Я не думаю, что есть способ применить валидатор к форме, не прикрепляя его к элементу, но было бы еще лучше, если бы это был вариант.
Как я могу решить эту проблему?