Bonjour,
Je suis entrain de réaliser un petit blog sous Symfony2 , j'ai un formulaire Article avec un autre formulaire imbriqué Image , je me suis retrouvé face à un problème au niveau de la base de données , ainsi lorsque je remplie les champs du formulaire , au niveau de la base tout est bon sauf les champs image de la table Articles et le champs article_id de la table Images .
Alors je sais pas si l'erreur est au niveau du code ou bien c'est un problème d'association entre les tables .
Le code de mon application :
Le controlleur
Je suis entrain de réaliser un petit blog sous Symfony2 , j'ai un formulaire Article avec un autre formulaire imbriqué Image , je me suis retrouvé face à un problème au niveau de la base de données , ainsi lorsque je remplie les champs du formulaire , au niveau de la base tout est bon sauf les champs image de la table Articles et le champs article_id de la table Images .
Alors je sais pas si l'erreur est au niveau du code ou bien c'est un problème d'association entre les tables .
Le code de mon application :
<?php namespace Blog\newsBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * Article * * @ORM\Table(name="articles") * @ORM\Entity(repositoryClass="Blog\newsBundle\Entity\ArticleRepository") */ class Article { /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @var string * * @ORM\Column(name="titre", type="string", length=255) */ private $titre; /** * @var \DateTime * * @ORM\Column(name="datePub", type="datetime") */ private $datePub; /** * @var string * * @ORM\Column(name="contenue", type="text") */ private $contenue; /** * @var string * * @ORM\Column(name="auteur", type="string", length=255) */ private $auteur; /** * @ORM\Column(name="image" ,type="integer") * @ORM\OneToOne(targetEntity="Image" , mappedBy="article" ) */ private $image; /** * @var boolean * * @ORM\Column(name="publication", type="boolean") */ private $publication; function __construct() { $this->publication = true; $this->datePub = new \DateTime(); } /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * Set titre * * @param string $titre * @return Article */ public function setTitre($titre) { $this->titre = $titre; return $this; } /** * Get titre * * @return string */ public function getTitre() { return $this->titre; } /** * Set datePub * * @param \DateTime $datePub * @return Article */ public function setDatePub($datePub) { $this->datePub = $datePub; return $this; } /** * Get datePub * * @return \DateTime */ public function getDatePub() { return $this->datePub; } /** * Set contenue * * @param string $contenue * @return Article */ public function setContenue($contenue) { $this->contenue = $contenue; return $this; } /** * Get contenue * * @return string */ public function getContenue() { return $this->contenue; } /** * Set auteur * * @param string $auteur * @return Article */ public function setAuteur($auteur) { $this->auteur = $auteur; return $this; } /** * Get auteur * * @return string */ public function getAuteur() { return $this->auteur; } /** * Set publication * * @param boolean $publication * @return Article */ public function setPublication($publication) { $this->publication = $publication; return $this; } /** * Get publication * * @return boolean */ public function getPublication() { return $this->publication; } /** * Set image * * @param integer $image * @return Article */ public function setImage($image) { $this->image = $image; return $this; } /** * Get image * * @return integer */ public function getImage() { return $this->image; } }
<?php namespace Blog\newsBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * * @ORM\Table(name="images") * @ORM\Entity(repositoryClass="Blog\newsBundle\Entity\ImageRepository") */ class Image { /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** *@ORM\OneToOne(targetEntity="Article" , inversedBy="image") *@ORM\JoinColumn(name="article_id" , referencedColumnName="id") */ private $article; /** * @var string * * @ORM\Column(name="url", type="string", length=255) */ private $url; /** * @var string * * @ORM\Column(name="alt", type="string", length=255) */ private $alt; /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * Set url * * @param string $url * @return Image */ public function setUrl($url) { $this->url = $url; return $this; } /** * Get url * * @return string */ public function getUrl() { return $this->url; } /** * Set alt * * @param string $alt * @return Image */ public function setAlt($alt) { $this->alt = $alt; return $this; } /** * Get alt * * @return string */ public function getAlt() { return $this->alt; } /** * Set article * * @param \Blog\newsBundle\Entity\Article $article * @return Image */ public function setArticle(\Blog\newsBundle\Entity\Article $article = null) { $this->article = $article; return $this; } /** * Get article * * @return \Blog\newsBundle\Entity\Article */ public function getArticle() { return $this->article; } public function __toString() { return strval($this->id); } }
<?php namespace Blog\newsBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolverInterface; use Blog\newsBundle\Form\ImageType; class ArticleType extends AbstractType { /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('titre','text') ->add('datePub','date') ->add('contenue','textarea') ->add('auteur','text') ->add('publication','checkbox',array('required'=>false)) ->add('image',new ImageType(),array("by_reference" =>false)) ->add('Submit','submit') ->add('Reset','reset') ; } /** * @param OptionsResolverInterface $resolver */ public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Blog\newsBundle\Entity\Article' )); } /** * @return string */ public function getName() { return 'blog_newsbundle_articletype'; } }
<?php namespace Blog\newsBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolverInterface; class ImageType extends AbstractType { /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('url','text') ->add('alt','text') ; } /** * @param OptionsResolverInterface $resolver */ public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Blog\newsBundle\Entity\Image' )); } /** * @return string */ public function getName() { return 'blog_newsbundle_imagetype'; } }
Le controlleur
<?php namespace Blog\newsBundle\Controller; use Blog\newsBundle\Entity\Article; use Blog\newsBundle\Form\ArticleType; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; class DefaultController extends Controller { public function indexAction($name) { return $this->render('BlognewsBundle:Default:index.html.twig', array('name' => $name)); } public function ajouterAction(Request $request) { $article=new Article(); $formBuilder=$this->createFormBuilder($article); $formBuilder->add('titre','text') ->add('datePub','date') ->add('auteur','text') ->add('contenue','textarea') ->add('publication','checkbox',array('required'=>false)) ->add('Envoyer','submit') ->add('Cancel','reset'); //A partir du formBuilder on genere le formulaire $form=$formBuilder->getForm(); $request=$this->get('request'); if($request->getMethod()=="POST") { $form->bind($request); if($form->isValid()) { $em=$this->getDoctrine()->getManager(); $em->persist($article); $em->flush(); return $this->redirect($this->generateUrl("blognews_afficher",array("id"=>$article->getId()))); } } return $this->render("BlognewsBundle:Default:ajouter.html.twig",array('form'=>$form->createView())); } public function afficherAction($id) { $em=$this->getDoctrine()->getRepository('Blog\newsBundle\Entity\Article'); $article=$em->find($id); return $this->render('BlognewsBundle:Default:afficher.html.twig',array('article'=>$article)); } public function ajouter2Action() { $article=new Article(); $form=$this->createForm(new ArticleType(),$article); $request=$this->get('request'); if($request->getMethod()=='POST') { $form->bind($request); if($form->isValid()) { $em=$this->getDoctrine()->getManager(); $em->persist($article); $em->persist($article->getImage()); $em->flush(); return $this->redirect($this->generateUrl('blognews_afficher',array('id'=>$article->getId()))); } } return $this->render("BlognewsBundle:Default:ajouter.html.twig",array('form'=>$form->createView())); } }
<form action="{{ path("blognews_ajouter2") }}" method="post" {{ form_enctype(form)}}> {{ form_errors(form) }} <div> {{ form_errors(form.titre) }} {{ form_label(form.titre,"Titre de l'article ") }} {{ form_widget(form.titre) }} </div> <div> {{ form_errors(form.contenue) }} {{ form_label(form.contenue,"Contenue de l'article")}} {{ form_widget(form.contenue)}} </div> {{ form_rest(form) }} </form>