2010-05-28 34 views
1

我在同一頁面上顯示同一模型的幾種表單時遇到問題。 的問題是,與NameFormat,該字段具有相同的ID:Symfony - 在同一頁上顯示多個表單 - > ID問題

$this->widgetSchema->setNameFormat('display[%s]'); 

將顯示

<form class="update_display_form" id="update_display_0" action="/iperf/web/frontend_dev.php/update_display" method="post"> 
    <input type="checkbox" name="display[displayed]" checked="checked" id="display_displayed" /> 
    <label for="display_displayed">test</label> 
</form> 
<form class="update_display_form" id="update_display_1" action="/iperf/web/frontend_dev.php/update_display" method="post"> 
    <input type="checkbox" name="display[displayed]" checked="checked" id="display_displayed" /> 
    <label for="display_displayed">truc</label> 
</form> 

而且如果您單擊第二個標籤,它會激活第一個複選框 所以我想我可以使用對象ID來使它們獨一無二:

$this->widgetSchema->setNameFormat('display'.$this->getObject()->getId().'[%s]'); 

但是然後我無法處理請求,因爲我不知道參數的名稱。

我發現最好的辦法是設置一個ID:

$this->widgetSchema['displayed']->setAttributes(array("id" => "display".$this->getObject()->getId())); 

但後來我完全鬆散的標籤和複選框之間的連接。

如果我可以更改標籤的「for」屬性,問題就會解決。有人知道如何做到這一點嗎?或者有其他選擇嗎?

+0

我可能會創建一個基於模型的新表單,然後給他們不同的名稱格式。 – Tom 2010-05-28 17:41:39

+0

我不能這樣做,因爲頁面上的表單數量不固定。雖然感謝 – Julien 2010-05-28 20:22:26

回答

3

這裏有一個想法......從你的行動推到窗體類的變量設置動態不同的名稱格式爲:

在你的行動:

$this->form_A = new displayForm(array(),array('form_id' = 'A')); // pass a form id 
$this->form_B = new displayForm(array(),array('form_id' = 'B')); 
$this->form_C = new displayForm(array(),array('form_id' = 'C')); 

在你的表單類:

$form_id = $this->getOption('form_id'); // get the passed value 
$this->widgetSchema->setNameFormat('display'.$form_id.'[%s]'); // stick it into the name 

這是醜陋的,但我敢肯定,你可以想出一些事情g清潔劑...

+0

嗯,這很有趣,謝謝。但是當我處理表單時,如何獲取已提交的表單ID?目前我使用$ request-> getParameter('display');但如果名稱是動態分配的......我可以這樣做: letter_array = array('A','B',...); while(!$ request-> getParameter('display'.letter_array [$ i])){$ i ++}但這開始嚴重醜陋不? – Julien 2010-05-29 13:00:01

+0

要獲取已提交的表單標識,您可以將純粹在操作中的「form_id」變量鏈接到提交的POST請求,也可以添加一個隱藏的輸入字段,通過表單類提交所需的任何內容。 ...我認爲有一些選擇。 – Tom 2010-05-29 15:11:42

+0

我還沒有看到您的評論,這是我能想到的最乾淨的方式。謝謝 – Julien 2010-06-09 19:08:19

2

相互衝突的表格之間的複選框/標籤交互是由標籤的ID /屬性而不是它們的名稱屬性引起的。

因此,不需要修改表單的窗口小部件名稱格式,因此從請求對象讀取提交的數據時有問題(通過將請求鍵傳遞爲表單url參數/隱藏輸入或通過循環佈局中創建的所有表單名稱組合每個表格並找到匹配的表格)。

sfForm類具有sfWidgetFormSchema :: setIdFormat()方法。

// Creating form instances 

$formA = new sfForm(); 
$formA->getWidgetSchema()->setIdFormat('%s1'); 
$formA->getWidgetSchema()->setNameFormat('display'); 
... // configure the form 

$formB = new sfForm(); 
$formB->getWidgetSchema()->setIdFormat('%s2'); 
$formB->getWidgetSchema()->setNameFormat('display'); 
... // configure the form 

$formC = new sfForm(); 
$formC->getWidgetSchema()->setIdFormat('%s3'); 
$formC->getWidgetSchema()->setNameFormat('display'); 
... // configure the form 


// Processing a request data 

$form = new sfForm(); 
... // configure the form 
$_formNameRequestKey = $form->getName(); 
if($request->hasParameter($_formNameRequestKey)) { 
    $form->bind($request->getParameter($_formNameRequestKey)); 
} 

... or just ... 
if($request->hasParameter('display')) { 
    $form->bind($request->getParameter('display')); 
} 
相關問題