在CakePHP表单中禁用使用安全组件和jQuery的输入元素

我在CakePHP中有一个表单,它有两个实时搜索文本输入。 当用户选择结果时,它们中的每一个都更新隐藏字段的值。 该模型称为Record ,涉及的属性是

  • budget_id
  • program_id
  • concept_id

这种方式使用FormHelper创建了一个表单:

 ... Form->create('Record') ?> 

Create a record

Form->hidden('Record.budget_id', array('value' => $budget['Budget']['id'])) ?> Form->hidden('Record.program_id') ?> Form->input('Record.program_id_search', array(...)) ?> Form->hidden('Record.concept_id') ?> Form->input('Record.concept_id_search', array(...)) ?> Form->submit('Send') ?> Form->end(); ?> ...

如您所见,隐藏了存储模型属性的输入字段。 实时搜索框配置了jQuery的自动完成插件。

按照CakePHP手册的建议,我在beforeFilter方法中禁用了两个额外的字段,以便安全组件忽略它们并且表单通过validation:

 public function beforeFilter() { $this->Security->disabledFields = array( 'Record.program_id_search', 'Record.concept_id_search', ); } 

每当我从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') ) ); 

我刚刚发现的解决这个问题的一种更简单的方法就是在输入的属性数组中添加'secure' => false 。 这可以防止将它们添加到安全字段列表中。