Symfony2:在另一个formType中覆盖一个formType引用addAction()方法的外键(多表单类型)

Symfony2: imbricate a formType in another formType refer to the foreign key for addAction() method (multiple form Type)

在我的Symfony项目中,我需要include/imbricate一个formType在另一个一个,参考外键。 事实上,当我在我的控制器中执行 addAction() 方法 时,我必须同时在两个表中添加我的数据,并且它必须与外键匹配并且我的两个表之间的关系。

这是我的第一个 class/entity:

class Zonestechnique
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="nom", type="string", length=150, nullable=false)
     */
    private $nom;

    //getters and setters

这个实体与外键所在的另一个实体链接,看我的第二个 entity/class:

class Conformiteszonestechnique
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="precision", type="text", nullable=true)
     */
    private $precision;
    /**
     * @var \Zonestechnique
     *
     * @ORM\ManyToOne(targetEntity="Zonestechnique")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="zonestechnique_id", referencedColumnName="id")
     * })
     */
    private $zonestechnique;

    /**
     * Constructor
     */
    public function __construct()
    {
        $this->zonestechnique = new \Doctrine\Common\Collections\ArrayCollection();
    }
    //getters and setters

如您所见,$zonestechnique 是外键。这些实体通过 ManyToOne 关系链接。

我需要将 ZonestechniqueType 表单包含到 ConformiteszonestechniqueType 中。

看看我的代码:

class ZonestechniqueType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('nom')
            ->add('localisation')
            ->add('commentaire')
            ->add('batiments')
            ->add('categorieszonestechnique')
        ;
    }

此表单生成器界面必须包含在 ConformiteszonestechniqueType:

class ConformiteszonestechniqueType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('precision')
            ->add('dateverification')
            ->add('typesetatsconformite')
            ->add('typesconformitezonestechnique')
            ->add('zonestechnique')
        ;
    }

所以我需要将 ZonestechniqueType formBuilder 包含到另一个 ConformiteszonestechniqueType 中,用于我的控制器中的 addAction() 方法。因此,当我在 ConformiteszonestechniqueType 中添加数据时,我在 ZonestechniqueType 中有数据,这样我两个实体之间的关系与我的数据库保持一致。

这是我的 controller:

public function addAction() {

        $em=$this->getDoctrine()->getManager();
        $zoneconformite = new Conformiteszonestechnique;
        $form = $this->createForm(new ConformiteszonestechniqueType(), $zoneconformite);
        $request = $this->getRequest();

        if ($request->isMethod('POST') | ($form->isValid()) ) {

                $form->bind($request);
                $zoneconformite = $form->getData();
                $em->persist($zoneconformite);
                $em->flush();

                return $this->redirect($this->generateUrl('myRoute'));

我该如何进行?这是正确的方法吗?

我想我必须使用 formType 中的集合字段。


更新

我将 ConformiteszonestechniqueType 更改为:

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('precision')
            ->add('dateverification')
            ->add('typesetatsconformite')
            ->add('typesconformitezonestechnique')
            ->add('zonestechnique', 'collection', array('type' =>new ZonestechniqueType() ) )
        ;
    }

我没有发生错误,但是当我在浏览器上显示表单时,我没有 zonestechnique 的表单。事实上,zonestechnique 的字段有一个名为 zonestechnique 的标签,但没有添加字段。

看看那里:http://symfony.com/doc/current/cookbook/form/form_collections.html

ZonestechniqueType存储在一个数组中,循环遍历即可。

{% for zonestechnique in form.zonestechniques %}
    {{ form_row(zonestechnique.nom) }}
{% endfor %}

我之前也遇到过同样的问题。我想出的解决方法是在我的实体 属性 中添加一个具有空白值的默认数组。在您的情况下,它是您的 "Conformiteszonestechnique"。尝试使用默认初始化值更新 $zonestechnique 属性,例如:

/**
 * @var \Zonestechnique
 *
 * @ORM\ManyToOne(targetEntity="Zonestechnique")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="zonestechnique_id", referencedColumnName="id")
 * })
 */
private $zonestechnique = array(1); // or whatever id or name you want to initialize

由您决定是在构造函数中初始化还是内联初始化,但只需确保数据类型符合您的预期。

您之所以没有出现此表单字段,是因为表单类型 "collection" 是动态的。意思是,您可以在客户端和服务器端的表单中添加或删除字段。与固定在一个表单域项上的其他典型表单类型不同。