2016-11-20 9 views
-1

Ich möchte eine Seite erstellen, in der es mehrere Beiträge gibt (auf der gleichen Seite) und jeder Beitrag hat ein Formular und Eingabe in diesem Formular in dieser Eingabe können Sie etwas über diesen Beitrag schreiben, dann Text und Post-ID wird an die Datenbank gesendet. Wie kann ich das mit symfony machen?Symfony mehrere Formen und Eingaben

+0

Diese Art von Fragen normalerweise gelöscht oder geschlossen als zu weit oder off-topic (wenn Sie einen kostenlosen Programmierservice oder für ein Tutorial suchen). Sie können die Dokumentation nur lesen, um zu erfahren, wie Symfony funktioniert, dann haben Sie das Grundwissen, um Code zu schreiben und hier zurückzukehren, um Hilfe für ein bestimmtes Problem in Bezug auf Ihren Code zu erhalten. Lesen Sie auch: [Welche Themen können Sie auf SO stellen] (http://stackoverflow.com/help/on-topic) und [Wie stelle ich eine gute Frage?] (Http://stackoverflow.com/help/how (zu fragen), diese Themen werden Ihnen helfen, eine bessere Frage zu formulieren. –

Antwort

0

Es ist eigentlich sehr einfach. Machen Sie Ihre Entitäten und den Formtyp so, wie Sie auch verwendet werden. Der Trick ist, die Post-ID in die Aktion URL der Formulare einzufügen, so dass es

<form action="/reaction/new/1"> 

macht, wo die 1 die Post-ID ist. I verwendet, um den Zweig-Controller-Funktion jeder Form mit der richtigen Aktion URL zu machen:

{{ render(controller('AppBundle:Reaction:new', {'postId':post.id})) }} 

Beispiel

Beitrag Einheit:

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 

/** 
* Post 
* 
* @ORM\Table(name="post") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\PostRepository") 
*/ 
class Post 
{ 
    // ... 

    /** 
    * @ORM\OneToMany(targetEntity="Reaction", mappedBy="post") 
    */ 
    private $reactions; 

    public function __construct() 
    { 
     $this->reactions = new ArrayCollection(); 
    } 

    // ... 
} 

Reaction Enity:

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* Reaction 
* 
* @ORM\Table(name="reaction") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\ReactionRepository") 
*/ 
class Reaction 
{ 
    // ... 

    /** 
    * @ORM\ManyToOne(targetEntity="Post", inversedBy="reactions") 
    * @ORM\JoinColumn(name="post_id", referencedColumnName="id") 
    */ 
    private $post; 

    // ... 
} 

Post-Controller:

namespace AppBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 

/** 
* Post controller. 
* 
* @Route("post") 
*/ 
class PostController extends Controller 
{ 
    /** 
    * @Route("/", name="post_index") 
    */ 
    public function indexAction() 
    { 
     $em = $this->getDoctrine()->getManager(); 

     $posts = $em->getRepository('AppBundle:Post')->findAll(); 

     return $this->render('post/index.html.twig', array(
      'posts' => $posts, 
     )); 
    } 
} 

Reaktionsregler:

namespace AppBundle\Controller; 

use AppBundle\Entity\Reaction; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;use Symfony\Component\HttpFoundation\Request; 

/** 
* Reaction controller. 
* 
* @Route("reaction") 
*/ 
class ReactionController extends Controller 
{ 
    /** 
    * Creates a new reaction entity. 
    * 
    * @Route("/new/{postId}", name="reaction_new") 
    * @Method({"GET", "POST"}) 
    */ 
    public function newAction(Request $request, $postId) 
    { 
     $em = $this->getDoctrine()->getManager(); 

     $reaction = new Reaction(); 
     $form = $this->createForm('AppBundle\Form\ReactionType', $reaction, array(
      /* 
      * You must change the action otherwise we will post to Post:index action ! 
      */ 
      'action' => $this->generateUrl('reaction_new', array('postId' => $postId)) 
     )); 
     $form->handleRequest($request); 

     if ($form->isSubmitted() && $form->isValid()) 
     { 
      /* 
      * load post entity and add it to the reaction::post collection ! 
      */ 
      $post = $em->getRepository('AppBundle:Post')->find($postId); 
      $reaction->setPost($post); 

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

      /* 
      * return to the post page 
      */ 
      return $this->redirectToRoute('post_index'); 
     } 

     return $this->render('reaction/new.html.twig', array(
      'form' => $form->createView(), 
     )); 
    } 
} 

post/index.html.twig:

{% extends 'base.html.twig' %} 

{% block body %} 
    {% for post in posts %} 
     <h1>{{ post.title }}</h1> 
     <p>{{ post.body }}</p> 
     <h3>Reactions</h3> 
     <ul> 
     {% for reaction in post.reactions %} 
      <li>{{ reaction.message }}</li> 
     {% endfor %} 
     </ul> 
     {{ render(controller('AppBundle:Reaction:new', {'postId':post.id})) }} 
    {% endfor %} 
{% endblock %} 

Reaktions/new.html.twig:

{{ form_start(form) }} 
    {{ form_widget(form) }} 
    <input type="submit" value="Send" /> 
{{ form_end(form) }}