3

カスタムバリデータをフィールドに追加しようとしています。別のフィールドの値を考慮する必要があります。たとえば、フィールド A は最大でも B+50% である必要があります。

を実装するクラスを作成しましたZend_Validate_Interfaceが、明らかに Zend Form は現在のフィールドの値のみをバリデーターに送信します。バリデーターにすべてを受信させるにはどうすればよいですか?

4

1 に答える 1

5

を呼び出すisValidZend_Form、メソッドに渡したすべてのデータが渡されます

$form->isValid(array('a' => 1, 'b' => 2));

カスタムバリデーターは、生の値の配列全体を受け取ります。

バリデーターの例

class My_Validator_TwoVals implements Zend_Validate_Interface
{
    public function getMessages()
    {
        return array();
    }
    public function isValid($value)
    {
        print_r(func_get_args());
    }
}

フォーム例

$f = new Zend_Form;
$a = $f->createElement('Text', 'a');
$b = $f->createElement('Text', 'b');
$b->addPrefixPath('My_Validator', '.', 'validate');
$b->addValidator('TwoVals');
$f->addElements(array($a, $b));

$f->isValid(array('a' => 1, 'b' => 2));

出力

Array
(
    [0] => 2
    [1] => Array
        (
            [a] => 1
            [b] => 2
        )
)

ご覧のとおりisValid、$context に渡された 2 番目の引数もありました。そして、それには残りの値が含まれています。

の方法として、照合する 2 番目の要素をオプションとして Validator に渡すこともできます。

class My_Validator_TwoVals implements Zend_Validate_Interface
{
    protected $a;
    public function getMessages()
    {
        return array();
    }
    public function isValid($value)
    {
        var_dump($this->a->getValue());
    }
    public function __construct(Zend_Form_Element $a)
    {
        $this->a = $a;
    }
}

設定

$f = new Zend_Form;
$a = $f->createElement('Text', 'a');
$b = $f->createElement('Text', 'b');
$b->addPrefixPath('My_Validator', '.', 'validate');
$b->addValidator('TwoVals', false, array($a));
$f->addElements(array($a, $b));

$f->isValid(array('a' => 1, 'b' => 2));

その後、印刷しますint(1)。ご覧のとおり、フォーム要素の API を介してその値を取得したため、バリデーターとフィルター用に構成したものはすべて適用されます。たとえば、生の値ではありません。また、別の値などに設定することもできます。

また、Zend_Validate_IdenticalZF が他のフォーム要素のチェックを実装する方法については、以下を参照してください。

于 2011-09-28T15:53:32.927 に答える