他の複数のフォーム要素の値に対して検証するカスタム バリデーターを作成しています。私のフォームでは、次のようにカスタム バリデーターを呼び出します。
$textFieldOne = new Zend_Form_Element_Text('textFieldOne');
$textFieldOne->setAllowEmpty(false)
->addValidator('OnlyOneHasValue', false, array(array('textFieldTwo', 'textFieldThree')));
私のバリデーターは、これら 3 つのフィールド (textFieldOne、textFieldTwo、textFieldThree) の 1 つだけに値があることを確認します。将来の開発者が誤って同じフィールドを 2 回渡すことを防止したいと考えています。
$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
ます。
要素にアタッチせずにバリデーターをフォームに適用する方法はないと思いますが、それがオプションであれば、それはさらに良いでしょう。
どうすればこの問題を解決できますか?