【问题标题】:Disabling input elements in a CakePHP form that uses Security component and jQuery在使用 Security 组件和 jQuery 的 CakePHP 表单中禁用输入元素
【发布时间】:2011-07-12 20:44:52
【问题描述】:

我在 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(); ?>
...

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

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

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

似乎每当我从 Javascript 更改隐藏输入的值时,CakePHP 就会生气,并将我发送到 blackhole 方法。根据文档,没关系。

但令我惊讶的是,安全组件一直忽略我的disabledFields 设置。

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

有什么建议吗?

谢谢!!

更新

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

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

我不明白为什么用 Javascript 更改选择可以,但不能更改隐藏输入。

【问题讨论】:

    标签: jquery security cakephp autocomplete components


    【解决方案1】:

    这是因为 安全组件 锁定了隐藏字段,在哈希中不仅保存了它们的名称,还保存了它们的值。因此,当您更改它们的值时,会使整个表单无效。唯一的解决方案是将这些字段从隐藏字段切换到普通字段,并包裹在 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')
        )
    );
    

    【讨论】:

    • 我已使用您建议的相同解决方案编辑了我的问题。另一方面,CakePHP documentation about Security component 告诉 beforeFilter 是配置组件的正确位置。
    • 是的,对不起,我没有看到函数的名称,我以为你是在某些动作中直接做的。 :)
    【解决方案2】:

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

    【讨论】:

    • 似乎不适用于 2.x,即使使用 'secure' => FormHelper::SECURE_SKIP。请改用 FormHelper::unlockField() API。
    猜你喜欢
    • 2017-12-22
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 2014-11-28
    相关资源
    最近更新 更多