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