Zend Framework 2 マニュアル (こちら) に基づいて、次のようなフォームを作成しました。
class ParentForm extends Form
{
public function init()
{
$this->setName('parent_form')
->setAttribute('method', 'post')
->setHydrator(new ClassMethods(true))
->setInputFilter(new InputFilter());
$this->add(array(
'type' => 'Application\Form\Fieldset\Parent',
'name' => 'parent',
'options' => array(
'label' => 'Parent',
'use_as_base_fieldset' => true
)
));
$this->add(array(
'type' => 'Zend\Form\Element\Csrf',
'name' => 'csrf'
));
$this->add(array(
'name' => 'submit',
'attributes' => array(
'type' => 'submit',
'value' => 'Send'
)
));
}
}
そして「親」フィールドセット:
class ParentFieldset extends Fieldset
{
protected $count = 2;
public function init()
{
$this->setName('parent_fieldset')
->setHydrator(new ClassMethodsHydrator(false))
->setObject(new Model\Parent());
$this->add(array('type' => 'Element\MyField'));
$this->add(array(
'type' => 'collection',
'name' => 'children',
'options' => array(
'label' => 'Children',
'count' => $this->count,
'should_create_template' => true,
'allow_add' => true,
'target_element' => array(
'type' => 'Application\Form\Fieldset\Child',
'name' => 'child',
'options' => array(
'label' => child',
),
),
)
));
}
public function setCount($count)
{
$this->count = max($count, 2);
}
}
これは、フォームから取得したデータで親オブジェクトを水和するのに最適です。復元オブジェクトの var_dump は次のようになります。
object(Parent)
public myField => foo
public children =>
array =>
0 => object(Child)
public field1 => value1
public field2 => value2
....
1 => object(Child)
.....
2 => object(Child)
.....
しかし、データベースからハイドレートされた場合 (編集目的で)、この多次元フォームに上記のオブジェクトを入力する方法がわかりません。どうやってやるの?
注: フォームの count プロパティは、オブジェクトと同じ数の子に設定されます。