web-dev-qa-db-ja.com

多次元JFormフィールドを動的に作成する

アイテムモデル

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);
        ...
    }
    ...
}

レイアウト

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

出力

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

このような名前を取得するにはどうすればよいですかname="jform[examplegroup][sample][0]"?フォームは動的に生成する必要があり、コードにstaticという名前を書き込むことではありません。

3
Mike

機能するように縫い合わせるソリューションを見つけました。

次のような通常のjformコントロールクラスなしでフォームを作成します。

// $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));

次に、フィールド全体を動的に作成します。

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