Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 09-08-2011 17:54:47

niusha
Nouveau membre
Date d'inscription: 13-05-2011
Messages: 4

[Zend_Form][1.11] Afficher les header dans un form tableau

Bonjour,

Voici j'ai un Zend_Form rempli à partir des informations d'un tableau (exemple tiré de ce site : http://davidcaylor.com/2008/03/24/build … zend_form/) :


Code:

[lang=php]
$array[0]['id']    = 1005;
$array[0]['title'] = 'Mr.';
$array[0]['first'] = 'Ted';
$array[0]['last']  = 'Smith';
$array[1]['id']    = 1006;
$array[1]['title'] = 'Mr.';
$array[1]['first'] = 'Mark';
$array[1]['last']  = 'Jones';
$array[2]['id']    = 1007;
$array[2]['title'] = 'Ms.';
$array[2]['first'] = 'Sally';
$array[2]['last']  = 'Adams';

Code:

[lang=php]
$form = new Zend_Form();
$form->setMethod('post')
     ->setAttrib('id', 'contactForm');
$subForm = new Zend_Form_SubForm();

foreach($array as $rownum => $row){
  $id = $row['id'];
  $rowForm = new Zend_Form_SubForm();
  foreach($row as $key => $value){
    if($key == 'id') continue;
    $rowForm->addElement(
      'text',
      $key,
      array(
        'value' => $value,
      )
    );
  }
  $rowForm->setElementDecorators(array(
    'ViewHelper',
    'Errors',
    array('HtmlTag', array('tag' => 'td')),
  ));
  $subForm->addSubForm($rowForm, $id);
}

$subForm->setSubFormDecorators(array(
  'FormElements',
  array('HtmlTag', array('tag'=>'tr')),
));

$form->addSubForm($subForm, 'contacts');

$form->setSubFormDecorators(array(
  'FormElements',
  array('HtmlTag', array('tag' => 'tbody')),
));

$form->setDecorators(array(
    'FormElements',
    array('HtmlTag', array('tag' => 'table')),
    'Form'
));

$form->addElement(
  'submit', 'submit', array('label' => 'Submit'));

$form->submit->setDecorators(array(
    array(
        'decorator' => 'ViewHelper',
        'options' => array('helper' => 'formSubmit')),
    array(
        'decorator' => array('td' => 'HtmlTag'),
        'options' => array('tag' => 'td', 'colspan' => 4)
        ),
    array(
        'decorator' => array('tr' => 'HtmlTag'),
        'options' => array('tag' => 'tr')),
));

Voici ce qui est créé en HTML (pour l'exemple) :

Code:

[lang=html]<table>
    // Valeur associées
    <tr><td> Valeur 1.1 </td>
          <td> Valeur 1.2 </td>
          ....
    </tr>
    <tr><td> Valeur 2.1 </td>
          <td> Valeur 2.2 </td>
           .....
    </tr>
</table>

Cet exemple affiche bien un formulaire avec un sous formulaire pour chaque ligne du tableau.

Le problème étant : comment ajouter la première ligne afin d'afficher les headers ? :

Code:

[lang=html]     // Libéllés des colonnes du tableau
     <tr><th>Intitulé 1</th>
           <th>Intitulé 2</th>
           ...
    </tr>
    // Valeur associées
    <tr><td> Valeur 1.1 </td>
          <td> Valeur 1.2 </td>
          ....
    </tr>
    <tr><td> Valeur 2.1 </td>
          <td> Valeur 2.2 </td>
           .....
    </tr>

Merci d'avance pour toute réponse smile

Hors ligne

 

#2 10-08-2011 10:08:22

niusha
Nouveau membre
Date d'inscription: 13-05-2011
Messages: 4

Re: [Zend_Form][1.11] Afficher les header dans un form tableau

Solution (trouvé sur : http://paveldubinin.com/2011/04/real-ta … zend-form/) :

Ajouter une classe "decorator"  :  /library/Form/Decorator/SimpleTable.php

Code:

[lang=php]
<?php

class Form_Decorator_SimpleTable extends Zend_Form_Decorator_Abstract
{
    public function render ($content)
    {
        $element = $this->getElement();
        $view    = $element->getView();
        if (null === $view) {
            return $content;
        }
        
        $columns = $this->getOption('columns');
        $class = $this->getOption('class');
        $id = $this->getOption('id');

        $columns_html = '';
        foreach ($columns as $current_column_name) {
            $columns_html .= '<th>'.$current_column_name.'</th>';
        }

        $result = '
            <table class="'.$class.'" id="'.$id.'">
                <thead>
                    <tr>
                        '.$columns_html.'
                    </tr>
                </thead>
                <tbody>
                    '.$content.'
                </tbody>
            </table>
        ';

        return $result;
    }
}

Et remplacer la ligne

Code:

[lang=php]

$form->setDecorators(array(
    'FormElements',
    array('HtmlTag', array('tag' => 'table')),
    'Form'
));

Par :

Code:

[lang=php]

$form->addPrefixPath('Form_Decorator', 'Form/Decorator/', 'Decorator');

$form->setDecorators(array(
                'FormElements',
                array(    'SimpleTable',
                        array('columns' => array(
                            '', 'title', 'firstname', 'lastname'))), // '' pour la colomne id afin de ne rien afficher
                'Form'));

Et le tour est joué !

Dernière modification par niusha (10-08-2011 10:19:25)

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages