0

他の複数のフォーム要素の値に対して検証するカスタム バリデーターを作成しています。私のフォームでは、次のようにカスタム バリデーターを呼び出します。

$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ます。

要素にアタッチせずにバリデーターをフォームに適用する方法はないと思いますが、それがオプションであれば、それはさらに良いでしょう。

どうすればこの問題を解決できますか?

4

1 に答える 1

1

通常、私はそのようなことに反対することをお勧めしますが、この場合、クラスの静的メンバーが実際にこの問題の良い解決策を提供すると思います。

静的メンバーを使用すると、最初に isValid が呼び出されたときに値を設定し、その後の呼び出しでそれをチェックできるため、このためのメカニズムが提供されます。

構成オプションでいくつかの配列を使用するようにこれを設定したい場合があります。これにより、名前空間を作成し、バリデーターの複数のインスタンスを異なるセットに対して互いに共存させることができます。

あなたが本当に克服する方法を決定しなければならない唯一の問題は、エラーを表示したい場所です.はい、フォーム自体はバリデータを取りません. 最初の後のすべての重複でエラーを表示したい場合は、それほど問題にはなりません。

于 2009-07-27T16:17:26.847 に答える