11

ユーザーが「新しいアドレスを作成する」チェックボックスをオンにして、同じフォームでこの新しいアドレスのフィールドに入力できるフォームがあります。

チェックボックスがオンになっている場合にのみ、この新しいアドレスのフィールドを検証したいと思います。それ以外の場合は、無視する必要があります。

Zend_Form と Zend_Validate を使用してそれを行うにはどうすればよいですか?

ありがとう!

4

7 に答える 7

7

これを行うための最良の、そしてより正しい方法は、カスタムバリデーターを作成することだと思います。

このバリデーターは、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 ) );

        //...
    }

}

私はコードをテストしていませんが、動作するはずだと思います。

于 2012-03-30T01:07:55.660 に答える
2

複数の要素を相互に検証する必要がある場合は、次のようにします。

$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
    ...
    ...
  }
}
于 2009-09-17T14:36:28.770 に答える
2

私は実際にこれを実行しませんでしたが、理にかなった範囲で動作するはずです。それが機能する前に似たようなことをしたことがありますが、コードがどこにあったか思い出せませんでした。

<?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);
    }

  }

}
于 2009-09-17T04:36:48.143 に答える
1

そのようなフォーム機能を実装する必要はありませんでしたが、ZFでもそれを行う方法を考えていました。

頭に浮かぶアイデアの1つは、チェックボックスフィールドをパラメーターとして受け入れるカスタムバリデーターを作成し、ドキュメントに記載されているように、バリデーターチェーンで実行することです。チェックボックスがチェックされている場合、バリデーターは失敗を返す可能性があります。次に、すべての検証が失敗したかどうかを確認してから、フォームを検証に失敗したものとして扱うことができます。

フォーム検証のそのレベルのカスタマイズは不便である可能性があるため、フォームのisValidPartialメソッドを使用する方がよい場合があります。

于 2009-09-16T09:48:57.597 に答える
1

別の zend フォーム要素の値に基づいて要素を必須にするカスタム バリデーターを作成しました。

完全なコードは次のとおりです。これが誰かに役立つことを願っています。

アイデアは、カスタム バリデータを作成し、条件要素の名前とその条件要素の値をコンストラクタに渡すことです。Zend_Validor の isValid メソッドは、validtor をアタッチする要素の値と、すべてのフォーム要素の名前と値にアクセスできます。

したがって、isValid メソッド内には、フォーム要素が必須要素であるかどうかを判断するために必要なすべての情報があります。

于 2013-07-26T00:21:58.150 に答える
1

Zend 1 では、isValid メソッドを拡張します。たとえば、投稿されたデータに応じて必須を設定します。

    public function isValid($data)
    {
        if (!empty($data['companyCar'])) {
            $this->getElement('carValue')->setRequired(true);
        }

        return parent::isValid($data);
    }
于 2016-12-30T09:58:48.423 に答える
0

あなたの良い解決策をありがとうJCM。

しかし、私が気づいた2つのこと:

  • バリデーターのisValidメソッドは、成功した場合にtrueを返す必要があります。
  • テキスト フィールドにallowEmptyオプションをfalseに渡さないと、フォームの検証中にバリデーターは実行されません。
于 2013-05-15T09:22:52.983 に答える