如何使用 SecurityComponent 在 CakePHP 2 中创建手动输入?

How to create manual inputs in CakePHP 2 using SecurityComponent?

我想在激活 SecurityComponent 的同时在 CakePHP 中创建一个表单。到目前为止一切顺利,现在我想添加无法使用 FormHelper 生成的自定义 input 元素。但是,我确实将这些字段包含在安全和验证检查中。

主要问题是我无法在标签之外呈现单选按钮。所以我自己渲染它们:

<div class="radio radio-inline">
    <input id="genderMALE" type="radio" name="data[User][gender]" value="MALE"/>
    <label for="genderMALE">Male</label>
</div>
<div class="radio radio-inline">
    <input id="genderFEMALE" type="radio" name="data[User][gender]" value="FEMALE"/>
    <label for="genderFEMALE">Female</label>
</div>

这本身就很完美。然而 FormHelper 没有注意到它们,因此 SecurityComponent 将此注册为篡改表格。黑洞我的请求。

我尝试使用 FormHelper 生成输入,但无线电支持有限。 format 选项在这里不起作用,因为:

Radio buttons cannot have the order of input and label elements controlled with these settings. -- Cookbook

除此之外,我找不到任何方法来呈现一个普通的独立单选按钮。我发现接受 input 的唯一方法是在 SecurityComponent.

中忽略它

Cake 解决这个问题的方法是什么?

更新 14-09 09:16
我当前的 fix/hack 将以纯 HTML 创建自定义单选按钮,如上所示。然后 link 将那些无线电输入的值输入到使用 FormHelper 创建的输入字段中。使用 CSS 我可以隐藏此输入,允许它被 JavaScript 更改,而不是使用 type="hidden".

使用此方法是否会发生任何 dangers/problems?

旁注:最后这是一个样式问题。然而,我被迫使用 Bootstrap 并且只剩下 2 天的时间来完成我的任务。而且我不想走编写自定义 CSS/JS 的道路来让它工作。

在使用 hack 解决方案获取内容时,我偶然发现了 FormHelper::$fields 字段。此字段跟踪使用 FormHelper 创建的所有输入,稍后由 SecurityComponent 用于检查表单是否已被篡改。

该解决方案确实需要一些额外的工作,因为您需要执行以下步骤:

  1. 将自定义表单元素添加到 fields 数组
  2. 从上次提交中恢复值(如果重定向回表单)
  3. 添加默认选项,这样 post 数据中的字段就不会被遗漏

工作 CTP

<div class="radio radio-inline">
    <input id="genderMALE" type="radio" name="data[User][gender]" value="MALE" 
        <?= $this->request->data('User.gender') == 'MALE' ? 'checked' : ''?> />
    <label for="genderMALE">Male</label>
</div>
<div class="radio radio-inline">
    <input id="genderFEMALE" type="radio" name="data[User][gender]" value="FEMALE" 
        <?= $this->request->data('User.gender') == 'FEMALE' ? 'checked' : ''?> />
    <label for="genderFEMALE">Female</label>
</div>
<input type="radio" name="data[User][gender]" value="" class="hidden" 
   <?= $this->request->data('User.gender') ? '' : 'checked'?> />
<?php $this->Form->fields[] = 'User.gender' ?>

它远非漂亮,但我认为它接近于 Cake 本身的内部结构。可能想要创建一个助手而不是每次都手动实施输入。