1

オンラインリファレンスドキュメントのZend_Form_SubFormの例を使用して、3画面の「ウィザード」を作成しました。

私が満たすのに問題がある要件は次のとおりです。最初の画面のフィールド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バリデーターは、投稿された値の目的のグループではなく、$fieldsとして$_POST['city_fk']を受け取ります。

$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;
    }
}
4

1 に答える 1

1

これは、検証をどのフィールドに添付するかを決定するのに役立ちませんが... 「検証コンテキスト」と呼ばれるものがあります。カスタム バリデータまたはフォーム IF を作成するときに、2 番目のオプション パラメータ ($context = null) を指定すると、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;
    }
}
于 2009-07-13T14:08:53.747 に答える