Symfony - Несколько бланков на одной странице - PullRequest
1 голос
/ 28 мая 2010

У меня проблема при отображении нескольких форм одной модели на одной странице. Проблема в том, что с NameFormat поля имеют одинаковый идентификатор:

$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>

И Если вы нажмете на второй ярлык, он активирует первый флажок Поэтому я подумал, что могу использовать идентификатор объекта, чтобы сделать их уникальными:

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

Но тогда я не могу обработать запрос, так как не знаю названия параметров.

Лучший вариант, который я нашел, это установить ID:

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

но тогда я полностью теряю связи между ярлыком и флажком.

Проблема была бы решена, если бы я мог изменить атрибут for для метки. Кто-нибудь знает, как это сделать? Или любой другой вариант?

Ответы [ 2 ]

3 голосов
/ 29 мая 2010

Вот идея ... выдвиньте переменную в класс формы из вашего действия для динамической установки другого формата имени:

В вашем действии:

$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

Это ужасно, но я уверен, что вы можете придумать что-нибудь более чистое ...

2 голосов
/ 29 марта 2011

Противоречивые взаимодействия между флажками и метками вызваны тегами 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' ) );
}
...