2015-09-22 49 views
5

W mojej aplikacji Symfony 2.7, mam jednostkę użytkownika opartą na FOSUserBundle. Użytkownik musi być podłączony, aby uzyskać dostęp do formularza addAction().jak ustawić wartość domyślną do pola formularza symfony (pole użytkownika) po podłączonym użytkowniku, zgodnie z relacją ManyToMany pomiędzy jednostkami

Moja jednostka użytkownika jest powiązana z inną jednostką o nazwie parc. To jest kod moich dwóch bytów.

Users.php

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

    public function __construct() 
    { 
     parent::__construct(); 
     $this->parcs = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

    /** 
    * @var \Doctrine\Common\Collections\Collection 
    * 
    * @ORM\ManyToMany(targetEntity="Parcs", inversedBy="users") 
    * @ORM\JoinTable(name="users_parcs", 
    * joinColumns={ 
    *  @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
    * }, 
    * inverseJoinColumns={ 
    *  @ORM\JoinColumn(name="parc_id", referencedColumnName="id") 
    * } 
    *) 
    */ 
    private $parcs; 

    /** 
    * Get parcs 
    * 
    * @return \Doctrine\Common\Collections\Collection 
    */ 
    public function getParcs() 
    { 
     return $this->parcs; 
    } 

    /** 
    * Set parcs 
    * 
    * @return \Doctrine\Common\Collections\Collection 
    */ 
    public function setParcs($parcs) 
    { 
     return $this->parcs; 
    } 

Parcs.php

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

    /** 
    * @var \Doctrine\Common\Collections\Collection 
    * 
    * @ORM\ManyToMany(targetEntity="Users", mappedBy="parcs") 
    */ 
    private $users; 

    public function __construct() 
    { 
     $this->users = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

//rest of my entity attributes, object, properties etc 

// getters and setters 

    /** 
    * Get users 
    * 
    * @return \Doctrine\Common\Collections\Collection 
    */ 
    public function getUsers() 
    { 
     return $this->users; 
    } 

    /** 
    * Set users 
    * 
    * @return \Doctrine\Common\Collections\Collection 
    */ 
    public function setUsers($users) 
    { 
     return $this->users; 
    } 

    /** 
    * Add user 
    * 
    * @param \MySpace\MyBundle\Entity\Users $user 
    * 
    * @return Parcs 
    */ 
    public function addUser(\MySpace\MyBundle\Entity\Users $user) 
    { 
     $this->users[] = $user; 

     return $this; 
    } 

Używanie FOSUserBundle, w celu uzyskania dostępu do podłączonego użytkownika, moim zdaniem gałązka robię tak: {{ app.user.username }} , która przywraca mi nazwę użytkownika bieżącego użytkownika.

Teraz chciałbym pobrać tę wartość w mojej formie symfony (dla użytkownika pola), gdy chciałbym dodać parc. To moja parcsType.php forma:

public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('parcName') 
      ->add('users') 
     ; 
    } 

To jest moja forma w widoku gałązka:

<form action="{{ path('addParcs_process') }}" method="POST" {{ form_enctype(form) }}> 
    <div> 
    {{ form_label(form.parcName, "Enter the parc name: ", {'label_attr': {'class': 'control-label'}}) }} 
    {{ form_errors(form.parcName) }} 
    {{ form_widget(form.parcName) }} 
    </div> 
    <div> 
    {{ form_label(form.users, "Vous ajoutez ce parc en tant que: ", {'label_attr': {'class': 'control-label'}}) }} 
    {{ form_errors(form.users) }} 
    {{ form_widget(form.users, {'attr': {'value': app.user.username }}) }} 
    </div> 
    <input type="submit" value="Ajouter" class="btn btn-success"/> 
</form> 

Jak widać, ustawić domyślną wartość mojego pola użytkownika z {{ app.user.username }}, i to działa, moje pole użytkownika zwraca mi bieżącego użytkownika. Jednak po przesłaniu formularza pole użytkownika i powiązanie (ManyToMany) między Parcs.php i Users.php nie są utrwalane/płukane.

To jest mój kod kontrolera:

public function addParcsAction() { 

    if (!$this->get('security.context')->isGranted('ROLE_EDIT')) { 
     throw new HttpException("403"); 
    } 

    $em=$this->getDoctrine()->getManager(); 
    $parc = new Parcs; 

    $form=$this->createForm(new ParcsType(), $parc); 
    $form->add('user'); 
    $request = $this->getRequest(); 

    if ($request->isMethod('POST') | ($form->isValid())) { 

      $form->bind($request); 

      $currentUser=$this->container->get('security.context')->getToken()->getUser(); 
      $parc->setUsers($currentUser); 

      $parc = $form->getData(); 
      $em->persist($parc); 
      $em->flush(); 

      return $this->redirect($this->generateUrl('indexParc')); 
     } 

    else { 
      return $this->render('MySpaceMyBundle:Parcs:addParcs.html.twig', array('form' => $form->createView())); 
     } 
} 

złożenie działa dobrze, kiedy wprowadzić wartość dla nazwy parc dane jest zarejestrowany w mojej bazy danych, ale nie wartość użytkowników i stowarzyszenie ManyToMany.

+1

Bo jeśli tworzysz relację z użytkownikiem, musisz przekazać obiekt użytkownika, a nie tylko nazwę użytkownika. – malcolm

+0

@malcolm przy użyciu metody ** {{app.user.username}} **, w jaki sposób mogę użyć obiektu użytkownika? –

+0

po wywołaniu powiązania można uzyskać aktualnego użytkownika w kontrolerze i ustawić '$ parc-> setUsers ($ user);' Nie potrzebujesz do tego pola formularza. – malcolm

Odpowiedz

3

znalazłem rozwiązanie,

Jak wyjaśniono here, za zarządzanie połączeniem odpowiada tylko strona posiadająca.

Problem nie był związany z metodą $parc->addUser($currentUser);, chodzi o to, że obiekt Parcs nie był właścicielem do zarządzania tą relacją, gdy chciałby zachować dane.

Tak więc odwróciłem właściwości właściciela obiektu.W Parcs.php relacja musi być tak:

/** 
* @var \Doctrine\Common\Collections\Collection 
* 
* @ORM\ManyToMany(targetEntity="Users", inversedBy="parcs") 
* @ORM\JoinTable(name="parcs_users", 
* joinColumns={ 
*  @ORM\JoinColumn(name="parc_id", referencedColumnName="id") 
* }, 
* inverseJoinColumns={ 
*  @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
* } 
*) 
*/ 
private $users; 

muszę usunąć relację w Users.php aby napisać to:

/** 
* @var \Doctrine\Common\Collections\Collection 
* 
* @ORM\ManyToMany(targetEntity="Parcs", mappedBy="users") 
*/ 
private $parcs; 

A to mój kontroler dla addAction():

public function addParcsAction() { 

    if (!$this->get('security.context')->isGranted('ROLE_EDIT')) { 
     throw new HttpException("403"); 
    } 

    $em=$this->getDoctrine()->getManager(); 
    $parc = new Parcs; 
    $currentUser = $this->container->get('security.context')->getToken()->getUser(); 
    $parc->addUser($currentUser); 

    $form = $this->createForm(new ParcsType(), $parc); 
    $request = $this->getRequest(); 

    if ($request->isMethod('POST') | ($form->isValid())) { 

      $form->bind($request); 

      $parc = $form->getData(); 
      $em->persist($parc); 
      $em->flush(); 

      return $this->redirect($this->generateUrl('indexParc')); 
     } 

    else { 
      return $this->render('MySpaceMyBundle:Parcs:addParcs.html.twig', array('form' => $form->createView())); 
     } 
} 

Dziękuję bardzo, odpowiadając, zauważyłem, że nie był to $ parc-> addUser ($ currentUser); kto robił kłopoty, ale strona właściciela relacji.

3

Przed utworzeniem formularza należy dodać obiekt użytkownika do obiektu Parc. W ten sposób nie potrzebujesz części {'attr': {'value': app.user.username }}.

można spróbować to:

public function addParcsAction() { 

    if (!$this->get('security.context')->isGranted('ROLE_EDIT')) { 
     throw new HttpException("403"); 
    } 

    $em=$this->getDoctrine()->getManager(); 
    $parc = new Parcs; 
    $currentUser = $this->container->get('security.context')->getToken()->getUser(); 
    $parc->addUser($currentUser); 

    $form = $this->createForm(new ParcsType(), $parc); 
    $request = $this->getRequest(); 

    if ($request->isMethod('POST') | ($form->isValid())) { 

      $form->bind($request); 

      $parc = $form->getData(); 
      $em->persist($parc); 
      $em->flush(); 

      return $this->redirect($this->generateUrl('indexParc')); 
     } 

    else { 
      return $this->render('MySpaceMyBundle:Parcs:addParcs.html.twig', array('form' => $form->createView())); 
     } 
} 

ten sposób Państwa formularz zostanie wygenerowane z bieżącego użytkownika jako wartość domyślną w swoim users pole formularza

+0

W rzeczywistości, dodając metodę '$ parc-> addUser ($ currentUser);', pole formularza użytkownika jest wypełniane przez bieżącego użytkownika. Usuwam '{'attr': {'value': app.user.username}}' w moim widoku gałązkowym, ale kiedy przetwarzam do ** addAction() **, relacja między parkiem a użytkownikiem nie jest zachowywana, dane parc są rejestrowane w bazie danych, ale nie dane użytkownika. –