Symfony - 在同一页面上有几种形式 - >身份证问题

时间:2010-05-28 15:40:55

标签: php symfony1 symfony-1.4 symfony-forms

在同一页面上显示同一型号的多种形式时出现问题。 问题是,使用NameFormat,字段具有相同的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”属性,问题就解决了。有人知道怎么做吗?还是其他任何选择?

2 个答案:

答案 0 :(得分: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

这很难看,但我相信你能想出更干净的东西......

答案 1 :(得分: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' ) );
}