2016-12-24 7 views
0

私は問題がある、私はContenu(One)とArticle(Many)の2つのエンティティを持っている、私はそれが双方向の関係を作る。コレクションフォーム戻り値の代わりにオブジェクトOneToMany

私はFormTypeを使用します。フォームを送信すると、オブジェクトではなくエンティティアーティクルの配列があり、配列で保持することができません。

あなたはすべてのソリューションを持っている場合は、感謝

エンティティContenu

<?php 

/** 
* Contenu 
* 
* @ORM\Table(name="ge_contenu") 
* @ORM\Entity(repositoryClass="GE\MainBundle\Repository\ContenuRepository") 
*/ 
class Contenu 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="entete", type="text") 
    */ 
    private $entete; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="texte", type="text") 
    */ 
    private $texte; 


    /** 
    * @var string 
    * 
    * @ORM\Column(name="conclusion", type="text") 
    */ 
    private $conclusion; 

    /** 
    * @ORM\OneToMany(targetEntity="AdminBundle\Entity\Article", mappedBy="contenu") 
    */ 
    private $articles;  


    /** 
    * Get id 
    * 
    * @return int 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set texte 
    * 
    * @param string $texte 
    * 
    * @return Contenu 
    */ 
    public function setTexte($texte) 
    { 
     $this->texte = $texte; 

     return $this; 
    } 

    /** 
    * Get texte 
    * 
    * @return string 
    */ 
    public function getTexte() 
    { 
     return $this->texte; 
    } 

    /** 
    * Set entete 
    * 
    * @param string $entete 
    * 
    * @return Contenu 
    */ 
    public function setEntete($entete) 
    { 
     $this->entete = $entete; 

     return $this; 
    } 

    /** 
    * Get entete 
    * 
    * @return string 
    */ 
    public function getEntete() 
    { 
     return $this->entete; 
    } 

    /** 
    * Set conclusion 
    * 
    * @param string $conclusion 
    * 
    * @return Contenu 
    */ 
    public function setConclusion($conclusion) 
    { 
     $this->conclusion = $conclusion; 

     return $this; 
    } 

    /** 
    * Get conclusion 
    * 
    * @return string 
    */ 
    public function getConclusion() 
    { 
     return $this->conclusion; 
    } 

    /** 
    * Constructor 
    */ 
    public function __construct() 
    { 
     $this->articles = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

    /** 
    * Add article 
    * 
    * @param \AdminBundle\Entity\Article $article 
    * 
    * @return Contenu 
    */ 
    public function addArticle(\AdminBundle\Entity\Article $article) 
    { 
     $this->articles[] = $article; 

     $article->setContenu($this); 

     return $this; 
    } 

    /** 
    * Remove article 
    * 
    * @param \AdminBundle\Entity\Article $article 
    */ 
    public function removeArticle(\AdminBundle\Entity\Article $article) 
    { 
     $this->articles->removeElement($article); 
    } 

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

エンティティ条

<?php 

/** 
* Article 
* 
* @ORM\Table(name="ge_article") 
* @ORM\Entity(repositoryClass="GE\MainBundle\Repository\ArticleRepository") 
*/ 
class Article 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="titre", type="string", length=150) 
    */ 
    private $titre; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="texte", type="text") 
    */ 
    private $texte; 

    /** 
    * @var Article $article 
    * 
    * @ORM\ManyToOne(targetEntity="AdminBundle\Entity\Contenu", inversedBy="articles") 
    * @ORM\JoinColumn(nullable=false) 
    */ 
    public $contenu; 

    /** 
    * Get id 
    * 
    * @return int 
    */ 
    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 texte 
    * 
    * @param string $texte 
    * 
    * @return Article 
    */ 
    public function setTexte($texte) 
    { 
     $this->texte = $texte; 

     return $this; 
    } 

    /** 
    * Get texte 
    * 
    * @return string 
    */ 
    public function getTexte() 
    { 
     return $this->texte; 
    } 

    /** 
    * Set contenu 
    * 
    * @param \AdminBundle\Entity\Contenu $contenu 
    * 
    * @return Article 
    */ 
    public function setContenu(\AdminBundle\Entity\Contenu $contenu) 
    { 
     $this->contenu = $contenu; 

     return $this; 
    } 

    /** 
    * Get contenu 
    * 
    * @return \AdminBundle\Entity\Contenu 
    */ 
    public function getContenu() 
    { 
     return $this->contenu; 
    } 
} 

私のコントローラ

public function contenuAction($id = null, Request $request) 
{ 
    $em = $this 
     ->getDoctrine() 
     ->getManager()   
    ; 

    $pages_contenu = $em->getRepository('AdminBundle:Page')->findBy(
     array("contenu" => true), 
     array("nom" => "asc"), 
     null, 
     null 
    ); 

    $vars = array(
     "modif" => null, 
     "modif" => null, 
     "pages_contenu" => $pages_contenu 
    ); 


    if (isset($id)) 
    { 
     $contenu = $em->getRepository('AdminBundle:Contenu')->findOneById($id); 

     if ($contenu == null) 
     { 
      $contenu = new Contenu(); 
      $vars["modif"] = $contenu; 
     } 
     else 
     { 
      $vars["modif"] = $contenu; 
     } 
    } 
    else 
    { 
     $contenu = new Contenu(); 
    } 

    $form = $this->get('form.factory')->create(ContenuType::class, $contenu); 

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


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

     $request->getSession()->getFlashBag()->set('valid', 'Contenu bien enregistré.'); 

     return $this->redirectToRoute('admin_contenu'); 
    } 

    $vars['form'] = $form->createView(); 

    return $this->render('AdminBundle:Admin:contenu.html.twig', $vars); 
} 

Contenuタイプ

class ContenuType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
    $builder 
     ->add('entete',  TextareaType::class) 
     ->add('texte',  TextareaType::class) 
     ->add('articles',  CollectionType::class, array(
       'entry_type' => ArticleType::class, 
       'allow_add' => true, 
       'allow_delete' => true 
      )) 
     ->add('conclusion', TextareaType::class) 
     ->add('submit', SubmitType::class, array('label' => 'Enregistrer')) 
    ; 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
    $resolver->setDefaults(array(
     'data_class' => 'AdminBundle\Entity\Contenu' 
    )); 
    } 

    public function getName() 
    { 
    return 'adminbundle_contenu'; 
    } 
} 

Article Type 

    class ArticleType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
    $builder 
     ->add('titre',  TextType::class) 
     ->add('texte',  TextareaType::class) 
    ; 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
    $resolver->setDefaults(array(
     'data_class' => 'AdminBundle\Entity\Article' 
    )); 
    } 

    public function getName() 
    { 
    return 'adminbundle_article'; 
    } 
} 

答えて

0

あなたのArticleTypeクラスに次のメソッドを追加する必要があります。

public function configureOptions(OptionsResolver $resolver) { 
    $resolver->setDefaults(array(
     'data_class' => 'AdminBundle\Entity\ArticleType' 
    )); 
} 
関連する問題