オンラインリファレンスドキュメントの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;
}
}