0

CakePHPのフォームに奇妙な問題があります。チェックボックスから始まる一連の質問があります。チェックボックスがオンになっている場合、他の2つの入力フィールドを必須にします。それ以外の場合、チェックを外すと、オプションになります。入力フィールドを検証するためのカスタム関数を作成しました。そのうちの1つは次のとおりです。

public function rn_number () {
 if ($this->data['Education']['rn_box'] == 1) {
    if($this->data['Education']['rn_number'] == '')
        return false
}

return true;
}

public $validate = array(
     'rn_number' => array(
            'rn_number'=>array(
                'rule' => 'rn_number'
                ),
            ),
);

検証は正常に機能します。上記のルールでは、IDが「cna_box」のチェックボックスの値が1であるかどうかをチェックするか、チェックされてから、IDが「cna_number」の入力が空かどうかをチェックします。その場合、falseを返します。チェックボックスがオンになっている場合は、常にデータを送信する必要がありました。私の問題は、「cna_number」などの必須入力フィールドが空白の場合にエラーが発生することを示すことがあるということです。最初の送信時に、これらのフィールドが必須であることを常に示します。ただし、フォームを再度送信しても、これらのフィールドが必須であることは示されず、エラーメッセージが表示されないため、ユーザーが混乱します。

チェックボックスに非表示の入力があることに気づきました。チェックボックスを送信してエラーのあるページに戻ると、非表示の入力の値は0になり、チェックボックスの値は1になります。これは問題と関係があると思いますか?

更新しました:

問題のフォームフィールドを生成する私のビューからのコードは次のとおりです。

echo $this->Form->inputs(array(
    'legend'=>'Certifications',
    'rn_box'=>array(
        'type'=>'checkbox',
        'label'=>'RN',
        ),
    'rn_number'=>array(
        'label'=>'RN Number:',
        'value' => $results['Education']['rn_number']
        ),
    'rn_exp_date' => array(
        'label' => 'Expiration Date:',
        'dateFormat' => 'MDY',
        'monthNames' => FALSE,
        'minYear' => date('Y'),
        'maxYear' => date('Y') + 20,
        'empty' => TRUE,
        'after' => '<span class="small">(MM/DD/YYYY)</span>',
        'class' => 'input-mini',
        'selected'=>strtotime($results['Education']['rn_exp_date'])
        ),
));

そしてコントローラーコード:

public function pagethree() { 

        /** 
         ** If user has completed this form, 
         ** grab data for editing 
         **/
        $this->set('results', $this->Education->find('first', array( 
            'conditions' => array('Education.user_id' => $this->Auth->user('id')) 
        ))); 


        if ($this->request->is('post')){   
            $this->request->data['User']['id'] = $this->Auth->user('id'); 

            /** 
             ** Find if there is any data 
             ** in this user in the Basics 
             ** table. 
             **/
            $existingRecordId = $this->Education->find('first', array( 
                'conditions' => array('Education.user_id' => $this->Auth->user('id')), 
                'fields' => array('Education.id') 
            )); 

            /** 
             ** If data exists, return row 
             ** id (PK). Set this value to 
             ** id key, so saveAll() updates 
             ** existing row. 
             **/

            if(sizeof($existingRecordId)>0) 
                $this->request->data['Education']['id'] = $existingRecordId['Education']['id']; 

            if ($this->User->saveAll($this->request->data)) { 
                $this->redirect(array('action'=>'pagefour')); 
            } else { 
                $this->Session->setFlash('Your data have not been saved'); 
            } 
        } 
    } 
4

1 に答える 1

0

さて、あなたはそれを持っています。valueとを使用selectedすることは決して良い考えではありません。特に、送信後にフォームを保持したい場合や、フォームが無効になる場合。

コントローラーを使用するdefaultか、コントローラーから実行 する必要があります。 http://www.dereuromark.de/2010/06/23/working-with-forms/ 章「デフォルト値」

于 2012-08-26T10:41:31.843 に答える