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

eli*_*lon 3 security jquery components cakephp autocomplete

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

  • budget_id
  • program_id
  • concept_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改变一个选择它没关系,但不改变隐藏的输入.

ent*_*pid 8

之所以发生这种情况,是因为安全组件锁定了隐藏字段,不仅保存了哈希的名称,还保存了它们的值.因此,当您更改其值时,您将使整个表单无效.唯一的解决方案是将这些字段从隐藏字段切换到正常字段,包含在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)


小智 5

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