2016-09-13 17 views
2

我想在CakePHP中創建一個表單,同時激活SecurityComponent。到目前爲止好,現在我想添加自定義input元素,我不能使用FormHelper生成。但是,我確實將這些字段包含在安全和驗證檢查中。如何使用SecurityComponent在CakePHP 2中創建手動輸入?

主要問題是我無法在其標籤外呈現單選按鈕。所以我自己像這樣渲染它們:

<div class="radio radio-inline"> 
    <input id="genderMALE" type="radio" name="data[User][gender]" value="MALE"/> 
    <label for="genderMALE">Male</label> 
</div> 
<div class="radio radio-inline"> 
    <input id="genderFEMALE" type="radio" name="data[User][gender]" value="FEMALE"/> 
    <label for="genderFEMALE">Female</label> 
</div> 

它本身完美地工作。然而FormHelper沒有注意到他們,所以SecurityComponent註冊這是篡改形式。阻止我的請求。

我試圖使用FormHelper生成輸入,但無線電支持是有限的。 format選項在此處不起作用,因爲:

單選按鈕不能使用這些設置控制輸入和標籤元素的順序。 - Cookbook

下一步,我找不到任何辦法來渲染一個普通的分離單選按鈕。我發現接受input的唯一方法是通過忽略它在SecurityComponent

什麼是Cake的方法來解決這個問題?

更新14-09 9時16分
我當前修復/黑客將是普通的HTML創建自定義單選按鈕,如上所示。然後將這些無線電輸入的值鏈接到使用FormHelper創建的輸入字段。使用CSS我可以隱藏這個輸入,允許它被JavaScript改變,而不是使用type="hidden"

使用此方法可能會發生任何危險/問題嗎?

旁註:最後這是一個造型問題。然而我不得不使用Bootstrap,只剩下2天時間來完成我的任務。而且我不想走寫自定義CSS/JS的路徑來實現這個功能。

回答

0

在使用hack解決方案獲得內容的時候,我偶然發現了FormHelper::$fields字段。此字段會跟蹤使用FormHelper創建的所有輸入,並在稍後由SecurityComponent用於檢查表單是否已被篡改。

的解決方案確實需要一些額外的工作,因爲你需要執行以下步驟:

  1. 添加自定義表單元素從以前的中fields陣列
  2. 還原值提交(如果重定向到形成)
  3. 添加默認的選項,因此現場將不會從後數據可以省略

工作CTP

<div class="radio radio-inline"> 
    <input id="genderMALE" type="radio" name="data[User][gender]" value="MALE" 
     <?= $this->request->data('User.gender') == 'MALE' ? 'checked' : ''?> /> 
    <label for="genderMALE">Male</label> 
</div> 
<div class="radio radio-inline"> 
    <input id="genderFEMALE" type="radio" name="data[User][gender]" value="FEMALE" 
     <?= $this->request->data('User.gender') == 'FEMALE' ? 'checked' : ''?> /> 
    <label for="genderFEMALE">Female</label> 
</div> 
<input type="radio" name="data[User][gender]" value="" class="hidden" 
    <?= $this->request->data('User.gender') ? '' : 'checked'?> /> 
<?php $this->Form->fields[] = 'User.gender' ?> 

這遠非漂亮,但我認爲它接近蛋糕本身的內部。可能希望創建一個幫助器,而不是每次手動實現輸入。