CakePHP自定义表单验证复选框

时间:2012-08-26 09:44:54

标签: cakephp cakephp-2.0

我在CakePHP中遇到了一个奇怪的问题。我有一系列问题,从复选框开始。如果选中该复选框,我想要另外两个输入字段。否则,如果未选中,则它们是可选的。我写了一个自定义函数来验证输入字段。这是其中之一:

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'); 
            } 
        } 
    } 

1 个答案:

答案 0 :(得分:0)

好吧,你有它。使用valueselected绝不是一个好主意。特别是如果您想在提交后保留表单并且如果它无效。

您应该使用default或从控制器执行此操作: http://www.dereuromark.de/2010/06/23/working-with-forms/ 章节“默认值”