简体   繁体   English

嵌入形式中的Symfony [2.8.9] EntityType未选择值

[英]Symfony [2.8.9] EntityType within embedded form not selecting value

I have an Organisation entity referencing an embedded form containing a Country entity. 我有一个Organization实体,它引用一个包含Country实体的嵌入式表单。 The form saves without issue, but the Country EntityType field does not correctly pick up the value upon editing, and as such the first option in the dropdown is always selected rather than the correct option. 表单保存没有问题,但是“国家EntityType”字段在编辑时无法正确获取值,因此,始终选择下拉列表中的第一个选项,而不是正确的选项。

The OrganisationType form: OrganisationType表单:

<?php

namespace AppBundle\Form\Type\Meta;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;

class OrganisationType extends AbstractType
{

    public function __construct()
    {

    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title', new TitleType(),
                array('required' => true, 'label' => false))
            ->add('country', new CountryType(), array('label' => false))
            ->add('location', 'text',
                array('required' => false, 'label' => 'City'));    
    }

    public function getName()
    {
        return 'organisation';
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Organisation',
            'csrf_protection' => true,
            'csrf_field_name' => '_token',
            // a unique key to help generate the secret token
            'intention' => 'organisation',
            'cascade_validation' => true
        ));
    }

}

The CountryType form: CountryType表单:

<?php

namespace AppBundle\Form\Type\Meta;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Doctrine\ORM\EntityRepository;

class CountryType extends AbstractType
{

    public function __construct()
    {

    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('id', EntityType::class, array(
                'label' => 'Country',
                'class' => 'AppBundle:Country',
                'choice_label' => 'name',
                'placeholder' => 'Choose an option...',
                'query_builder' => function (EntityRepository $repository) {
                    return $repository->createQueryBuilder('c')->orderBy('c.name', 'ASC');
                }
            ));

    }

    public function getName()
    {
        return 'country';
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Country'
        ));
    }

}

Organisation Entity: 组织实体:

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Gedmo\Mapping\Annotation as Gedmo;
use AppBundle\Model\OrganisationModel;

/**
 * Organisation
 *
 * @ORM\Table(name="organisation", indexes={@ORM\Index(name="fk_meta_org_country_idx", columns={"country_id"}), @ORM\Index(name="fk_meta_org_subdivision_idx", columns={"country_subdivision_id"}), @ORM\Index(name="fk_meta_org_user_entered_idx", columns={"entered_by_user_id"}), @ORM\Index(name="fk_meta_org_user_updated_idx", columns={"updated_by_user_id"}), @ORM\Index(name="fk_meta_org_title_idx", columns={"title_id"})})
 * @ORM\Entity(repositoryClass="AppBundle\Entity\OrganisationRepository")
 */
