1

Security在我的 AppController 中使用该组件。我需要构建一个检查表单输入,以允许对列表中的每个项目进行自定义格式设置。为此,我$options使用 foreach 处理集合中的每个项目并创建新元素,如下所示:

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

有几点需要注意:

  1. 我将每个复选框设置为data[FilesIncluded][{UUID}](其中 UUID 实际上代表 FilesIncluded 的 UUID)而不是data[FilesIncluded][]
  2. FilesIncluded 不是表单模型的一部分,因此它将显示为$this->request->dataas$this->request->data['FilesIncluded']而不是$this->request->data['Model']['column']

我想弄清楚的是为什么这会引发身份验证安全风险?当我将字段名称从更改为'FilesIncluded.' . $fileType_key带有计数器的名称时'FilesIncluded.' . $count . '.id',它似乎可以正常工作而不会引发任何安全身份验证错误。任何想法如何使这项工作按我期望的方式工作?

更新:

另一个问题是能够维护一组固定的文件类型。例如,我希望能够控制可以从复选框中选择的 HABTM 记录。例如,我将显示这个列表: http ://cl.ly/image/0b1Q3C0d0w1Y

只有当用户选择记录时,它们才会被存储为 hasMany。然后,当需要进行编辑时,我不仅希望能够显示同一组记录,而且还希望将它们与用户保存的记录相关联。

4

1 回答 1

2

(可能的原因

您可能会收到安全错误,因为您正在禁用hiddenField复选框。安全组件通过在创建表单时根据表单字段的名称计算校验和并将其与提交表单时收到的数据进行比较来检查提交的表单是否有效(即未被篡改) 。

通过抑制 hiddenField,如果未选中复选框,则该复选框将不会出现在发布的数据中(未选中的复选框永远不会在 HTML 表单中发送)。如上所述,CakePHP 根据它期望的字段/输入和它接收的实际字段(数据)计算校验和。通过禁用 hiddenField,从发布的数据计算的校验和将取决于是否选中了复选框,将使发布的数据无效

解决方法

可能有一些解决方法;

  • 不要抑制'hiddenField'这将确保复选框将始终存在于发布的数据中。如果未选中复选框,则复选框的将为0(零)。如果复选框选中,其发布的值将是复选框的指定值(或者1如果没有指定值)

  • 从校验和中排除您的自定义输入。您可以通过 排除校验和中的字段$this->Form->unlockField('fieldname');。CakePHP 在计算安全校验和时会忽略这些输入。

文档:FormHelper::unlockField()

笔记

尽管这些变通办法可能会有所帮助,但我建议不要重新发明轮子。通过更改输入的名称,您不再遵循 CakePHP 约定。遵守约定通常可以为您节省大量时间。

例如,可以通过一次调用来保存相关数据。Model::saveAssociated()如果您的模型关系设置正确,例如:

Document->hasMany->UserFiles,然后 CakePHP 将自动插入/更新DocumentUserFiles数据。

阅读此处的文档保存相关模型数据(hasOne、hasMany、belongsTo)

于 2013-04-16T21:54:15.867 回答