web-dev-qa-db-fra.com

Création dynamique d'un champ JForm multidimensionnel

Modèle d'article

protected function preprocessForm(JForm $form, $data, $group = 'examplegroup')
{
    foreach ($data as $i => $item) {
        $field = new \SimpleXMLElement('<field />');
        $field->addAttribute('name', 'sample[' . $i . ']');
        $field->addAttribute('class', 'input-mini');
        $field->addAttribute('type', 'number');
        $form->setField($field, 'data');
        $form->setValue('sample[' . $i . ']', 'examplegroup', $item->fieldname);
        ...
    }
    ...
}

Disposition

<?php foreach ($this->items->data as $i => $item) : ?>
<?php echo $this->form->getInput('sample[' . $i . ], 'examplegroup'); ?>

Sortie

<input type="number" name="jform[examplegroup][sample[0]]" value="6" class="input-mini">

Comment puis-je obtenir ce genre de nom name="jform[examplegroup][sample][0]"? Le formulaire doit être généré dynamiquement et non en écrivant le nom statique dans le code.

3
Mike

J'ai trouvé une solution qui semble fonctionner.

Créer le formulaire sans la classe de contrôle jform habituelle comme ceci:

// $form = $this->loadForm('my_comp.examplegroup', 'examplegroup', array('control' => 'jform', 'load_data' => $loadData));
$form = $this->loadForm('my_comp.examplegroup', 'examplegroup', array('control' => '', 'load_data' => $loadData));

Ensuite, créez les champs dynamiquement avec le nom complet:

protected function preprocessForm(JForm $form, $data, $group = 'examplegroup')
{
$field = new \SimpleXMLElement('<field />');
$field->addAttribute('name', 'jform[' . $i . '][sample]');
$form->setValue('jform[' . $i . '][sample]', '', $item['sample']);
...
1
Mike