class Organisation extends OrganisationModel
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

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

    /**
     * @var boolean
     *
     * @ORM\Column(name="hidden", type="boolean", nullable=false)
     */
    private $hidden;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date_entered", type="datetime", nullable=false)
     * @Gedmo\Timestampable(on="create")
     */
    private $dateEntered;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date_updated", type="datetime", nullable=false)
     * @Gedmo\Timestampable(on="update")
     */
    private $dateUpdated;

    /**
     * @var \AppBundle\Entity\Country
     *
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Country")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="country_id", referencedColumnName="id")
     * })
     */
    private $country;

    /**
     * @var \AppBundle\Entity\CountrySubdivision
     *
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\CountrySubdivision")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="country_subdivision_id", referencedColumnName="id")
     * })
     */
    private $countrySubdivision;

    /**
     * @var \AppBundle\Entity\Title
     *
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Title", cascade="persist")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="title_id", referencedColumnName="id")
     * })
     * @Assert\Type(type="AppBundle\Entity\Title")
     * @Assert\Valid()
     */
    private $title;

    /**
     * @var \AppBundle\Entity\User
     *
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\User")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="entered_by_user_id", referencedColumnName="id")
     * })
     */
    private $enteredByUser;

    /**
     * @var \AppBundle\Entity\User
     *
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\User")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="updated_by_user_id", referencedColumnName="id")
     * })
     */
    private $updatedByUser;

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set location
     *
     * @param string $location
     * @return Organisation
     */
    public function setLocation($location)
    {
        $this->location = $location;

        return $this;
    }

    /**
     * Get location
     *
     * @return string 
     */
    public function getLocation()
    {
        return $this->location;
    }

    /**
     * Set hidden
     *
     * @param boolean $hidden
     * @return Organisation
     */
    public function setHidden($hidden)
    {
        $this->hidden = $hidden;

        return $this;
    }

    /**
     * Get hidden
     *
     * @return boolean 
     */
    public function getHidden()
    {
        return $this->hidden;
    }

    /**
     * Set dateEntered
     *
     * @param \DateTime $dateEntered
     * @return Organisation
     */
    public function setDateEntered($dateEntered)
    {
        $this->dateEntered = $dateEntered;

        return $this;
    }

    /**
     * Get dateEntered
     *
     * @return \DateTime 
     */
    public function getDateEntered()
    {
        return $this->dateEntered;
    }

    /**
     * Set dateUpdated
     *
     * @param \DateTime $dateUpdated
     * @return Organisation
     */
    public function setDateUpdated($dateUpdated)
    {
        $this->dateUpdated = $dateUpdated;

        return $this;
    }

    /**
     * Get dateUpdated
     *
     * @return \DateTime 
     */
    public function getDateUpdated()
    {
        return $this->dateUpdated;
    }

    /**
     * Set country
     *
     * @param \AppBundle\Entity\Country $country
     * @return Organisation
     */
    public function setCountry(\AppBundle\Entity\Country $country = null)
    {
        $this->country = $country;

        return $this;
    }

    /**
     * Get country
     *
     * @return \AppBundle\Entity\Country 
     */
    public function getCountry()
    {
        return $this->country;
    }

    /**
     * Set countrySubdivision
     *
     * @param \AppBundle\Entity\CountrySubdivision $countrySubdivision
     * @return Organisation
     */
    public function setCountrySubdivision(\AppBundle\Entity\CountrySubdivision $countrySubdivision = null)
    {
        $this->countrySubdivision = $countrySubdivision;

        return $this;
    }

    /**
     * Get countrySubdivision
     *
     * @return \AppBundle\Entity\CountrySubdivision 
     */
    public function getCountrySubdivision()
    {
        return $this->countrySubdivision;
    }

    /**
     * Set title
     *
     * @param \AppBundle\Entity\Title $title
     * @return Organisation
     */
    public function setTitle(\AppBundle\Entity\Title $title = null)
    {
        $this->title = $title;

        return $this;
    }

    /**
     * Get title
     *
     * @return \AppBundle\Entity\Title 
     */
    public function getTitle()
    {
        return $this->title;
    }

    /**
     * Set enteredByUser
     *
     * @param \AppBundle\Entity\User $enteredByUser
     * @return Organisation
     */
    public function setEnteredByUser(\AppBundle\Entity\User $enteredByUser = null)
    {
        $this->enteredByUser = $enteredByUser;

        return $this;
    }

    /**
     * Get enteredByUser
     *
     * @return \AppBundle\Entity\User 
     */
    public function getEnteredByUser()
    {
        return $this->enteredByUser;
    }

    /**
     * Set updatedByUser
     *
     * @param \AppBundle\Entity\User $updatedByUser
     * @return Organisation
     */
    public function setUpdatedByUser(\AppBundle\Entity\User $updatedByUser = null)
    {
        $this->updatedByUser = $updatedByUser;

        return $this;
    }

    /**
     * Get updatedByUser
     *
     * @return \AppBundle\Entity\User 
     */
    public function getUpdatedByUser()
    {
        return $this->updatedByUser;
    }
}

Country Entity: 国家实体:

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Criteria;

