2011-07-12 27 views
3

我在CakePHP中有一个包含两个实时搜索文本输入的表单。当用户选择结果时,它们中的每一个都会更新隐藏字段的值。该模式被称为Record,以及所涉及的属性是在使用安全组件和jQuery的CakePHP表单中禁用输入元素

  • budget_id
  • program_id
  • concept_id

我已经创建了以这种方式使用的表单助手形式

... 
<?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', 
); 
} 

看来,每当我改变CakePHP的生气来自Javascript的隐藏输入值,它将我发送到黑洞方法。根据文档,这没问题。

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

我一直在搜索几个网络资源,每个人都指向disabledFields选项。但它不适合我。

有什么建议吗?

谢谢!

UPDATE

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

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

我不明白为什么用Javascript改变选择没关系,但是改变一个隐藏的输入。

回答

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') 
    ) 
); 
+0

我已经用你提出的相同解决方案编辑了我的问题。另一方面,[关于安全组件的CakePHP文档](http://book.cakephp.org/view/1308/Usage)告诉''beforeFilter'是配置组件的正确位置。 – elitalon

+0

是的,对不起,我没有看到这个函数的名字,我以为你是直接在某个动作中做的。 :) – entropid

5

更简单的方法来解决了这个,我刚刚发现会一直增加'secure' => false您输入的属性阵列。这可以防止将它们添加到安全字段列表中。

+0

即使使用'secure'=> FormHelper :: SECURE_SKIP,似乎也不能与2.x一起使用。改用FormHelper :: unlockField()API。 –