1

在同一页面上显示同一模型的多种形式时遇到问题。问题是使用 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”属性,问题就会得到解决。有人知道该怎么做吗?或任何其他选择?

4

2 回答 2

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

这很丑,但我相信你可以想出一些更清洁的东西......

于 2010-05-29T12:22:17.877 回答
2

冲突的表单间复选框/标签交互是由标签的 id/for 属性引起的,而不是由它们的名称属性引起的。

因此,无需修改表单的小部件名称格式,从而在从请求对象读取提交的数据时遇到问题(通过将请求键作为表单 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' ) );
}
于 2011-03-28T21:04:20.780 回答