0

Zend フレームワークでバリデーターを作成しようとしています。

バリデーターはデータベースにクエリを実行して、特定のレコードが存在するかどうかを確認します。このクエリでは、where 句が使用されます。where句の値はフォームの別のフィールドで指定されていますが、この値をバリデータに渡すにはどうすればよいですか?

これは、バリデーターを追加する方法です。

$adgroup_name->addValidator(new Generic_ValidateUniqueAdGroupName() ); break;

私のバリデータ内には次のものがあります。

// Query which gets an array of existing ad group names in db
$q = Doctrine_Query::create()
->select('a.name')
->from('AdGroup a')
->where('a.name = ?', $value)
->andWhere('a.campaign_id = ?', $campaign_id);      
$adgroup_names_result = $q->fetchOne(array(), Doctrine::HYDRATE_ARRAY);     

$campaign_id を渡すにはどうすればよいですか? 私は次のことを試しましたが、うまくいきません:

$adgroup_name->addValidator(new Generic_ValidateUniqueAdGroupName($campaign_id) ); break;
4

3 に答える 3

4

原則は、「パスワードの確認」バリデーターで使用されるものと同じです。フォームが送信されるときに、フォーム内のフィールドの別の要素の値が必要です。これが、キャンペーン ID を使用してバリデーターをインスタンス化しようとしても機能しない理由です。値が$campaign_idまだ設定されていません。

要素がそのバリ​​データーを呼び出すと、送信されたフォーム値の配列で埋められisValid()た 2 番目のパラメーターが呼び出されて渡されます。$contextしたがって、isValid()バリデーターのメソッドは次のようになります。

public function isValid($value, $context = null)
{
    $campaign_id = $context['campaign_id'];
    // Now build your query using $value - from the element to which this 
    // validator is attached - and the $campaign_id provided by the context.
    // And, of course, return true/false as required.
}
于 2011-02-25T14:37:39.930 に答える
2

new Generic_ValidateUniqueAdGroupName($campaign_id)Generic_ValidateUniqueAdGroupName クラスのコンストラクターと $_campaign_id などの変数を定義する必要があると思います。ドラフトは以下のとおりです。

class  Generic_ValidateUniqueAdGroupName extends Zend_Validate_Abstract {

   protected $_campaign_id;

   public function __construct($campaign_id) {
      $this->_campaign_id = $campaign_id;
   }

}

これにより、クエリの id に としてアクセスします$this->_campaign_id

于 2011-02-25T13:48:13.437 に答える
0

$options引数を指定する必要があります:

Zend_Form_Elementでの実装:

public function addValidator($validator, $breakChainOnFailure = false, $options = array())

したがって、次のようにします。

$validator = new new Generic_ValidateUniqueAdGroupName();
$adgroup_name
    ->addValidator($validator, false, array('campaign_id' => 1));
于 2011-02-25T12:58:44.363 に答える