2011-07-12 24 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。 –