2015-09-22 8 views
5

के बीच कई से अधिक संबंधों के बाद, मेरे सिम्फनी 2.7 एप्लिकेशन में, मेरे पास FOSUserBundle पर आधारित उपयोगकर्ता इकाई है। किसी ऐडएक्शन() फॉर्म तक पहुंचने के लिए उपयोगकर्ता को कनेक्ट होना होगा।कनेक्ट किए गए उपयोगकर्ता के बाद एक सिम्फनी फॉर्म फ़ील्ड (उपयोगकर्ता फ़ील्ड) में डिफ़ॉल्ट मान सेट करने के लिए,

मेरे उपयोगकर्ता इकाई किसी अन्य संस्था नामित parc साथ जुड़ा हुआ है। यह मेरी दो इकाइयों का कोड है।

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; 
    } 

FOSUserBundle का उपयोग करना, मेरी टहनी ध्यान में रखते हुए, जुड़ा उपयोगकर्ता के लिए तक पहुँचने के लिए मैं इस बनाने: {{ app.user.username }} , जो मुझे वर्तमान उपयोगकर्ता का उपयोगकर्ता नाम दोहराता है।

अब, मैं (क्षेत्र उपयोगकर्ता के लिए) मेरे सिम्फोनी रूप में यह मान प्राप्त करने के लिए जब मैं एक parc जोड़ना चाहते हैं करना चाहते हैं। यह मेरा parcsType.php प्रपत्र:

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

इस टहनी ध्यान में रखते हुए मेरी रूप है:

<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> 

आप देख सकते हैं, मैं {{ app.user.username }} साथ मेरे उपयोगकर्ता क्षेत्र का डिफ़ॉल्ट मान सेट है, और यह काम करता है, मेरा उपयोगकर्ता फ़ील्ड मुझे वर्तमान उपयोगकर्ता देता है। लेकिन जब मैं Parcs.php और Users.php के बीच फार्म, उपयोगकर्ता क्षेत्र और संघ (ManyToMany) जमा कायम/प्लावित नहीं कर रहे हैं।

यह मेरा नियंत्रक कोड है:

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())); 
     } 
} 

प्रस्तुत करने, अच्छी तरह से काम करता है जब मैं parc नाम डेटा मेरी डेटाबेस में पंजीकृत किया गया है के लिए मान दर्ज है, लेकिन नहीं उन मूल्य और ManyToMany संघ।

+1

क्योंकि यदि आप उपयोगकर्ता से संबंध बनाते हैं, तो आपको उपयोगकर्ता ऑब्जेक्ट को केवल उपयोगकर्ता नाम नहीं देना होगा। मेट्रो ** {{app.user.username}} ** का उपयोग करने में – malcolm

+0

@malcolm **, मैं उपयोगकर्ता ऑब्जेक्ट का उपयोग कैसे कर सकता हूं? –

+0

आपके अनुरोध को बाध्य करने के बाद आप वर्तमान उपयोगकर्ता को नियंत्रक में प्राप्त कर सकते हैं और इसे '$ parc-> setUsers ($ उपयोगकर्ता) सेट कर सकते हैं;' इसके लिए आपको फॉर्म फ़ील्ड की आवश्यकता नहीं है। – malcolm

उत्तर

3

मैं समाधान में डिफ़ॉल्ट मान के रूप में वर्तमान उपयोगकर्ता के साथ उत्पन्न हो जाएगा,

के रूप में समझाया here, केवल मालिक पक्ष कनेक्शन प्रबंधन के लिए जिम्मेदार है।

समस्या $parc->addUser($currentUser); विधि के साथ नहीं थी, यह केवल यह है कि इकाई पार्स डेटा को जारी रखने के लिए इस संबंध को प्रबंधित करने के स्वामी नहीं थे।

तो मैं इकाई मालिक गुण उल्टा है।Parcs.php में संबंध ऐसे ही रहना होगा:

/** 
* @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; 

मैं इस लिखने के लिए Users.php में संबंध को दूर करने के लिए है:

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

और 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())); 
     } 
} 

उत्तर देकर बहुत बहुत धन्यवाद, यहां देखा गया कि यह $ parc-> addUser ($ currentUser) नहीं था; जो परेशानी कर रहा था, लेकिन संबंध के मालिक पक्ष।

3

आप प्रपत्र बनाने से पहले Parc वस्तु को उपयोगकर्ता वस्तु को जोड़ने के लिए है। इस तरह आपको {'attr': {'value': app.user.username }} भाग की भी आवश्यकता नहीं है।

आप इस प्रयास कर सकते हैं:

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())); 
     } 
} 

इस तरह आप अपने प्रपत्र अपने users फॉर्म फील्ड

+0

वास्तव में, '$ parc-> addUser ($ currentUser) जोड़कर; विधि, उपयोगकर्ता फ़ॉर्म फ़ील्ड वर्तमान उपयोगकर्ता द्वारा पॉप्युलेट किया गया है। मैं अपने जुड़वां दृश्य में '{'attr': {'value': app.user.username}} हटा देता हूं, लेकिन जब मैं ** addAction() ** पर संसाधित करता हूं, तो पीआरसी और उपयोगकर्ता के बीच संबंध जारी नहीं रहता है, पीआरसी डेटा डेटाबेस में पंजीकृत हैं, लेकिन उपयोगकर्ता डेटा नहीं। –

संबंधित मुद्दे