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