【问题标题】:Symfony2: imbricate a formType in another formType refer to the foreign key for addAction() method (multiple form Type)Symfony2:将一个formType覆盖在另一个formType中引用addAction()方法的外键(多种form Type)
【发布时间】:2015-02-12 10:17:45
【问题描述】:

在我的 Symfony 项目中,我需要在另一个 one 中包含/覆盖一个 formType,请参阅 外键。 确实,当我在控制器中执行addAction() 方法 时,我必须同时将我的数据添加到两个表中,并且它必须与外键和我的两个表之间的关系匹配表格。

这是我的第一个班级/实体:

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

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

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 是外键。这些实体通过多对一关系链接。

我需要将 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 的标签,但没有添加字段。

【问题讨论】:

    标签: php forms symfony doctrine-orm controller


    【解决方案1】:

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

    ZonestechniqueType 存储一个数组,循环遍历。

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

    【讨论】:

      【解决方案2】:

      我以前也有同样的问题。我想出的解决方法是在我的实体属性中添加一个带有空白值的默认数组。在您的情况下,它是您的“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
      

      您是在构造函数中初始化它还是在内联中初始化它取决于您,但只需确保数据类型与您期望的匹配即可。

      您之所以没有显示此表单域,是因为表单类型“集合”是动态的。这意味着,您可以在客户端和服务器端的表单中添加或删除字段。与其他固定为一个表单域项的典型表单类型不同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-17
        相关资源
        最近更新 更多