カスタムバリデータをフィールドに追加しようとしています。別のフィールドの値を考慮する必要があります。たとえば、フィールド A は最大でも B+50% である必要があります。
を実装するクラスを作成しましたZend_Validate_Interface
が、明らかに Zend Form は現在のフィールドの値のみをバリデーターに送信します。バリデーターにすべてを受信させるにはどうすればよいですか?
カスタムバリデータをフィールドに追加しようとしています。別のフィールドの値を考慮する必要があります。たとえば、フィールド A は最大でも B+50% である必要があります。
を実装するクラスを作成しましたZend_Validate_Interface
が、明らかに Zend Form は現在のフィールドの値のみをバリデーターに送信します。バリデーターにすべてを受信させるにはどうすればよいですか?
を呼び出すisValid
とZend_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_Identical
ZF が他のフォーム要素のチェックを実装する方法については、以下を参照してください。