2016-02-10 2 views
0

Между двумя сущностями существует отношения OneToMany. Во-первых, Entity Entity - это объекты Domains. Один пользователь может иметь несколько доменов.Symfony Data Transform and Form Form с данными

Это пользователей Entity (удалены другие поля, так как не связанные с темой):

class Users extends BaseUser 
{ 

    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\OneToMany(targetEntity="\UsersBundle\Entity\UserDomains" , mappedBy="user" , cascade={"all"}) 
    */ 
    protected $domains; 
    /** 
    * Add domain 
    * 
    * @param \UsersBundle\Entity\UserDomains $domain 
    * 
    * @return Users 
    */ 
    public function addDomain(\UsersBundle\Entity\UserDomains $domain) 
    { 
     $this->domains[] = $domain; 

     return $this; 
    } 

    /** 
    * Remove domain 
    * 
    * @param \UsersBundle\Entity\UserDomains $domain 
    */ 
    public function removeDomain(\UsersBundle\Entity\UserDomains $domain) 
    { 
     $this->domains->removeElement($domain); 
    } 
} 

Это UserDomains Entity (некоторые поля были удалены):

class UserDomains 
{ 
    public function __construct() { 
     $this->setCreatedAt(new \DateTime()); 
    } 

    public function __toString() 
    { 
     return $this->name; 
    } 

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

    /** 
    * @var integer 
    * 
    * @ORM\ManyToOne(targetEntity="AffiliateBundle\Entity\Users", inversedBy="domains") 
    * @ORM\JoinColumn(name="user", referencedColumnName="id", onDelete="CASCADE") 
    */ 
    private $user; 

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

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

    /** 
    * Set user 
    * 
    * @param integer $user 
    * 
    * @return UserDomains 
    */ 
    public function setUser($user) 
    { 
     $this->user = $user; 

     return $this; 
    } 

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

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

     return $this; 
    } 

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

Должно быть добавить домен когда зарегистрируйте пользователя в системе. У меня есть RegisterType для регистрационной формы. Этот класс формы типа имеет DataTransformer для добавления домена, который регистрирует пользователя.

RegisterType класс здесь:

class RegistrationType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('fullName', 'text', array('attr' => array('class' => 'form-control'), 'label' => 'user_register.fullname', 'translation_domain' => 'UsersBundle')) 
      ->add('domains', 'text', array('attr' => array('class' => 'form-control select2', 'id' => 'select2_sample1'))) 
     ; 

     $builder->get('domains')->addModelTransformer(new CallbackTransformer(
      function(){ 
       return ''; 
      }, 
      function($data){ 

       $arrCollection = new ArrayCollection(); 

       if (strpos($data, ",") !== false) { 
        $expData = explode(',', $data); 
        foreach ($expData as $domain) { 
         $domainObj = new UserDomains(); 
         $domainObj->setName($domain); 
         $domainObj->setEnabled(true); 
         $arrCollection->add($domainObj); 
        } 
       } else if (!empty($data)) { 
        $domain = new UserDomains(); 
        $domain->setName($data); 
        $domain->setEnabled(true); 
        $arrCollection->add($domain); 
       } 

       return $arrCollection; 
      } 
     )); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'MyBundle\Entity\Users', 
      'intention' => 'registration', 
     )); 
    } 

    public function getParent() 
    { 
     return 'fos_user_registration'; 

     // Or for Symfony < 2.8 
     // return 'fos_user_registration'; 
    } 

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

Так кто заполнить регистрационную форму и отправить. Пользователь создал и добавил домены в таблицу user_domains, но не обновил поле , которое должно быть новым идентификатором пользователя. Как это сделать автоматически? Или у вас есть идея обновить этот пользователь столбец user_domains таблица с идентификатором нового пользователя?

Спасибо за помогает всем StackOverflow :)

+0

В User :: addDomain add $ domain-> setUser ($ this); Я нашел ваш вопрос немного запутанным, но я думаю, что это то, о чем вы просите. – Cerad

+0

Это не решило мою проблему. Проблема заключается в том, когда пользовательский объект сохраняет его, должен быть сохранен для объекта UserDomains с новым идентификатором пользователя. – Mesuti

+0

Я думаю, что ваш основной подход испорчен. Взгляните на коллекции форм: http://symfony.com/doc/current/cookbook/form/form_collections.html – Cerad

ответ

2

Добавить __construct как это RegistrationType:

class RegistrationType extends AbstractType 
{ 
    private $user; 

    public function __construct(Users $user) { 
     $this->user = $user; 
    } 

добавить функцию SETUSER к вашему DataTransform так:

$domainObj->setUser($this->user); 
//and 
$domain->setUser($this->user); 

наконец обновить контроллер например:

$form = $this->createForm(new RegistrationType($userEntity), $userEntity); 
+2

Просто имейте в виду, что этот подход не будет работать для Symfony 3. Если вы действительно чувствуете потребность в чем-то подобном затем передайте $ user через параметр options в createForm. – Cerad

+0

Да, это решило нашу проблему :) – Mesuti