2017-05-16 1 views
0

Ich habe ein Forum mit Themen, wo jedes Thema von anderen Benutzern kommentiert werden kann. Die Beziehung i erstellt ist:Wie erhalte ich die aktuelle ID aus dem spezifischen Thema?

class Comment 
{ 
    /** 
    * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Topic", inversedBy="comments") 
    */ 
    private $topic; 
} 

Und die Klasse Thema:

class Topic 
{ 
    /** 
    * @ORM\OneToMany(targetEntity="AppBundle\Entity\Comment", mappedBy="topic") 
    * @ORM\JoinColumn(name="comment_id", referencedColumnName="id") 
    */ 
    private $comments; 
} 

Das Problem ist, dass, wenn ich einen Kommentar zu erstellen, die topic_id Spalte in der Tabelle Kommentare null ist. Ich bin mir nicht sicher, wie ich die aktuelle Topic-ID abrufen und auf den Kommentar setzen soll. Hier ist meine addCommentAction() Funktion im Comment:

 /** 
    * @Route("/comment/add", name="comment_add") 
    * @param Request $request 
    * @return \Symfony\Component\HttpFoundation\Response 
    */ 
    public function addCommentAction(Request $request) 
    { 
     $comment = new Comment(); 

     $form = $this->createForm(CommentType::class, $comment); 
     $form->handleRequest($request); 

     if ($form->isValid()) { 

      $comment->setDateCreated(new \DateTime()); 

      $em = $this->getDoctrine()->getManager(); 
      $em->persist($comment); 
      $em->flush(); 


      $this->addFlash(
       'notice', 
       'Comment Added Successfully !' 
      ); 
     } 
     return $this->render('comments/comment.add.html.twig', array(
      'commentsForm' => $form->createView() 
     )); 
    } 

Der Pfad im Zweig Vorlage:

<a href="{{ path('comment_add') }}" class="btn btn-lg btn-default">Leave a Comment</a> 
+1

Ich denke, Sie sollten 'topic_id' über versteckten Eingang in Ihrem Kommentar oder per URL GET-Parameter (von action-Attribute des Formulars) übergeben. Wenn Sie das Formular in der gleichen Aktion rendern, mit der Sie es bearbeiten, benötigen Sie die Themen-ID in der URL trotzdem. –

Antwort

1

Fast fertig :) nur versuchen, folgende

wenn Thema bereits existiert

$em = $this->getDoctrine()->getManager(); 
$topic = $em->getRepository('YouBundle:Topic')->find($topic_id); 

if(false === $topic instanceof topic) 
{ 
// not found ... 
} 

$comment = new Comment(); 
$comment->setTopic($topic) 
// createForm.... 

wenn nicht, stattdessen für eine in DB zu suchen, erstellen Sie eine

$topic = new Topic(); 
$comment = new Comment(); 
$comment->setTopic($topic); 

UPD: als @Jakub Matczak sagte. Wahrscheinlich müssen Sie Ihrem Formular ein verstecktes Feld mit topic_id hinzufügen, da Sie keine Dropdownliste mit allen verfügbaren Themen erhalten möchten.

in Ihrer Klasse in Kommentarformular buildForm Methode

$builder->add('topic', HiddenType:class, []); 
1

Sie haben das Thema auf Ihrem Kommentar Gebilde zu gründen. In Ihrem Routing müssen Sie die ID des Themas hinzufügen, dann wird Symfony automatisch das Thema Einheit mit dem so funktionieren sollte ParamConverter

Etwas erhalten:

/** 
* @Route("/{id}/comment/add", name="comment_add") 
* @param Request $request 
* @return \Symfony\Component\HttpFoundation\Response 
*/ 
public function addCommentAction(Request $request, Topic $topic) 
{ 
    $comment = new Comment(); 
    $comment->setTopic($topic); 

    $form = $this->createForm(CommentType::class, $comment); 
    $form->handleRequest($request); 

    if ($form->isValid()) { 

     $comment->setDateCreated(new \DateTime()); 

     $em = $this->getDoctrine()->getManager(); 
     $em->persist($comment); 
     $em->flush(); 


     $this->addFlash(
      'notice', 
      'Comment Added Successfully !' 
     ); 
    } 
    return $this->render('comments/comment.add.html.twig', array(
     'commentsForm' => $form->createView() 
    )); 
} 
+0

Ich habe dein Beispiel versucht, aber ich habe jetzt eine Ausnahme in der Zweigvorlage, die besagt, dass einige obligatorische Parameter fehlen ("id"), um eine URL zu generieren. Ich werde den Vorlagenpfad hinzufügen, den ich in der obigen Frage verwende. –

+0

Offensichtlich müssen Sie den Übermittlungsweg aktualisieren ... – Shady

0

Eine Anmerkung: $ form = $ this-> createForm (CommentType :: class, $ comment); Sollte nicht "Kommentar" sein? Ich sehe keine CommentType-Klasse in Ihrer Beschreibung.

Außerdem müssen Sie die topicId irgendwie passieren, wenn Sie einen neuen Kommentar hinzufügen. Ich würde eine POST-Aktion für "/ comment/add" machen und im Körper würde ich die Themen-ID senden.

// Rest of the imports... 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; 

/** 
* @Route("/comment/add", name="comment_add") 
* @Method({"POST"}) 
* @param Request $request 
* @return \Symfony\Component\HttpFoundation\Response 
*/ 
public function addCommentAction(Request $request) 
{ 
    $comment = new Comment(); 

    $form = $this->createForm(CommentType::class, $comment); 
    $form->handleRequest($request); 

    if ($form->isValid()) { 

     $comment->setDateCreated(new \DateTime()); 

     $em = $this->getDoctrine()->getManager(); 

     $topicId = $request->request->get('topicId'); 
     $topic = $em->getRepository('Bundle:Topic')->find($topicId); // retrieve the topic id from the corresponding repository of the topic entity 
     $comment->setTopic($topic); // setting the topic to the comment 

     $em->persist($comment); 
     $em->flush(); 


     $this->addFlash(
      'notice', 
      'Comment Added Successfully !' 
     ); 
    } 
    return $this->render('comments/comment.add.html.twig', array(
     'commentsForm' => $form->createView() 
    )); 
} 

You need also to add a repository from which you will retrieve the Topic objects. You need just an empty class named TopicRepository that should extend EntityRepository from Doctrine. 

Daneben sollten Sie auch den ‚topicId‘ senden, wenn Sie die POST-Anforderung von der Client-Seite tun.

+0

Ich habe eine Klasse im Form Directory namens CommentType, wo ich das Formular erstelle, so dass es funktioniert –

Verwandte Themen