/**
 * Country
 *
 * @ORM\Table(name="country", uniqueConstraints={@ORM\UniqueConstraint(name="unique", columns={"code"})})
 * @ORM\Entity(repositoryClass="AppBundle\Entity\CountryRepository")
 */
class Country
{
    /**
     * @var string
     *
     * @ORM\Column(name="code", type="string", length=2, nullable=false)
     */
    private $code;

    /**
     * @var string
     *
     * @ORM\Column(name="code_iso_3", type="string", length=3, nullable=true)
     */
    private $codeIso3;

    /**
     * @var string
     *
     * @ORM\Column(name="code_iso_numeric", type="string", length=4, nullable=true)
     */
    private $codeIsoNumeric;

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

    /**
     * @var string
     *
     * @ORM\Column(name="capital", type="string", length=30, nullable=true)
     */
    private $capital;

    /**
     * @var string
     *
     * @ORM\Column(name="continent_name", type="string", length=15, nullable=true)
     */
    private $continentName;

    /**
     * @var string
     *
     * @ORM\Column(name="continent_code", type="string", length=2, nullable=true)
     */
    private $continentCode;

    /**
     * @var boolean
     *
     * @ORM\Column(name="hidden", type="boolean", nullable=false)
     */
    private $hidden;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date_entered", type="datetime", nullable=false)
     */
    private $dateEntered;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date_updated", type="datetime", nullable=false)
     */
    private $dateUpdated;

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

    /**
     * @var Doctrine\Common\Collections\ArrayCollection
     *
     * @ORM\OneToMany(targetEntity="CountrySubdivision", mappedBy="country")
     */
    private $subdivisions;

    /*
     * @var AppBundle\Entity\CountrySubdivision
     * Stored purely for the purposes of form capture
     */
    private $subdivision;

    /**
     * @var Doctrine\Common\Collections\ArrayCollection
     *
     * @ORM\OneToMany(targetEntity="CountrySubdivisionType", mappedBy="country")
     */
    private $subdivisionTypes;


    public function __construct()
    {
        $this->subdivisions = new ArrayCollection();
        $this->subdivisionTypes = new ArrayCollection();
    }


    public function getSubdivisions()
    {
        return $this->subdivisions->toArray();
    }

    public function getSubdivisionsOfParentId($parentId)
    {
        $criteria = Criteria::create()
            ->where(Criteria::expr()->eq("parentId", $parentId))
            ->orderBy(array("name" => Criteria::ASC));

        return $this->subdivisions->matching($criteria)->toArray();
    }

    public function setSubdivisions($subdivisions)
    {

    }

    public function getSubdivision()
    {
        return $this->subdivision;
    }

    public function setSubdivision($subdivision)
    {
        $this->subdivision = $subdivision;
    }

    public function setId($id)
    {
        $this->id = $id;
    }

    public function getSubdivisionTypeOfParentId($parentId)
    {
        $criteria = Criteria::create()
            ->where(Criteria::expr()->eq("subdivisionId", $parentId))
            ->orderBy(array("name" => Criteria::ASC));

        return $this->subdivisionTypes->matching($criteria)[0];
    }


    /**
     * Set code
     *
     * @param string $code
     * @return Country
     */
    public function setCode($code)
    {
        $this->code = $code;

        return $this;
    }

    /**
     * Get code
     *
     * @return string
     */
    public function getCode()
    {
        return $this->code;
    }

    /**
     * Set codeIso3
     *
     * @param string $codeIso3
     * @return Country
     */
    public function setCodeIso3($codeIso3)
    {
        $this->codeIso3 = $codeIso3;

        return $this;
    }

    /**
     * Get codeIso3
     *
     * @return string
     */
    public function getCodeIso3()
    {
        return $this->codeIso3;
    }

    /**
     * Set codeIsoNumeric
     *
     * @param string $codeIsoNumeric
     * @return Country
     */
    public function setCodeIsoNumeric($codeIsoNumeric)
    {
        $this->codeIsoNumeric = $codeIsoNumeric;

        return $this;
    }

