2009-07-12 5 views
1

オンラインリファレンスドキュメントのZend_Form_SubFormサンプルを使用して3つの画面「ウィザード」を作成しました。一度に1フィールド以上をZendサブフォームで検証する方法は?

私はこの問題を解決するために問題が発生しています: 最初の画面のフィールド1,2、& 3がすでにデータベースにある場合は、重複するレコードを追加しようとしていることをユーザーに通知します。これらのフィールドには、それぞれ固有のバリデータがあります。どうにか私はこの "グループバリデータ"を追加する必要があります。

ので、その最も基本的なレベルでは、私がやろうとしている:

if($field_1_not_in_db && $field_2_not_in_db && $field_3_not_in_db){ 
    return true;//validation OK 
} else { 
    return false;//invalid data 
} 

私もいくつかの問題、反対間近に迫っています:それは複数のフィールドに適用されるので、私はしません 1)それをどのフィールドに接続するかを知っている。エラーメッセージが添付されているフィールドの横に表示されるので、これは重要です。これらの「マルチフィールドバリデータ」エラーが画面上部に表示されない限り、理想的です。 2)私のバリデータはただ一つの値(私がそれを添付するフィールドの値であり、それはそれが検証されるべき複数のフィールドの値ではありません)を受け取ります。 3)エラーメッセージの元の(重複していない)レコードへのリンクを提供しますが、リンクをエスケープします。その回避方法を理解できません。

実際に実行しているセットアップ(下)は実際に正常に実行されますが、NewPlaceバリデータは、希望のグループの値の代わりに$ _POST ['city_fk']を$ fieldsとして受け取ります。

$city_fk = new Zend_Form_Element_Select('city_fk'); 
$cities = array(); 
$city_fk->setMultiOptions($cities) 
     ->setLabel('City') 
     ->setDescription('The city this place is in') 
     ->setRequired(true); 

$v = array(
     'place_is_unique' => array(
       'NewPlace', 
       'fields' => array('place_name','phone_number','phone_extension','street','post_code_name'), 
     ) 
    ); 
$city_fk->addValidators($v); 

$addressSubForm->addElement($city_fk); 

class My_Validate_NewPlace extends Zend_Validate_Abstract 
{ 
    public function isValid($fields) 
    { 
     $result = false; 

    if(!$result) 
     { 
      $this->_error('sorry, this is duplicate data. see it <a href="linktoduplicate">here</a>'); 
     return false; 
     } 

     return true; 
    } 
} 

答えて

1

これは 役立ちます「validation context」と呼ばれるものがありますあなたが検証を添付するフィールド決定に役立つ、しかし...ではないでしょう。 2番目のオプションパラメータ($ context = null)を指定した場合、カスタムバリデータまたはフォームを作成すると、Zendは投稿データの配列全体をZendに自動入力します。これにより、他のフィールド値を検証に組み込むことができます。ここには非常に基本的な例があります:

$city_name = new Zend_Form_Element_Text('city_name'); 

$place_name = new Zend_Form_Element_Text('place_name'); 
$place_name->addValidator('NewPlace'); 

class My_Validate_NewPlace extends Zend_Validate_Abstract 
{ 
    public function isValid($value, **$context = null**) 
    { 
     if(trim($value)!='' && trim($context['city_name']) != '') 
     { 
      return true; 
     } 

     return false; 
    } 
} 
関連する問題