2010-05-28 112 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')); 
}