2016-04-27 3 views
0

Ich habe 2 Entität: Benutzer und Strain mit einer ManyToMany bidirektionalen Beziehung, der Besitzer der Beziehung ist Benutzer.EntityForm auf einer ManyToMany bidirektionalen, für die beiden Seiten der Beziehung

Ich möchte ein Formular für die Bearbeitung der Rechte (der Benutzer besitzen einige Stämme), wenn ich ein Formular für den Benutzer, wo ich einige Stämme wählen kann, funktioniert es gut (ich verwende eine EntityType auf Strain). Aber ... Manchmal möchte ich die Rechte auf der anderen Seite der Beziehung bearbeiten: Strain. Dh editiere den Strain und wähle die User die ich will. Aber es funktioniert nicht ...

Ich gebe Ihnen meine Entitäten User und Strain und die beiden Formtype und meine Uglys Lösung ...

User.php

/** 
* The authorized strains for this user. 
* 
* @var Strain|ArrayCollection 
* 
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Strain", inversedBy="authorizedUsers") 
*/ 
private $authorizedStrains; 

/** 
* User constructor. 
*/ 
public function __construct() 
{ 
    $this->authorizedStrains = new ArrayCollection(); 
} 

/** 
* Add an authorized strain. 
* 
* @param Strain $strain 
* 
* @return $this 
*/ 
public function addAuthorizedStrain(Strain $strain) 
{ 
    $this->authorizedStrains[] = $strain; 
    $strain->addAuthorizedUser($this); 

    return $this; 
} 

/** 
* Remove an authorized strain. 
* 
* @param Strain $strain 
*/ 
public function removeAuthorizedStrain(Strain $strain) 
{ 
    $this->authorizedStrains->removeElement($strain); 
    $strain->removeAuthorizedUser($this); 
} 

/** 
* Get authorized strains. 
* 
* @return Strain|ArrayCollection 
*/ 
public function getAuthorizedStrains() 
{ 
    return $this->authorizedStrains; 
} 

Strain.php

/** 
* The authorized user. 
* For private strains only. 
* 
* @var User|ArrayCollection 
* 
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\User", mappedBy="authorizedStrains") 
*/ 
private $authorizedUsers; 

/** 
* Strain constructor. 
*/ 
public function __construct() 
{ 

/** 
* Add authorized user. 
* 
* @param User $user 
* 
* @return $this 
*/ 
public function addAuthorizedUser(User $user) 
{ 
    $this->authorizedUsers[] = $user; 

    return $this; 
} 

/** 
* Remove authorized user. 
* 
* @param User $user 
*/ 
public function removeAuthorizedUser(User $user) 
{ 
    $this->authorizedUsers->removeElement($user); 
} 

/** 
* Get authorized users. 
* 
* @return User|ArrayCollection 
*/ 
public function getAuthorizedUsers() 
{ 
    return $this->authorizedUsers; 
} 

UserRightsType.php

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('authorizedStrains', EntityType::class, array(
      'class' => 'AppBundle\Entity\Strain', 
      'choice_label' => 'name', 
      'expanded' => true, 
      'multiple' => true, 
      'required' => false, 
     )) 
    ; 
} 

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

StrainRightsType

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('authorizedUsers', EntityType::class, array(
      'class' => 'AppBundle\Entity\User', 
      'query_builder' => function(UserRepository $ur) { 
       return $ur->createQueryBuilder('u') 
        ->orderBy('u.username', 'ASC'); 
      }, 
      'choice_label' => function ($user) { 
       return $user->getUsername().' ('.$user->getFirstName().' '.$user->getLastName().')'; 
      }, 
      'expanded' => true, 
      'multiple' => true, 
      'required' => false, 
     )) 
    ; 
} 

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

StrainController.php die hässliche Lösung

public function userRightsAction(Request $request, Strain $strain) 
{ 
    $form = $this->createForm(StrainRightsType::class, $strain); 
    $form->add('save', SubmitType::class, [ 
     'label' => 'Valid the rights', 
    ]); 

    foreach($strain->getAuthorizedUsers() as $authorizedUser) { 
     $authorizedUser->removeAuthorizedStrain($strain); 
    } 

    $form->handleRequest($request); 

    if ($form->isValid()) { 
     $em = $this->getDoctrine()->getManager(); 

     foreach($strain->getAuthorizedUsers() as $authorizedUser) 
     { 
      $authorizedUser->addAuthorizedStrain($strain); 
      $em->persist($authorizedUser); 
     } 

     $em->flush(); 

     $request->getSession()->getFlashBag()->add('success', 'The user\'s rights for the strain '.$strain->getName().' were successfully edited.'); 

     return $this->redirectToRoute('strain_list'); 
    } 

    return $this->render('strain/userRights.html.twig', [ 
     'strain' => $strain, 
     'form' => $form->createView(), 
    ]); 
} 

Wie Sie sehen können, habe ich 2 foreach: die erste, alle Rechte entfernen auf dem Strain, und der zweite, um Rechte zu geben.

ich Symfony denken haben dieses Problem erwartet, aber ich weiß nicht, wie zu tun, und ich habe nichts in der Dokumentation ...

Sie für Ihre Hilfe im Voraus danken, Sheppard

Antwort

0

Endlich habe ich gefunden.

Auf der inversed Seite (Strain.php):

public function addAuthorizedUser(User $user) 
{ 
    $user->addAuthorizedStrain($this); 
    $this->authorizedUsers[] = $user; 

    return $this; 
} 

public function removeAuthorizedUser(User $user) 
{ 
    $user->removeAuthorizedStrain($this); 
    $this->authorizedUsers->removeElement($user); 
} 

Und auf der Eigentümer-Seite (User.php)

public function addAuthorizedStrain(Strain $strain) 
{ 
    if (!$this->authorizedStrains->contains($strain)) { 
     $this->authorizedStrains[] = $strain; 
    } 

    return $this; 
} 

public function removeAuthorizedStrain(Strain $strain) 
{ 
    if ($this->authorizedStrains->contains($strain)) { 
     $this->authorizedStrains->removeElement($strain); 
    } 
} 

Und in der Formtype (für die inverse Seite) (StrainRightsType)), add 'by_reference' => false

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('authorizedUsers', EntityType::class, array(
      'class' => 'AppBundle\Entity\User', 
      'query_builder' => function(UserRepository $ur) { 
       return $ur->createQueryBuilder('u') 
        ->orderBy('u.username', 'ASC'); 
      }, 
      'choice_label' => function ($user) { 
       return $user->getUsername().' ('.$user->getFirstName().' '.$user->getLastName().')'; 
      }, 
      'by_reference' => false, 
      'expanded' => true, 
      'multiple' => true, 
      'required' => false, 
     )) 
    ; 
} 
Verwandte Themen