    /**
     * Get codeIsoNumeric
     *
     * @return string
     */
    public function getCodeIsoNumeric()
    {
        return $this->codeIsoNumeric;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return Country
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set capital
     *
     * @param string $capital
     * @return Country
     */
    public function setCapital($capital)
    {
        $this->capital = $capital;

        return $this;
    }

    /**
     * Get capital
     *
     * @return string
     */
    public function getCapital()
    {
        return $this->capital;
    }

    /**
     * Set continentName
     *
     * @param string $continentName
     * @return Country
     */
    public function setContinentName($continentName)
    {
        $this->continentName = $continentName;

        return $this;
    }

    /**
     * Get continentName
     *
     * @return string
     */
    public function getContinentName()
    {
        return $this->continentName;
    }

    /**
     * Set continentCode
     *
     * @param string $continentCode
     * @return Country
     */
    public function setContinentCode($continentCode)
    {
        $this->continentCode = $continentCode;

        return $this;
    }

    /**
     * Get continentCode
     *
     * @return string
     */
    public function getContinentCode()
    {
        return $this->continentCode;
    }

    /**
     * Set hidden
     *
     * @param boolean $hidden
     * @return Country
     */
    public function setHidden($hidden)
    {
        $this->hidden = $hidden;

        return $this;
    }

    /**
     * Get hidden
     *
     * @return boolean
     */
    public function getHidden()
    {
        return $this->hidden;
    }

    /**
     * Set dateEntered
     *
     * @param \DateTime $dateEntered
     * @return Country
     */
    public function setDateEntered($dateEntered)
    {
        $this->dateEntered = $dateEntered;

        return $this;
    }

    /**
     * Get dateEntered
     *
     * @return \DateTime
     */
    public function getDateEntered()
    {
        return $this->dateEntered;
    }

    /**
     * Set dateUpdated
     *
     * @param \DateTime $dateUpdated
     * @return Country
     */
    public function setDateUpdated($dateUpdated)
    {
        $this->dateUpdated = $dateUpdated;

        return $this;
    }

    /**
     * Get dateUpdated
     *
     * @return \DateTime
     */
    public function getDateUpdated()
    {
        return $this->dateUpdated;
    }

    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }
}

If I replace, in the CountryType form... 如果我替换,请在CountryType表单中...

->add('id', EntityType::class, ...

With... 用...

->add('name')

...then I see the country name displayed without any issue. ...然后我看到显示的国家名称没有任何问题。 Where am I going wrong with the EntityType? EntityType在哪里出错?

I think you're not using custom FormType correctly. 我认为您没有正确使用自定义FormType。 You're not supposed to add anything to the builder in a custom FormType. 您不应该在自定义FormType中向构建器添加任何内容。 Try this : 尝试这个 :

<?php

namespace AppBundle\Form\Type\Meta;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;

class OrganisationType extends AbstractType
{

    public function __construct()
    {

    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title', new TitleType(),
                array('required' => true, 'label' => false))

            ->add('country', new CountryType(), array(
                'label' => 'Country',
                'choice_label' => 'name',
                'placeholder' => 'Choose an option...',
                'query_builder' => function (EntityRepository $repository) {
                    return $repository->createQueryBuilder('c')->orderBy('c.name', 'ASC');
                }
            ))

            ->add('location', 'text',
                array('required' => false, 'label' => 'City'));    
    }

    public function getName()
    {
        return 'organisation';
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Organisation',
            'csrf_protection' => true,
            'csrf_field_name' => '_token',
            // a unique key to help generate the secret token
            'intention' => 'organisation',
            'cascade_validation' => true
        ));
    }

}

with

<?php
namespace AppBundle\Form\Type\Meta;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Doctrine\ORM\EntityRepository;

class CountryType extends AbstractType
{
    public function getName()
    {
        return 'country';
    }

    public function getParent()
    {
        return EntityType::class;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Country'
        ));
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM