zend_formを使用したzendフレームワークを使用したプロジェクトがあります
登録フォームに3つの場所フィールドがあります(国[コードでは$ostanと呼ばれます]都市[コードでは$shahrと呼ばれます]と地域[コードでは$mahalと呼ばれます])
これら3つをajaxで更新したいのですが、これを行うために、ユーザーが選択できるフォームに1つのフィールド(国など)を追加しました。ajaxリクエストを選択するとすぐに、データがサーバーからフェッチされ、フォーム(たとえば、都市)。
しかし、検証に関しては、都市と地域(ajaxlyがロードされている)でこのエラーが発生します
'12' was not found in the haystack
12は、dbテーブルで選択した都市のID番号です。(12は、DBを更新するために使用される、選択されたオプションの値です)
これが私のフォームです
<?php
class listab_Form_NewUser extends Zend_Form
{
public function init()
{
$q = Doctrine_Query::create()
->from('listab_Model_Locs l')
->where('l.valed = ?','0');
$result = $q->fetchArray();
$db = Zend_Db::factory('Pdo_Mysql', array(
'host' => 'localhost' ,
'username' => 'root',
'password' => '',
'dbname' => 'listab',
'charset' => 'utf8'
));
$this->addPrefixPath("listab_Model",'listab/Model/','decorator');
// initialize form
$this->setAction('/user/new')
->setMethod('post');
// create text input for name
$user = new Zend_Form_Element_Text('username');
$user->setLabel('نام کاربری:')
->setRequired()
->addValidator('StringLength',false,array('min'=>4,'max'=>20,
'messages'=>array(
Zend_Validate_StringLength::INVALID => "کلمه غیر مجاز، لطفا یک کلمه صحیح وارد کنید.",
Zend_Validate_StringLength::TOO_SHORT => "'%value%' کمتر از %min% کارکتر (حداقل) است.",
Zend_Validate_StringLength::TOO_LONG => "'%value%' بیشتر از %max% کارکتر (حداکثر).",
)))
->addValidator('Regex',false,array('pattern'=>"/^[a-z0-9]+([._]{0,1})[a-z0-9]+$/",
'messages'=> array(Zend_Validate_Regex::NOT_MATCH => 'تنها میتوانید از حروف انگلیسی و کاراکترهای جدا کننده ( underline و نقطه) استفاده کنید. به این صورت که کاراکتر های جدا کننده اول و آخر نام کاربری نمیتوانند باشند.')))
->addValidator("Db_NoRecordExists",false,array(
'table' => 'users',
'field' => 'username',
'adapter' => $db ,
'messages' => array(
'noRecordFound' => "No record matching '%value%' was found",
'recordFound' => "نام کاربری %value% قبلا ثبت شده است."
)));;
$password = new Zend_Form_Element_Password('password');
$password->setRequired()
->addValidator('StringLength',false,array('min'=>4,'max'=>100,
'messages'=>array(
Zend_Validate_StringLength::INVALID => "کلمه غیر مجاز، لطفا یک کلمه صحیح وارد کنید.",
Zend_Validate_StringLength::TOO_SHORT => "'%value%' کمتر از %min% کارکتر (حداقل) است",
Zend_Validate_StringLength::TOO_LONG => "'%value%' بیشتر از %max% کارکتر (حداکثر).",
)))
->setLabel('رمز عبور:');
$passconf = new Zend_Form_Element_Password('passconf');
$passconf->addValidator('StringLength',false,array('min'=>4,'max'=>100,
'messages'=>array(
Zend_Validate_StringLength::INVALID => "کلمه غیر مجاز، لطفا یک کلمه صحیح وارد کنید.",
Zend_Validate_StringLength::TOO_SHORT => "'%value%' کمتر از %min% کارکتر (حداقل) است",
Zend_Validate_StringLength::TOO_LONG => "'%value%' بیشتر از %max% کارکتر (حداکثر).",
)))
->setLabel('تکرار رمز عبور:')
->setRequired()
->addValidator('Identical', false, array('token' => 'password','messages'=>array(
'notSame' => 'دو مقدار وارد شده یکی نیستند.' )));
$subreg = new Zend_Form_Element_Submit('subreg');
$subreg->setLabel('ثبت نام')
->setOrder(100)
->setOptions(array('class' => 'submit'));
$email = new Zend_Form_Element_Text('email');
$email->setLabel('ایمیل:')
->setOptions(array('size' => '50'))
->setRequired()
->addValidator('EmailAddress',false,array(
'messages'=>array(
Zend_Validate_EmailAddress::INVALID => "نوع ورودی غیر مجاز است. باید یک کلمه وارد کنید.",
Zend_Validate_EmailAddress::INVALID_FORMAT => "'%value%' یک ایمیل با فرمت استاندارد نیست.",
Zend_Validate_EmailAddress::INVALID_HOSTNAME => "'%hostname%' یک آدرس هاست معتبر در ایمیل'%value%'نیست.",
Zend_Validate_EmailAddress::INVALID_MX_RECORD => "'%hostname%' یک MX رکورد مجاز برای'%value%' نیست.",
Zend_Validate_EmailAddress::INVALID_SEGMENT => "'%hostname%' is not in a routable network segment. The email address '%value%' should not be resolved from public network",
Zend_Validate_EmailAddress::DOT_ATOM => "'%localPart%' can not be matched against dot-atom format",
Zend_Validate_EmailAddress::QUOTED_STRING => "'%localPart%' can not be matched against quoted-string format",
Zend_Validate_EmailAddress::INVALID_LOCAL_PART => "'%localPart%' is no valid local part for email address '%value%'",
Zend_Validate_EmailAddress::LENGTH_EXCEEDED => "'%value%' exceeds the allowed length"
)))
->addValidator("Db_NoRecordExists",false,array(
'table' => 'users',
'field' => 'email',
'adapter' => $db ,
'messages' => array(
'noRecordFound' => "No record matching '%value%' was found",
'recordFound' => "ایمیل %value% قبلا ثبت شده است."
)));
$jens = new Zend_Form_Element_Select('jens');
$jens->setRequired(true)
->addFilter('HtmlEntities')
->addFilter('StringTrim')
->setLabel('جنسیت:');
$jens->addMultiOption('0','انتخاب کنید');
$jens->addMultiOption('1','مذکر');
$jens->addMultiOption('2','مونث');
$jens->addValidator('Regex',false,array('pattern'=>"/^(?!0$)/",
'messages'=> array(Zend_Validate_Regex::NOT_MATCH => 'لطفا یکی از موارد را انتخاب کنید.')));
$ostan = new Zend_Form_Element_Select('ostan');
$ostan->setRequired(true)
->addFilter('HtmlEntities')
->addFilter('StringTrim')
->setAttrib('onchange', 'shahr2(\'/ajax-shahr.php\')')
->setLabel('استان:');
$ostan->addValidator('Regex',false,array('pattern'=>"/^(?!0$)/",
'messages'=> array(Zend_Validate_Regex::NOT_MATCH => 'لطفا یکی از موارد را انتخاب کنید.')));
$ostan->addMultiOption('0','انتخاب کنید');
foreach($result as $key => $value){
$ostan->addMultiOption($value['code'], $value['makan']);
}
$shahr = new Zend_Form_Element_Select('shahr');
$shahr->addFilter('HtmlEntities')
->addFilter('StringTrim')
->setLabel('شهر :');
$shahr->addValidator('Regex',false,array('pattern'=>"/^(?!0$)/",
'messages'=> array(Zend_Validate_Regex::NOT_MATCH => 'لطفا یکی از موارد را انتخاب کنید.')));
$shahr->addMultiOption('0','انتخاب شهر');
$mahal = new Zend_Form_Element_Select('mahal');
$mahal->setValidators(array(array('Regex',false,array('pattern'=>"/^(?!0$)/",
'messages'=> array(Zend_Validate_Regex::NOT_MATCH => 'لطفا یکی از موارد را انتخاب کنید.')))));
$mahal->addFilter('HtmlEntities')
->addFilter('StringTrim')
->setLabel('محل:');
$mahal->addMultiOption('0','انتخاب محل');
$captcha = new Zend_Form_Element_Captcha('Captcha', array(
'captcha' => array(
'messages'=> array('badCaptcha' => 'عبارت وارد شده صحیح نمیباشد.',
'missingValue'=>'این مقدار نمیتواند خالی باشد.'),
'captcha' => 'Image',
'wordLen' => 6,
'timeout' => 300,
'width' => 300,
'height' => 100,
'FontSize' => '30' ,
'imgUrl' => '/captcha',
'imgDir' => APPLICATION_PATH . '/../public/captcha',
'font' => APPLICATION_PATH .
'/../public/fonts/LiberationSansRegular.ttf',
)
));
$captcha->setLabel('عبارت زیر را وارد کنید');
$agree = new Zend_Form_Element_Checkbox('Select');
$agree->setLabel('من به قوانین اعلامی سایت احترام گذاشته آنها را رعایت خواهم کرد.')
->setRequired(true);
$agree->addValidator('Regex',false,array('pattern'=>"/^1$/",
'messages'=> array(Zend_Validate_Regex::NOT_MATCH => 'قبول قوانین سایت برای ثبت نام الزامیست.')));
$hash = new Zend_Form_Element_Hash('hash');
$hash->setSalt('sdddd');
$this->addElement($subreg)
->addElement($user)
->addElement($email)
->addElement($password)
->addElement($passconf)
->addElement($jens)
->addElement($ostan)
->addElement($shahr)
->addElement($mahal)
->addElement($captcha)
->addElement($hash)
->addElement($agree)
;
}
}
ajaxはフォームの選択リストを変更するだけです。修正方法がわかりません。zend_formを忘れることはできません。検証が必要です。検証を書き直すのは時間の無駄です。