Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
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/) :
[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';
[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) :
[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 ? :
[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 ![]()
Hors ligne
Solution (trouvé sur : http://paveldubinin.com/2011/04/real-ta … zend-form/) :
Ajouter une classe "decorator" : /library/Form/Decorator/SimpleTable.php
[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
[lang=php]
$form->setDecorators(array(
'FormElements',
array('HtmlTag', array('tag' => 'table')),
'Form'
));Par :
[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
Pages: 1