Zend: Form Decorators

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Anoniem: 152426

Topicstarter
Hi mensen,

Ik ben me blind aan het staren op het volgende waar ik maar niet uitkom.
We hebben een html-design gekregen van een formulier welke ik moet verwerken in een Zend-applicatie.
Een onderdeel van dit formulier is het volgende (zo zou het dus moeten worden):

HTML:
1
2
3
4
5
6
7
<tr>
            <td width="30" height="75" valign="middle"><input type="checkbox" name="actievoorwaarden" value="Akkoord"></td>
            <td height="75" valign="middle">
              <span class="voorwaarden">Wanneer u deze inschrijving afrond, gaat u akkoord met de <a href="#">actievoorwaarden</a> en mogen wij u per e-mail en post op de hoogte houden over deze actie.</span>
            </td>
            <td width="120" height="75" valign="middle"><input type="submit" value="" class="aanmeldbtn"></td>
          </tr>


Het betreft dus het verplicht aanvinken van een checkbox met een stukje tekst en daarnaast een aanmeldbutton. Volgorde: checkbox-tekst-button

In mijn zendform heb ik de volgende elementen zitten:

PHP:
1
2
3
4
5
6
7
8
9
10
11
        $f ['userGeneralConditions'] = new Zend_Form_Element_Checkbox ( 'userGeneralConditions' );
        $f ['userGeneralConditions']->setLabel ( 'userGeneralConditions' )
            ->setAttrib ( 'size', 1 )
            ->setRequired ( true )
            ->setUncheckedValue('')
            ->addErrorMessage('validator_empty_userGeneralConditions'); 
            
        $f ['submit'] = new Zend_Form_Element_Submit ( 'submit' );
        $f ['submit']->setAttrib ( 'id', 'submitbutton' )
            ->setLabel('')
            ->setOptions(array('class'=>'aanmeldbtn'));


Standaard worden deze gerenderd in dt-dd maar de volgende code zet het formulier om in een tabel:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
// form decorators
        $this->setDecorators( array('FormElements',
            array('HtmlTag', array('tag' => 'table')),
            'Form'
        ));
        
        $this->setElementDecorators(array('ViewHelper',
            'Errors',
            array('decorator' => array('td' => 'HtmlTag'), 'options' => array('tag' => 'td')),
            array('Label', array('tag' => 'td')),
            array('decorator' => array('tr' => 'HtmlTag'), 'options' => array('tag' => 'tr')),
        ));



HTML:
1
2
3
4
5
6
<tr><td id="userGeneralConditions-label"><label for="userGeneralConditions" class="required">Algemene Voorwaarden:</label></td>
<td>
<input type="hidden" name="userGeneralConditions" value="" /><input type="checkbox" name="userGeneralConditions" id="userGeneralConditions" value="1" size="1" /></td></tr>
<tr><td id="submit-label"> </td>
<td>
<input type="submit" name="submit" id="submitbutton" value="" class="aanmeldbtn" /></td></tr>


Label en checkbox worden hier nog gescheiden in 2 td's (bovendien omgedraaid als gewenst) en de submitbutton staat in de volgende tr.
De volgorde van label en checkbox kan ik omdraaien door:

PHP:
1
$this->getElement('userGeneralConditions')->getDecorator('label')->setOption('placement', 'APPEND');


Echter blijven ze gescheiden in 2 td's.


Ik heb dus nodig:
1 <tr> met 2 <td>'s waarvan de eerste met gecombineerd checkbox-label en de tweede een submitbutton.
Dit alles met blijvend functioneren van error messages e.d.

Wie-o-wie kan mij een zetje geven?

Acties:
  • 0 Henk 'm!

  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
Decorators hebben een redelijk complexe constructie, om sommige simpele dingen als deze uit te voeren. Dit komt omdat je 2 elementen in 1 tr wilt wrappen.

Wat je zou kunnen doen is het form een viewscipt als decorator geven. En dan vervolgens het form custom opmaken. (Je kan de elementen eventueel wel door hun eigen decorators laten renderen).

Als je dit niet wilt dan zul je de 2 elementen op de een of andere manier moeten groeperen. Om die tr weg te krijgen.

In zf2 is de default eigenlijk een soort van viewscript variant, omdat decorators gewoon te complex zijn voor de taak die ze moeten doen.