带有ManyToMany映射的Symfony表单

时间:2018-12-11 15:06:11

标签: symfony doctrine symfony-forms symfony-3.4 arraycollection

Symfony 3.4原理1.9

我发现了很多有关此的文章。但是没有什么可以解决我的 问题。

我有两个实体UserCompany映射为Many2Many。 两个实体都应填写表单提交。因此,我具有以下FormTypes:

CustomerRegistrationType

这包括具有{strong> entry_type 的CollectionType的{​​{1}},它返回CompanyFormType

Company:class

CompanyFormType

class CustomerRegistrationType extends AbstractType
{

    private $translator;
    private $session;
    public function __construct(TranslatorInterface $translator,Session $session)
    {
        $this->session = $session;
        $this->translator = $translator;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('mandant',HiddenType::class,array('data'=> 
            ->add('newsletter',CheckboxType::class,array('label' => false,'required' => false))
            ->add('company', CollectionType::class, array('entry_type' =>    CompanyFormType::class, 'entry_options' => array('label' => false)));


    }

Many2Many映射

class CompanyFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        parent::buildForm($builder, $options);
        $builder->add('telephone', TextType::class,array('required' => false))
            ->add('company_name', TextType::class,array('label' => false,'required' => false))
            ->add('company_supplement', TextType::class,array('label' => 
            ->add('send_info', CheckboxType::class,array('label' => false,'required' => false))
            ->add('send_invoice', CheckboxType::class,array('label' => false,'required' => false))
    }

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

在控制器中,我想将所有数据保存到不同的实体。 为此,我这样做:

   class User extends BaseUser
    {
        public function __construct()
        {
            parent::__construct();
            $this->company = new ArrayCollection();

        }
    /**
         * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Company",inversedBy="users")
         * @ORM\JoinTable(name="user_comp_comp_user",
         *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
         *      inverseJoinColumns={@ORM\JoinColumn(name="company_id", referencedColumnName="id")}
         * )
         */
        protected $company;

        public function getCompany()
        {
            return $this->company;
        }

        public function setCompany($company)
        {
            $this->company = $company;
            return $this;
        }

        public function addCompany(Company $company)
        {
            if ($this->company->contains($company)) {
                return;
            }
            $this->company[] = $company;
            return $this;
        }

        public function removeCompany(Company $company)
        {
            if (!$this->company->contains($company)) {
                return;
            }
            $this->company->removeElement($company);
            return $this;

        }

class Company
{
    public function __construct()
    {
        $this->users = new ArrayCollection();
    }

    /**
     * @var \Doctrine\Common\Collections\Collection|Company[]
     * @ORM\ManyToMany(targetEntity="User",mappedBy="company")
     */

    protected $users;
}

我没关系,每次遇到错误时,我会尝试哪种方式。在此示例中,公司数据为空。其他方式与public function registerAction(Request $request) { $user = $this->userManager->createUser(); $form = $this->createForm(CustomerRegistrationType::class,$user); $form->handleRequest($request); $company = $user->getCompany(); $company->setSendInvoice(true); $company->setSendInfo(true); if ($form->isSubmitted()){ $user->addCompany($company); $this->userManager->updateUser($user); .... } return $this->render('Registration/register.html.twig',[ 'form' => $form->createView() ]); }

ArrayCollection()的{​​{1}}冲突
$this->company

更新: 以Twig形式,我无权访问

User()

属性“ company_name”或方法“ company_name()”,“ getcompany_name()” /“ iscompany_name()” /“ hascompany_name()”或“ __call()”都不存在,并且在类中具有公共访问权限“ Symfony \ Component \ Form \ FormView”。

在表单提交之前出现。

1 个答案:

答案 0 :(得分:0)

我在这里找到了解决方案: https://groups.google.com/forum/#!topic/symfony2/DjwwzOfUIuQ

所以我在控制器中使用了基于数组的形式

$form = $this->createFormBuilder()
        ->add('user', CustomerRegistrationType::class, array(
              'data_class' => 'AppBundle\Entity\User'
        ))
        ->add('company', CompanyFormType::class, array(
              'data_class' => 'AppBundle\Entity\Company'
       ))
       ->getForm();

可以像这样捕获不同的对象:

$form->handleRequest($request);
$user = $form->get('user')->getData();
$company = $form->get('company')->getData();

然后

if ($form->isSubmitted()){
...
$user->addCompany($company);
$this->userManager->updateUser($user);
}

就这样