eli*_*lon 3 security jquery components cakephp autocomplete
我在CakePHP中有一个表单,它有两个实时搜索文本输入.当用户选择结果时,它们中的每一个都更新隐藏字段的值.调用模型Record,涉及的属性是
budget_idprogram_idconcept_id我以这种方式使用FormHelper创建了一个表单:
...
<?php echo $this->Form->create('Record') ?>
<h1>Create a record</h1>
<?php echo $this->Form->hidden('Record.budget_id', array('value' => $budget['Budget']['id'])) ?>
<?php echo $this->Form->hidden('Record.program_id') ?>
<?php echo $this->Form->input('Record.program_id_search', array(...)) ?>
<?php echo $this->Form->hidden('Record.concept_id') ?>
<?php echo $this->Form->input('Record.concept_id_search', array(...)) ?>
<?php echo $this->Form->submit('Send') ?>
<?php echo $this->Form->end(); ?>
...
Run Code Online (Sandbox Code Playgroud)
如您所见,隐藏了存储模型属性的输入字段.实时搜索框配置了jQuery的自动完成插件.
按照CakePHP手册的建议,我已经在beforeFilter方法中禁用了两个额外的字段,以便安全组件忽略它们并且表单通过验证:
public function beforeFilter() {
$this->Security->disabledFields = array(
'Record.program_id_search',
'Record.concept_id_search',
);
}
Run Code Online (Sandbox Code Playgroud)
每当我从Javascript更改隐藏输入的值时,CakePHP似乎都会生气,它会将我发送到blackhole方法.根据文档,这没关系.
但令我惊讶的是,安全组件一直忽略我的disabledFields设置.
我一直在搜索几个网络资源,每个人都指向disabledFields选项.但它对我不起作用.
有什么建议?
谢谢!!
UPDATE
我找到了一个解决方法,但它真的很难看.我已使用常规选择字段替换隐藏的输入字段,但将CSS显示属性设置为none.
这样,安全组件不再抱怨,并且用户不断查看几个实时搜索框.
我不明白为什么用Javascript改变一个选择它没关系,但不改变隐藏的输入.
之所以发生这种情况,是因为安全组件锁定了隐藏字段,不仅保存了哈希的名称,还保存了它们的值.因此,当您更改其值时,您将使整个表单无效.唯一的解决方案是将这些字段从隐藏字段切换到正常字段,包含在display:none;div中.
另一种方法是禁用对该字段的检查,但是您发布的代码不是正确的方法.您应该在组件配置期间指定字段,如下所示:
var $components = array('Security' => array(
'blackHoleCallback' => 'callback',
'requireAuth' => array('action1', 'action2'),
'allowedControllers' => array('controller'),
'allowedActions' => array('action1', 'action2'),
'disabledFields' => array('Record.program_id_search', 'Record.concept_id_search')
)
);
Run Code Online (Sandbox Code Playgroud)