如何使用 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
用于检查表单是否已被篡改。
该解决方案确实需要一些额外的工作,因为您需要执行以下步骤:
- 将自定义表单元素添加到
fields
数组
- 从上次提交中恢复值(如果重定向回表单)
- 添加默认选项,这样 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 本身的内部结构。可能想要创建一个助手而不是每次都手动实施输入。
我想在激活 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
用于检查表单是否已被篡改。
该解决方案确实需要一些额外的工作,因为您需要执行以下步骤:
- 将自定义表单元素添加到
fields
数组 - 从上次提交中恢复值(如果重定向回表单)
- 添加默认选项,这样 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 本身的内部结构。可能想要创建一个助手而不是每次都手动实施输入。