ユーザーが「新しいアドレスを作成する」チェックボックスをオンにして、同じフォームでこの新しいアドレスのフィールドに入力できるフォームがあります。
チェックボックスがオンになっている場合にのみ、この新しいアドレスのフィールドを検証したいと思います。それ以外の場合は、無視する必要があります。
Zend_Form と Zend_Validate を使用してそれを行うにはどうすればよいですか?
ありがとう!
ユーザーが「新しいアドレスを作成する」チェックボックスをオンにして、同じフォームでこの新しいアドレスのフィールドに入力できるフォームがあります。
チェックボックスがオンになっている場合にのみ、この新しいアドレスのフィールドを検証したいと思います。それ以外の場合は、無視する必要があります。
Zend_Form と Zend_Validate を使用してそれを行うにはどうすればよいですか?
ありがとう!
これを行うための最良の、そしてより正しい方法は、カスタムバリデーターを作成することだと思います。
このバリデーターは、2つの異なる方法で実行できます。1つは、メソッドisValid、$ contextに渡される2番目のパラメーターを使用する方法です。これは、検証される現在のフォームです。または、検証を行うためにチェックする必要があるCheckbox要素を挿入します。コンストラクターで。私は最後が好きです:
<?php
class RequiredIfCheckboxIsChecked extends Zend_Validate_Abstract {
const REQUIRED = 'required';
protected $element;
protected $_messageTemplates = array(
self::REQUIRED => 'Element required'
);
public function __construct( Zend_Form_Element_Checkbox $element )
{
$this->element = $element;
}
public function isValid( $value )
{
$this->_setValue( $value );
if( $this->element->isChecked() && $value === '' ) {
$this->_error( self::REQUIRED );
return false;
}
return true;
}
}
使用法:
class MyForm extends Zend_Form {
public function init()
{
//...
$checkElement = new Zend_Form_Element_Checkbox( 'checkbox' );
$checkElement->setRequired();
$dependentElement = new Zend_Form_Element_Text( 'text' );
$dependentElement->setAllowEmpty( false )
->addValidator( new RequiredIfCheckboxIsChecked( $checkElement ) );
//...
}
}
私はコードをテストしていませんが、動作するはずだと思います。
複数の要素を相互に検証する必要がある場合は、次のようにします。
$f = new Zend_Form();
if($_POST && $f->isValid($_POST)) {
if($f->checkbox->isChecked() && strlen($f->getValue('element')) === 0) {
$f->element->addError('Checkbox checked, but element empty');
$f->markAsError();
}
if(!$f->isErrors()) {
// process
...
...
}
}
私は実際にこれを実行しませんでしたが、理にかなった範囲で動作するはずです。それが機能する前に似たようなことをしたことがありますが、コードがどこにあったか思い出せませんでした。
<?php
class My_Form extends Zend_Form
{
public function init()
{
$checkbox = new Zend_Form_Element_Checkbox("checkbox");
$checkbox->setValue("checked");
$textField = new Zend_Form_Element_Text("text");
$this->addElements(array("checkbox", "text"));
$checkbox = $this->getElement("checkbox");
if ($checkbox->isChecked() )
{
//get textfield
$textField = $this->getElement("text");
//make fields required and add validations to it.
$textField->setRequired(true);
}
}
}
そのようなフォーム機能を実装する必要はありませんでしたが、ZFでもそれを行う方法を考えていました。
頭に浮かぶアイデアの1つは、チェックボックスフィールドをパラメーターとして受け入れるカスタムバリデーターを作成し、ドキュメントに記載されているように、バリデーターチェーンで実行することです。チェックボックスがチェックされている場合、バリデーターは失敗を返す可能性があります。次に、すべての検証が失敗したかどうかを確認してから、フォームを検証に失敗したものとして扱うことができます。
フォーム検証のそのレベルのカスタマイズは不便である可能性があるため、フォームのisValidPartialメソッドを使用する方がよい場合があります。
別の zend フォーム要素の値に基づいて要素を必須にするカスタム バリデーターを作成しました。
完全なコードは次のとおりです。これが誰かに役立つことを願っています。
アイデアは、カスタム バリデータを作成し、条件要素の名前とその条件要素の値をコンストラクタに渡すことです。Zend_Validor の isValid メソッドは、validtor をアタッチする要素の値と、すべてのフォーム要素の名前と値にアクセスできます。
したがって、isValid メソッド内には、フォーム要素が必須要素であるかどうかを判断するために必要なすべての情報があります。
Zend 1 では、isValid メソッドを拡張します。たとえば、投稿されたデータに応じて必須を設定します。
public function isValid($data)
{
if (!empty($data['companyCar'])) {
$this->getElement('carValue')->setRequired(true);
}
return parent::isValid($data);
}
あなたの良い解決策をありがとうJCM。
しかし、私が気づいた2つのこと: