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

禁用使用安全组件和jQuery的CakePHP表单中的输入元素,jquery,security,cakephp,autocomplete,components,Jquery,Security,Cakephp,Autocomplete,Components,我有一个CakePHP表单,有两个实时搜索文本输入。当用户选择一个结果时,它们中的每一个都会更新隐藏字段的值。该模型称为Record,所涉及的属性为 budget\u id program\u id concept\u id 我使用FormHelper创建了一个表单,如下所示: ... <?php echo $this->Form->create('Record') ?> <h1>Create a record</h1> <?php e

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

  • budget\u id
  • program\u id
  • concept\u 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(); ?>
...
似乎每当我更改Javascript中隐藏输入的值时,CakePHP就会生气,并将我发送到blackhole方法。根据文件,这没关系

但令我惊讶的是,安全组件一直忽略我的
禁用字段设置

我一直在搜索多个网络资源,每个人都指向
disabledFields
选项。但这对我不起作用

有什么建议吗

谢谢

更新

我找到了一个解决办法,但它真的很难看。我已将隐藏的输入字段替换为常规的选择字段,但将CSS显示属性设置为
none

这样,安全组件就不会再抱怨了,用户会继续查看几个实时搜索框

我不明白为什么用Javascript更改select是可以的,但更改隐藏的输入却不行。

之所以会这样,是因为安全组件锁定了隐藏的字段,不仅保存了它们的名称,还保存了它们的值。因此,当您更改其值时,会使整个表单无效。唯一的解决方案是将这些字段从隐藏字段切换到普通字段,包装在
显示:无中分区

另一种方法是禁用对该字段的检查,但您发布的代码不是正确的方法。您应该在组件配置期间指定字段,如下所示:

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
。这将阻止它们被添加到安全字段列表。

我已使用您建议的相同解决方案编辑了我的问题。另一方面,告诉我们,
beforeFilter
是配置组件的正确位置。是的,很抱歉,我没有看到函数的名称,我以为您是在某些操作中直接执行的。:)即使使用“secure”=>FormHelper::secure\u SKIP,似乎也无法使用2.x。改用FormHelper::unlockField()API。
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')
    )
);