0

我使用PUGXMultiUserBundle,因爲我有兩種類型的用戶:CustomerUser和ShopUser。 ShopUser與位置(地址,城市...)有一對一的關係。PUGXMultiUserBundle和註冊表格嵌入

我需要將所有數據保存到僅來自RegistrationShopUserFormType的表格(商店和位置)。我如何使用PUGX做到這一點?

我試過使用表單嵌入和表單集合,但我沒有一個好的結果。 你有什麼想法嗎?

EDIT

這裏的代碼:

窗體/:

RegistrationShopUserFormType.php

<?php 


namespace AppBundle\Form; 
use AppBundle\Entity\ShopUser; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\Extension\Core\Type\CollectionType; 
use Symfony\Component\Form\FormBuilderInterface; 
use FOS\UserBundle\Form\Type\RegistrationFormType as BaseRegistrationFormType; 
use Symfony\Component\OptionsResolver\OptionsResolver; 

class RegistrationShopUserFormType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name') 
      ->add('lastName') 
      ->add('shopName') 

     ; 

    } 

    public function getParent() 
    { 
     return 'FOS\UserBundle\Form\Type\RegistrationFormType'; 
    } 

    public function getBlockPrefix() 
    { 
     return 'user_shop'; 
    } 

    public function getName() 
    { 
     return $this->getBlockPrefix(); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => ShopUser::class, 
     )); 
    } 

} 

LocationFormType.php

<?php 


namespace AppBundle\Form; 

use AppBundle\Entity\Branch; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 

class LocationFormType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('address') 
       ->add('city') 
       ->add('cap') 
       ->add('lat') 
       ->add('lng') 
      ; 
     $builder->add('shop', CollectionType::class, array(
      'entry_type' => RegistrationShopUserFormType::class 
     )); 
    } 

    public function getBlockPrefix() 
    { 
     return 'location'; 
    } 

    public function getName() 
    { 
     return $this->getBlockPrefix(); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => Location::class, 
     )); 
    } 


} 

實體/: ShopUser.php(從PUGMultiUserBundle)-without getter和setter-

<?php 

namespace AppBundle\Entity; 


use Doctrine\ORM\Mapping as ORM; 
use PUGX\MultiUserBundle\Validator\Constraints\UniqueEntity; 


/** 
* @ORM\Entity 
* @ORM\Table(name="shop") 
* @UniqueEntity(fields = "username", targetClass = "AppBundle\Entity\User", message="fos_user.username.already_used") 
* @UniqueEntity(fields = "email", targetClass = "AppBundle\Entity\User", message="fos_user.email.already_used") 
*/ 
class ShopUser extends User 
{ 
    /** 
    * @ORM\Id 
    * 
    * @ORM\Column(type="string") 
    */ 
    protected $id; 

    /** 
    * @ORM\Column(type="string",nullable=true) 
    */ 
    protected $vat; 


    /** 
    * @ORM\Column(type="string") 
    */ 
    protected $name; 

    /** 
    * @ORM\Column(type="string") 
    */ 
    protected $lastName; 

    /** 
    * @ORM\Column(type="string") 
    */ 
    protected $shopName; 

    /** 
    * @ORM\Column(type="string",nullable=true) 
    */ 
    protected $logo; 

} 

Location.php -without一些吸氣劑和setter-

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 
use Doctrine\Common\Collections\ArrayCollection; 

/** 
* Location 
* 
* @ORM\Table(name="location", uniqueConstraints={@ORM\UniqueConstraint(name="id_UNIQUE", columns={"id"})}, indexes={@ORM\Index(name="fk_location_shop1_idx", columns={"shop_id"})}) 
* @ORM\Entity 
*/ 
class Location 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    private $id; 

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

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

    /** 
    * @var float 
    * 
    * @ORM\Column(name="lat", type="float", precision=10, scale=6, nullable=false) 
    */ 
    private $lat; 

    /** 
    * @var float 
    * 
    * @ORM\Column(name="lng", type="float", precision=10, scale=6, nullable=false) 
    */ 
    private $lng; 

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

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

    /** 
    * @var \AppBundle\Entity\ShopUser 
    * 
    * @ORM\ManyToOne(targetEntity="AppBundle\Entity\ShopUser") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="shop_id", referencedColumnName="id") 
    * }) 
    * @Assert\Type(type="AppBundle\Entity\ShopUser") 
    * @Assert\Valid() 
    * 
    * 
    */ 
    private $shop; 

    /** 
    * @param ShopUser $shop 
    */ 
    public function setShop(ShopUser $shop) 
    { 
     $this->shop = $shop; 
    } 


    /** 
    * @return ShopUser 
    */ 
    public function getShop() 
    { 
     return $this->shop; 
    } 

控制器/:

RegistrationShopUserController.php

<?php 


namespace AppBundle\Controller; 


use AppBundle\Entity\Branch; 
use AppBundle\Entity\ShopUser; 
use AppBundle\Form\BranchFormType; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\BrowserKit\Request; 

class RegistrationShopUserController extends Controller 
{ 
    public function registerAction(){ 


     return $this->container 
      ->get('pugx_multi_user.registration_manager') 
      ->register(ShopUser::class); 


    } 
} 

在我看來問題是在RegistrationShopUserController中,但我不知道如何解決它。請幫助。

+0

顯示你已經嘗試了什麼,什麼是不工作。 –

+0

我更新了帖子@JasonRoman – Stek

+0

好的 - 你提到你沒有得到好的結果。你能發佈你得到的結果和你期望的結果嗎? –

回答

0

我解決了這個問題!

在RegistrationShopUserFormType.php

public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name') 
      ->add('lastName') 
      ->add('shopName') 
      ->add('mainLocation', LocationFormType::class); 


     ; 

    } 

LocationFormType。PHP

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('address') 
      ->add('city') 
      ->add('cap') 
     ; 

} 

我ShopUser.php

/** 
    * @ORM\OneToMany(targetEntity="AppBundle\Entity\Location", mappedBy="shop", cascade={"persist"}) 
    */ 
    protected $locations; 

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

    /** 
    * @return mixed 
    */ 
    public function getLocations() 
    { 
     return $this->locations; 
    } 


    public function getMainLocation() 
    { 
     return $this->locations->first() ? $this->locations->first() : null; 
    } 

    public function setMainLocation(Location $location) 
    { 
     if ($this->locations->contains($location)) { 
      return; 
     } 

     $this->locations[] = $location; 
     $branch->setShop($this); 
    } 
添加

它的工作原理!我希望這是有用的。

0

問題是您在Location實體和ShopUser實體之間存在單向一對多關係。當您在控制器中創建shopUser對象時,僅僅是「不知道」與Location應該有某種關係。

解決的辦法是,你必須在ShopUser實體類中定義一個屬性,該實體類將包含與Location實體類的關係(多對一是你想要的IMHO)。 還要考慮如何在創建新ShopUser對象時處理該屬性 - 如果要在每次新用戶註冊時創建一個新位置,則只需在實體類構造函數中創建並分配一個新位置對象。

(將需要更復雜的解決方案,如果你需要創建新的位置,也是一個新的用戶註冊過程中從現有位置選擇。)

+0

謝謝你的答案。但是我需要ShopUser和Location之間的OneToMany。 ShopUser有一個/多個位置。 我該如何解決它? @JanRydrych – Stek