2013-04-04 12 views
5

Mam formularz z fieldsets:ZF2 jak zawijać zawartość w zestawie pól formularza?

$formConfig = array(
    'fieldsets' => array(
     ... 
    ); 
); 

$factory = new Zend\Form\Factory(); 
$form = $factory->createForm($formConfig); 
echo $this->form($form); 

To czyni coś takiego:

<form> 
    <fieldset> 
     <legend>Fieldset label</legend> 
     <label><span>Elem 1</span><input type="text" name="f1[el1]" /></label> 
     <label><span>Elem 2</span><input type="text" name="f1[el2]" /></label> 
     <label><span>Elem 3</span><input type="text" name="f1[el3]" /></label> 
    </fielset> 
</form> 

Problem polega na tym, że trzeba owinąć treść po legendzie:

<form> 
    <fieldset> 
     <legend>Fieldset label</legend> 
     <div class="wrapper"> 
      <label><span>Elem 1</span><input type="text" name="f1[el1]" /></label> 
      <label><span>Elem 2</span><input type="text" name="f1[el2]" /></label> 
      <label><span>Elem 3</span><input type="text" name="f1[el3]" /></label> 
     <div> 
    </fielset> 
</form> 

Jak mogę Zrób to?

Odpowiedz

14

Jeszcze raz musisz zrozumieć, że Zend\Form\Fieldset nie jest równy HTML <fieldset>! A Zend\Form\Fieldset to jedynie kolekcja Zend\Form\Element, która zazwyczaj reprezentuje jedną całość, a Ty możesz dostarczyć kilku jednostkom dane z jednego formularza.

Teraz, gdy chodzi o renderowanie formularza, pierwszą rzeczą, którą powinieneś poznać, jest kilka klas Zend\Form\View\Helper. Używasz pomocnika widoku form(), który automatycznie tłumaczy wszystkie Zend\Form\Element używając formRow() i wszystkich używając . Ale nie chcesz tego robić!

Jeśli chcesz uzyskać preferowane wyniki, będziesz musiał wykonać formularz samodzielnie. Coś takiego może być twój widok matrycy:

<?=$this->form()->openTag($form);?> 
    <fieldset> 
     <div class="wrapper"> 
      <?=$this->formRow($form->get('f1')->get('el1'));?> 
      <?=$this->formRow($form->get('f1')->get('el2'));?> 
      <?=$this->formRow($form->get('f1')->get('el3'));?> 
     </div> 
    </fieldset> 
<?=$this->form()->closeTag();?> 

Teraz, to już trochę komfortu w nim, jak można używać formRow(). Można również podzielić się każdego formularza rzędzie i iść bardzo Drobiazgowy sposób jak:

<label> 
    <span><?=$this->formLabel($form->get('f1')->get('el1'));?></span> 
    <?=$this->formInput($form->get('f1')->get('el1'));=> 
    <?=$this->formElementErrors($form->get('f1')->get('el1'));?> 
</label> 

nawet tam, formInput() nadal jest magia, która wywodzi się takie rzeczy jak formText(), formSelect(), formTextarea() itd .. itp ..

+2

+1 dla wyjaśnienia Fieldset. Co za okropny wybór nazywania ze strony społeczności ZF2. Dlaczego nie skorzystać z FieldCollection lub czegoś mniej niejednoznacznego i mylącego? – Xunnamius