在带注释的表单中显示相关项目

时间:2013-11-10 07:57:20

标签: php forms doctrine-orm zend-framework2

我有一个关于用实体填充我的表单的问题,形成多对多的关系。

首先是我的代码:

产品实体:

<?php
namespace My\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Zend\Form\Annotation;
use My\Entity\Brand;

/**
 * @ORM\Entity(repositoryClass="My\EntityRepository\Product")
 * @ORM\Table(name="product")
 * @Annotation\Hydrator("Zend\Stdlib\Hydrator\ArraySerializable")
 * @Annotation\Name("Product")
 */
class Product{

    /**
     * @ORM\id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     * @Annotation\Attributes({"type":"hidden"})
     */
    protected $id;

    /**
     * @ORM\ManyToMany(targetEntity="productGroup")
     * @Annotation\Type("Zend\Form\Element\Select")
     * @Annotation\Options({"label":"Productgroup: "})
     */
    protected $productGroups;


    /**
     * @ORM\Column(nullable=false)
     * @Annotation\Attributes({"type":"text"})
     * @Annotation\Options({"label":"Product name:"})
     */
    protected $productName;

    /**
     * @Annotation\Attributes({"type":"textarea"})
     * @Annotation\Options({"label":"Product description: "})
     * @ORM\Column
     */
    protected $description;

    public function __construct() {
        $this->memos = new ArrayCollection();
        $this->productGroups = new ArrayCollection();
    }

    /**
     * Sets the product tags
     * @param ArrayCollection $tags
     */
    public function setTags(\Doctrine\Common\Collections\ArrayCollection $tags) {
        $this->productGroups = $tags;
    }


    /**
     * This function unsets a product group
     */
    public function unsetProductsGroups() {
        unset($this->productGroups);
    }
}

然后我有我的行动

 public function newAction()
    {
        $em = $this->getEntityManager();

        $request = $this->getRequest();
        $product = new Product();
        $builder = new AnnotationBuilder($em);
        $form = $builder->createForm($product);


        if ($request->isPost() && $this->request->getPost()) {
            $repo = $this->getEntityManager()->getRepository('My\Entity\Product');
            $repo->addProduct($this->getRequest()->getPost());
            $this->flashMessenger()->addMessage('The product was added.');
            return $this->redirect()->toRoute('zfcadmin');
        } else {
            $config = $this->getModuleConfig();
            if (isset($config['my_form_extra'])) {
                foreach ($config['my_form_extra'] as $field) {
                    $form->add($field);
                }
            }

            $form->setHydrator(new DoctrineHydrator($em, 'My\Entity\Product'));
            $form->bind($product);
            return new ViewModel(array('form' => $form));
        }
    }

和我的观点

<div class="well">
    <?php
        $form = $this->form;
        $form->setAttribute('method','post');
        echo $this->form()->openTag($form);
        echo $this->formSelect($form->get('productGroups'));
        echo $this->form()->closeTag($form);
    ?>
</div>

这是一个空的选择框的输出。即使在我的编辑表单中,设置是相同的,但下拉列表是空的,肯定有相关的项目。

注意:我只显示了与此问题相关的信息。

我想知道如何在显示相关项目时解决这个问题。最好只使用注释。

感谢。

1 个答案:

答案 0 :(得分:1)

只显示了一个$ product实例,它是一个带有空备忘录和productGroup数组集合的新产品。表单将此未绑定的产品实例绑定到它,您的视图将获取绑定了未管理的产品实例的表单,因此没有显示选择项。