[英]CakePHP HABTM data not saving to database
我有一个模型GenForm
,它与另一个模型PdfFile
关系。 我使用它来生成GenForm
索引视图中的复选框列表。 在GenForm
模型中,我添加了:
public $hasAndBelongsToMany = array(
'PdfFile' => array(
'className' => 'PdfFile',
'joinTable' => 'gen_forms_x_pdf_files'
)
这是我的GenForm
index.ctp
视图中的一个片段:
<?php
echo $this->Form->input( 'PdfFile', array('label' => 'Select some PDF files', 'multiple' => 'checkbox') );
echo $this->Form->input( 'first_name' );
echo $this->Form->input( 'last_name' );
?>
在控制器中,我有一个基本保存:
if ($this->request->is('post')) { // form was submitted
$this->GenForm->create();
if ($this->GenForm->save($this->request->data)) {
return $this->redirect(array('action' => 'generate', $this->GenForm->id)); // assemble the PDF for this record
} else {
$this->Session->setFlash(__('Log entry not saved.'));
}
}
现在,当我debug()
它时, $this->data
看起来像这样:
array(
'PdfFile' => array(
'PdfFile' => array(
(int) 0 => '1',
(int) 1 => '5'
)
),
'GenForm' => array(
'first_name' => 'xxx',
'last_name' => 'xxx',
'association_id' => '1',
'email' => ''
)
)
一切都很完美,但我无法验证复选框(必须至少检查一个)。 所以,根据这个答案 ,我做了一些改变。
index.ctp
视图变为:
<?php
echo $this->Form->input( 'GenForm.PdfFile', array('label' => 'Select some PDF files', 'multiple' => 'checkbox') );
echo $this->Form->input( 'first_name' );
echo $this->Form->input( 'last_name' );
?>
这是我的验证规则:
public $validate = array(
'PdfFile' => array(
'rule' => array(
'multiple', array('min' => 1)
),
'message' => 'Please select one or more PDFs'
)
)
这就是$this->data
现在的样子:
array(
'GenForm' => array(
'PdfFile' => array(
(int) 0 => '1',
(int) 1 => '5'
),
'first_name' => 'xxx',
'last_name' => 'xxx',
'association_id' => '1',
'email' => ''
)
)
现在PdfFile
的复选框验证,但PdfFile
数据未保存 - 尽管GenForm
的其他字段已正确保存到自己的表中。
任何人都可以告诉我我缺少什么,以便PdfFile
自动保存并获得验证?
陈述显而易见的,但有效的形式是使用的形式,即:
echo $this->Form->input('PdfFile', array(
'label' => 'Select some PDF files',
'multiple' => 'checkbox'
));
将表单更改为具有名为“PdfFile”的“字段”将无法正常工作 - 因为模型层将删除不存在的字段的任何数据 - 并且在此表单中它将检查gen_forms.PdfFile
,发现没有字段并忽略数据。
要处理验证错误 - 使用在模型上运行的验证规则来检查要保存的habtm记录的数量。 用于验证的字段的名称是什么并不重要,例如:
<?php
class GenForm extends AppModel {
public $validate = array(
'dummy' => array( // <- name this whatever you like
'atLeastOne' => array(
'required' => true, // run always
'rule' => array('validateAtLeastOne')
)
)
);
function validateAtLeastOne() {
if (!isset($this->data['PdfFile'])) {
// there is no pdf data at all, ignore this rule
// allow other save operations to work
return true;
}
$return = count(array_filter($this->data['PdfFile']['PdfFile']));
if (!$return) {
$this->PdfFile->invalidate('PdfFile', 'Please upload a file');
}
return $return;
}
}
因为验证规则如果没有记录则返回false,它将停止保存。 通过使用表单助手将查找的相同“字段”名称调用HABTM关联上的invalidate,将显示错误消息。
您可以在问题中使用第二种方法:
echo $this->Form->input('GenForm.PdfFile', array(
'label' => 'Select some PDF files',
'multiple' => 'checkbox'
));
完全知道这不是蛋糕期望接收数据然后将其操作为beforeValidate中的正确格式:
<?php
class GenForm extends AppModel {
public $validate = array(
'PdfFile' => array( // existing rule
...
)
);
function beforeValidate() {
if (isset($this->data[$this->alias]['PdfFile'])) {
// keep the existing data as that's what validation will check against
// copy to the right location so Cake will process it
$this->data['PdfFile']['PdfFile'] = $this->data[$this->alias]['PdfFile'];
}
return true;
}
...
}
如果我没记错的话,从蛋糕手册中可能你错误地格式化了数据。
试试$this->data
看起来像这样:
array(
'GenForm' => array(
'first_name' => 'xxx',
'last_name' => 'xxx',
'association_id' => '1',
'email' => ''
),
'PdfFile' => array(
(int) 0 => '1',
(int) 1 => '5'
),
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.