3

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を忘れることはできません。検証が必要です。検証を書き直すのは時間の無駄です。

4

1 に答える 1

4

すべての Zend_Form_Element_Select インスタンスの前で java-script を使用して値を操作する場合、配列バリデーターのデフォルトを無効にする必要があります

$select->setRegisterInArrayValidator(false);
于 2012-05-22T07:23:20.230 に答える