我在AppController中使用的是AppController组件。我需要构建一个检查表单输入,它将允许对列表中的每个项目进行自定义格式设置。为了实现这一点,我正在使用foreach处理$options集中的每个项,并创建如下所示的新元素:
foreach ($fileTypes as $fileType_key => $fileType_value) {
echo $this->Form->input(
'FilesIncluded.' . $fileType_key,
array(
'type' => 'checkbox',
'value' => $fileType_key,
'label' => false,
'div' => false,
'before' => '<span class="checkbox clearfix"><span class="check">',
'after' => '</span><label for="add-product-check-sub-cat">' . $fileType_value . '</label></span>',
'hiddenField' => false,
)
);
}有几件事需要注意:
data[FilesIncluded][{UUID}] (其中UUID实际上表示UUID pf、FilesIncluded),而不是data[FilesIncluded][]。$this->request->data['FilesIncluded']而不是$this->request->data['Model']['column']的形式出现在$this->request->data中。我想弄明白的是为什么这会带来安全风险?当我将字段名从'FilesIncluded.' . $fileType_key更改为带有计数器的东西(如'FilesIncluded.' . $count . '.id' )时,它似乎可以工作,而不会引发任何安全错误。有什么想法,如何使这个工作的方式,我期待它吗?
更新:
另一个问题是能够维护一组固定的FileTypes。例如,我希望能够控制可以从复选框中选择的HABTM记录。例如,我将显示以下列表:http://cl.ly/image/0b1Q3C0d0w1Y
只有当用户选择这些记录时,它们才会被存储为hasMany。然后,当需要编辑时,我不仅希望能够显示相同的记录集,而且希望它们与用户保存的记录相关联。
发布于 2013-04-16 21:54:15
(可能)原因
您可能会收到安全性错误,因为您正在禁用复选框的hiddenField。当创建表单时,安全组件根据表单字段的名称计算校验和,并将其与提交表单时收到的数据进行比较,从而检查提交的表单是否有效(即未篡改)。
通过取消hiddenField,如果未选中复选框,则该复选框将不会出现在发布的数据中的中(未选中的复选框永远不会在HTML中发送)。如上所述,CakePHP根据期望的字段/输入以及它接收的实际字段(数据)计算校验和。通过禁用hiddenField,从发布的数据中计算出的校验和将取决于是否有复选框选中了或 not,这将使发布的数据无效。
解决办法
可能会有一些解决办法;
0 (零)。如果选中复选框,则其posted值将是复选框的指定值(如果未指定值,则为1 )。$this->Form->unlockField('fieldname');从校验和中排除字段。在计算安全校验和时,CakePHP将忽略这些输入。文档:FormHelper::unlockField()
备注
虽然这些解决办法可能有帮助,但我建议不要重新发明轮子。通过更改输入的名称,您不再遵循CakePHP约定。坚持惯例常常会节省你很多时间。
例如,可以使用单个Model::saveAssociated()调用来保存相关数据。如果您的模型-关系已正确设置,例如:
Document->hasMany->UserFiles,然后CakePHP将自动插入/更新Document和UserFiles数据。
阅读这里的文档,保存相关模型数据(hasOne、hasMany、belongsTo)
https://stackoverflow.com/questions/16046930
复制相似问题