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

时间:2016-09-13 11:49:52

标签: php cakephp-2.0

我希望在SecurityComponent处于活动状态时在CakePHP中创建一个表单。到目前为止一切都那么好,现在我想添加自定义input元素,我无法使用FormHelper生成这些元素。但是,我确实将这些字段包含在安全性和验证检查中。

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

<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选项在此处不起作用:

  

单选按钮不能使用这些设置控制输入和标签元素的顺序。    - Cookbook

接下来,我找不到任何方法来渲染一个普通的独立单选按钮。我发现接受input的唯一方法是在SecurityComponent中忽略它。

Cake的解决方法是什么?

更新14-09 09:16
我目前的修复/黑客将是用纯HTML创建自定义单选按钮,如上所示。然后将这些无线电输入的值链接到使用FormHelper创建的输入字段。使用CSS我可以隐藏此输入,允许通过JavaScript更改它,而不是使用type="hidden"

使用此方法可能会出现任何危险/问题吗?

旁注:最后这是造型问题。然而,我被迫使用Bootstrap并且还有2天时间来完成我的任务。而且我不想在编写自定义CSS / JS的道路上努力实现这一目标。

1 个答案:

答案 0 :(得分:0)

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

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

  1. fields数组
  2. 中添加自定义表单元素
  3. 从之前的提交中恢复值(如果重定向回到表单)
  4. 添加默认选项,因此不会从发布数据中省略字段
  5. 工作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' ?>
    

    它远非漂亮,但我认为它接近于蛋糕本身的内部。可能希望创建一个帮助程序,而不是每次都手动实现输入。