Forms ZF2-绑定嵌套字段集/集合

Forms ZF2-绑定嵌套字段集/集合,forms,zend-framework2,fieldset,Forms,Zend Framework2,Fieldset,我有两个实体(元产品和选项),它们与实体规范有多对多单向关系 元产品和期权之间的关系是一对多的 元产品的字段集和表单的代码如下: MetaproductFieldset.php namespace Bundle\Fieldset; class MetaproductFieldset extends EntityUsingFieldset implements InputFilterProviderInterface{ ... public function __construct(Ob

我有两个实体(元产品和选项),它们与实体规范有多对多单向关系

元产品和期权之间的关系是一对多的

元产品的字段集和表单的代码如下:

MetaproductFieldset.php

namespace Bundle\Fieldset;

class MetaproductFieldset extends EntityUsingFieldset implements InputFilterProviderInterface{
...
    public function __construct(ObjectManager $objectManager)
    {
        $this->add(array(
            'type' => 'Zend\Form\Element\Collection',
            'name' => 'options',
            'options' => array(
                'label' => 'Options',
                'count' => 1,
                'allow_add' => true,
                'allow_remove' => true,
                'should_create_template' => true,
                'target_element' => new OptionFieldset($objectManager),
            ),
            'attributes' => array(
                'id' => 'options',
            ),
        ));

        $this->add(array(
            'type' => 'Zend\Form\Element\Collection',
            'name' => 'specifications',
            'options' => array(
                'label' => 'Specifications',
                'count' => 1,
                'allow_add' => true,
                'allow_remove' => true,
                'should_create_template' => true,
                'target_element' => new SpecificationFieldset($objectManager),
            ),
            'attributes' => array(
                'id' => 'specifications',
            ),
        ));
    namespace Bundle\Fieldset;

    class OptionFieldset extends EntityUsingFieldset implements InputFilterProviderInterface{

        public function __construct(ObjectManager $objectManager)
        {

           $this->setObjectManager($objectManager);
           parent::__construct('option');

           $this->setHydrator(new DoctrineHydrator($objectManager))->setObject(new \Bundle\Entity\Option());
 $this->add(array(
            'type' => 'Zend\Form\Element\Collection',
            'name' => 'specifications',
            'options' => array(
                'label' => 'Specifications',
                'count' => 1,
                'allow_add' => true,
                'allow_remove' => true,
                'should_create_template' => true,
                'target_element' => new SpecificationFieldset($objectManager),
            ),
            'attributes' => array(
                'id' => 'specifications',
            ),
        ));
namespace Bundle\Fieldset;

use Doctrine\Common\Persistence\ObjectManager;
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
use Zend\InputFilter\InputFilterProviderInterface;

class SpecificationFieldset extends EntityUsingFieldset implements InputFilterProviderInterface{


    public function __construct(ObjectManager $objectManager)
    {
        $this->setObjectManager($objectManager);
        parent::__construct('specification');

        $this->setHydrator(new DoctrineHydrator($objectManager))->setObject(new \Bundle\Entity\Specification());

        $this->add(array(
            'type' => 'Zend\Form\Element\Hidden',
            'name' => 'id'
        ));

        $this->add(array(
            'type'    => 'DoctrineModule\Form\Element\ObjectSelect',
            'name'    => 'label',
            'options' => array(
                'label'          => 'Label',

                'object_manager' => $objectManager,
                'target_class'   => 'Bundle\Entity\Label',
                'property'       => 'value',
                'empty_option'   => '--- please choose ---'
            ),
        ));

        $this->add(array(
            'type'    => 'Zend\Form\Element\Text',
            'name'    => 'value',
            'options' => array(
                'label' => 'Value'
            )
        ));


    }   
OptionFieldset.php

namespace Bundle\Fieldset;

class MetaproductFieldset extends EntityUsingFieldset implements InputFilterProviderInterface{
...
    public function __construct(ObjectManager $objectManager)
    {
        $this->add(array(
            'type' => 'Zend\Form\Element\Collection',
            'name' => 'options',
            'options' => array(
                'label' => 'Options',
                'count' => 1,
                'allow_add' => true,
                'allow_remove' => true,
                'should_create_template' => true,
                'target_element' => new OptionFieldset($objectManager),
            ),
            'attributes' => array(
                'id' => 'options',
            ),
        ));

        $this->add(array(
            'type' => 'Zend\Form\Element\Collection',
            'name' => 'specifications',
            'options' => array(
                'label' => 'Specifications',
                'count' => 1,
                'allow_add' => true,
                'allow_remove' => true,
                'should_create_template' => true,
                'target_element' => new SpecificationFieldset($objectManager),
            ),
            'attributes' => array(
                'id' => 'specifications',
            ),
        ));
    namespace Bundle\Fieldset;

    class OptionFieldset extends EntityUsingFieldset implements InputFilterProviderInterface{

        public function __construct(ObjectManager $objectManager)
        {

           $this->setObjectManager($objectManager);
           parent::__construct('option');

           $this->setHydrator(new DoctrineHydrator($objectManager))->setObject(new \Bundle\Entity\Option());
 $this->add(array(
            'type' => 'Zend\Form\Element\Collection',
            'name' => 'specifications',
            'options' => array(
                'label' => 'Specifications',
                'count' => 1,
                'allow_add' => true,
                'allow_remove' => true,
                'should_create_template' => true,
                'target_element' => new SpecificationFieldset($objectManager),
            ),
            'attributes' => array(
                'id' => 'specifications',
            ),
        ));
namespace Bundle\Fieldset;

use Doctrine\Common\Persistence\ObjectManager;
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
use Zend\InputFilter\InputFilterProviderInterface;

class SpecificationFieldset extends EntityUsingFieldset implements InputFilterProviderInterface{


    public function __construct(ObjectManager $objectManager)
    {
        $this->setObjectManager($objectManager);
        parent::__construct('specification');

        $this->setHydrator(new DoctrineHydrator($objectManager))->setObject(new \Bundle\Entity\Specification());

        $this->add(array(
            'type' => 'Zend\Form\Element\Hidden',
            'name' => 'id'
        ));

        $this->add(array(
            'type'    => 'DoctrineModule\Form\Element\ObjectSelect',
            'name'    => 'label',
            'options' => array(
                'label'          => 'Label',

                'object_manager' => $objectManager,
                'target_class'   => 'Bundle\Entity\Label',
                'property'       => 'value',
                'empty_option'   => '--- please choose ---'
            ),
        ));

        $this->add(array(
            'type'    => 'Zend\Form\Element\Text',
            'name'    => 'value',
            'options' => array(
                'label' => 'Value'
            )
        ));


    }   
SpecificationFieldset.php

namespace Bundle\Fieldset;

class MetaproductFieldset extends EntityUsingFieldset implements InputFilterProviderInterface{
...
    public function __construct(ObjectManager $objectManager)
    {
        $this->add(array(
            'type' => 'Zend\Form\Element\Collection',
            'name' => 'options',
            'options' => array(
                'label' => 'Options',
                'count' => 1,
                'allow_add' => true,
                'allow_remove' => true,
                'should_create_template' => true,
                'target_element' => new OptionFieldset($objectManager),
            ),
            'attributes' => array(
                'id' => 'options',
            ),
        ));

        $this->add(array(
            'type' => 'Zend\Form\Element\Collection',
            'name' => 'specifications',
            'options' => array(
                'label' => 'Specifications',
                'count' => 1,
                'allow_add' => true,
                'allow_remove' => true,
                'should_create_template' => true,
                'target_element' => new SpecificationFieldset($objectManager),
            ),
            'attributes' => array(
                'id' => 'specifications',
            ),
        ));
    namespace Bundle\Fieldset;

    class OptionFieldset extends EntityUsingFieldset implements InputFilterProviderInterface{

        public function __construct(ObjectManager $objectManager)
        {

           $this->setObjectManager($objectManager);
           parent::__construct('option');

           $this->setHydrator(new DoctrineHydrator($objectManager))->setObject(new \Bundle\Entity\Option());
 $this->add(array(
            'type' => 'Zend\Form\Element\Collection',
            'name' => 'specifications',
            'options' => array(
                'label' => 'Specifications',
                'count' => 1,
                'allow_add' => true,
                'allow_remove' => true,
                'should_create_template' => true,
                'target_element' => new SpecificationFieldset($objectManager),
            ),
            'attributes' => array(
                'id' => 'specifications',
            ),
        ));
namespace Bundle\Fieldset;

use Doctrine\Common\Persistence\ObjectManager;
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as DoctrineHydrator;
use Zend\InputFilter\InputFilterProviderInterface;

class SpecificationFieldset extends EntityUsingFieldset implements InputFilterProviderInterface{


    public function __construct(ObjectManager $objectManager)
    {
        $this->setObjectManager($objectManager);
        parent::__construct('specification');

        $this->setHydrator(new DoctrineHydrator($objectManager))->setObject(new \Bundle\Entity\Specification());

        $this->add(array(
            'type' => 'Zend\Form\Element\Hidden',
            'name' => 'id'
        ));

        $this->add(array(
            'type'    => 'DoctrineModule\Form\Element\ObjectSelect',
            'name'    => 'label',
            'options' => array(
                'label'          => 'Label',

                'object_manager' => $objectManager,
                'target_class'   => 'Bundle\Entity\Label',
                'property'       => 'value',
                'empty_option'   => '--- please choose ---'
            ),
        ));

        $this->add(array(
            'type'    => 'Zend\Form\Element\Text',
            'name'    => 'value',
            'options' => array(
                'label' => 'Value'
            )
        ));


    }   
Metaproduct.php

namespace Bundle\Form;
...
class Metaproduct extends Form {

public function __construct(ObjectManager $objectManager){

     parent::__construct('metaproduct-form');
    $this->setHydrator(new DoctrineHydrator($objectManager));
    $mpFieldset = new MetaproductFieldset($objectManager);
    $mpFieldset->setUseAsBaseFieldset(true);
...
但当我尝试在该窗体上打印绑定对象时,会出现以下期望:

文件

信息

Zend\Form\Fieldset::setObject expects an object argument; received "Array"
痕迹


请参阅本期:

嵌套集合和字段集中的问题


事实上,嵌套字段集和集合存在问题。Tnx