IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Embed form avec relation one to many


Sujet :

Symfony PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2012
    Messages : 46
    Points : 34
    Points
    34
    Par défaut Embed form avec relation one to many
    Bonjour à tous,

    Je suis face a un petit problème. Je suis certain que c'est une bétise mais ca me bloque.

    J'ai donc une table menu liée a une table menuCulture en oneToMany.

    Ma relation est fonctionnelle, il n'y a pas de problème pour ca.

    Cependant, je souhaiterais pouvoir créer un formulaire qui me permettrais de créer un menu et dans le meme formulaire, avoir les différents formulaire menuCulture.
    Pour se faire, j'ai une boucle qui ajoute des menuCulture->setLocale(...) a l'objet menu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    public function newAction()
        {
            $entity = new Menu();
     
            foreach (array('nl_NL', 'fr_FR', 'de_DE', 'en_US') as $culture) {
                $menuCulture = new MenuCulture();
                $menuCulture->setLocale($culture);
                $entity->addCulture($menuCulture);
            }
            $em->persist($entity);
     
            $form   = $this->createCreateForm($entity);
     
            return $this->render('KevinrolinbeAppmenuBundle:Menu:new.html.twig', array(
                'entity' => $entity,
                'form'   => $form->createView(),
            ));
        }
    Dans mon MenuType je tente de simplement afficher le champs cultures ou d'afficher depuis une collection mais rien de concluant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    class MenuType extends AbstractType
    {
        /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('createdAt')
                ->add('active')
                ->add('image')
                //->add('cultures')
                ->add('cultures', 'collection', array(
                        'type' => new MenuCultureType(),
                        'allow_add' => true,
                        'allow_delete' => true,
                        'prototype' => true,
                        'label' => 'Cultures',
                        'options' => array("data_class" => 'Kevinrolinbe\AppmenuBundle\Entity\MenuCulture'),
                        ))
            ;
        }
    }
    Pour vous aider, voici mes entities:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    <?php
     
    namespace Kevinrolinbe\AppmenuBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Component\Validator\Constraints as Assert;
     
    /**
     * Menu
     *
     * @ORM\Table(name="appmenu_menu")
     * @ORM\Entity
     * @ORM\HasLifecycleCallbacks
     */
    class Menu
    {
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @ORM\OneToMany(targetEntity="Kevinrolinbe\AppmenuBundle\Entity\MenuCulture", mappedBy="owner", cascade={"persist", "remove"})
         */
         private $cultures;
     
     
     
        /**
         * Constructor
         */
        public function __construct()
        {
            $this->cultures = new \Doctrine\Common\Collections\ArrayCollection();
        }
     
        /**
         * Get id
         *
         * @return integer 
         */
        public function getId()
        {
            return $this->id;
        }
     
        /**
         * Add cultures
         *
         * @param \Kevinrolinbe\AppmenuBundle\Entity\MenuCulture $cultures
         * @return Menu
         */
        public function addCulture(\Kevinrolinbe\AppmenuBundle\Entity\MenuCulture $cultures)
        {
            $this->cultures[] = $cultures;
     
            return $this;
        }
     
        /**
         * Remove cultures
         *
         * @param \Kevinrolinbe\AppmenuBundle\Entity\MenuCulture $cultures
         */
        public function removeCulture(\Kevinrolinbe\AppmenuBundle\Entity\MenuCulture $cultures)
        {
            $this->cultures->removeElement($cultures);
        }
     
        /**
         * Get cultures
         *
         * @return \Doctrine\Common\Collections\Collection 
         */
        public function getCultures()
        {
            return $this->cultures;
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
     
    <?php
     
    namespace Kevinrolinbe\AppmenuBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * MenuCulture
     *
     * @ORM\Table(name="appmenu_menu_culture")
     * @ORM\Entity
     */
    class MenuCulture
    {
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @var Kevinrolinbe\AppmenuBundle\Entity\Menu
         * 
         * @ORM\ManyToOne(targetEntity="Kevinrolinbe\AppmenuBundle\Entity\Menu", inversedBy="Menu")
         * @ORM\JoinColumn(name="owner", referencedColumnName="id")
         */
        private $owner;
     
        /**
         * @var string
         *
         * @ORM\Column(name="locale", type="string", length=255)
         */
        private $locale;
     
     
     
        /**
         * Get id
         *
         * @return integer 
         */
        public function getId()
        {
            return $this->id;
        }
     
        /**
         * Set locale
         *
         * @param string $locale
         * @return MenuCulture
         */
        public function setLocale($locale)
        {
            $this->locale = $locale;
     
            return $this;
        }
     
        /**
         * Get locale
         *
         * @return string 
         */
        public function getLocale()
        {
            return $this->locale;
        }
     
        /**
         * Set owner
         *
         * @param \Kevinrolinbe\AppmenuBundle\Entity\Menu $owner
         * @return MenuCulture
         */
        public function setOwner(\Kevinrolinbe\AppmenuBundle\Entity\Menu $owner = null)
        {
            $this->owner = $owner;
     
            return $this;
        }
     
        /**
         * Get owner
         *
         * @return \Kevinrolinbe\AppmenuBundle\Entity\Menu 
         */
        public function getOwner()
        {
            return $this->owner;
        }
     
        public function toArray(){
            return array(
                'locale' => $this->getLocale(),
                'title' => $this->getTitle(),
                'summary' => $this->getSummary()
            );
        }
    }
    J'ai bien entendu limité les champs pour ne pas faire un post trop long.

    Sauriez vous me guider?
    Car à force de tester toutes les solutions que je trouve je ne sais plus vers quoi m'orienter :/

    Merci à vous,
    Dyron

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    Tu utilises une collection, normalement il suffit de la peupler de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $menu = new Menu(); //j'ai un objet menu (peut etre que tu l'obtiens par ta bdd, mais c'est pas important)
    $menu->addCulture( new MenuCulture() );  //je lui rajoute des cultures
    $menu->addCulture( new MenuCulture() );
    $this->createForm(new MenuType(), $menu); //je dit a mon formulaire de s'hydrater avec l'objet menu, qui contiens des menuCultures

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2012
    Messages : 46
    Points : 34
    Points
    34
    Par défaut
    En effet, c'est ce que j'ai tenté de réaliser dans le code précédent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    public function newAction()
        {
            $entity = new Menu();
     
            foreach (array('nl_NL', 'fr_FR', 'de_DE', 'en_US') as $culture) {
                $menuCulture = new MenuCulture();
                $menuCulture->setLocale($culture);
                $entity->addCulture($menuCulture);
            }
            $em->persist($entity);
     
            $form   = $this->createCreateForm($entity);
     
            return $this->render('KevinrolinbeAppmenuBundle:Menu:new.html.twig', array(
                'entity' => $entity,
                'form'   => $form->createView(),
            ));
        }

    Mais la je me demande ce qu'il faut indiquer exactement dans le MenuType... Ets ce que ce que j'ai mis est correcte?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ->add('cultures', 'collection', array(
                        'type' => new MenuCultureType(),
                        'allow_add' => true,
                        'allow_delete' => true,
                        'prototype' => true,
                        'label' => 'Cultures',
                        'options' => array("data_class" => 'Kevinrolinbe\AppmenuBundle\Entity\MenuCulture'),
                        ))
    Car si je fait un simple "->add('cultures')" j'obtiens ceci:
    A "__toString()" method was not found on the objects of type "Kevinrolinbe\AppmenuBundle\Entity\MenuCulture" passed to the choice field. To read a custom getter instead, set the option "property" to the desired property path.

  4. #4
    Membre averti Avatar de Philcmoi
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    632
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 632
    Points : 405
    Points
    405
    Par défaut
    vus dans un tutoriel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    `->add(menuculture","entity",array
    "class" =>Bundle\Entity\menuculture,
    "property" =>"nomMenueculture"
    ->add("Add",submit)
    ->getForm();

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2012
    Messages : 46
    Points : 34
    Points
    34
    Par défaut
    J'avais déja testé cette solution mais le fait d'ajouter une "entity" m'affiche un menu deroulant ( un <select> ) donc rien d'utilisable malheureusement.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    L'erreur me sembleassez explicite, t'as essayer de mettre un toString ou de spécifier un attribut comme elle te le demande?

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2012
    Messages : 46
    Points : 34
    Points
    34
    Par défaut
    J'avais déja testé le to string, si je le rajoute a mon entity, une fois le rendu du formulaire la valeur du tostring apparaît dans un <option>.
    attribut ? j'ai essayé tout ce que j'ai pu trouver mais rien n'y fait...

    Tout ce que je souhaite, c'est utiliser le formulaire de menuCulture imbriqué dans le formulaire menu.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    Peux tu poster ton menuCultureType?

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2012
    Messages : 46
    Points : 34
    Points
    34
    Par défaut
    le voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    <?php
     
    namespace Kevinrolinbe\AppmenuBundle\Form;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
     
    class MenuCultureType extends AbstractType
    {
            /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('locale')
                ->add('title')
                ->add('summary')
                ->add('owner') //fait le lien avec le champ id de l'entity menu
            ;
        }
     
        /**
         * @param OptionsResolverInterface $resolver
         */
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'Kevinrolinbe\AppmenuBundle\Entity\MenuCulture'
            ));
        }
     
        /**
         * @return string
         */
        public function getName()
        {
            return 'kevinrolinbe_appmenubundle_menuculture';
        }
    }

Discussions similaires

  1. Comment récupérer une liste avec une relation one to many ?
    Par tomlaurent dans le forum Hibernate
    Réponses: 1
    Dernier message: 07/11/2011, 08h16
  2. Problème lors d'un delete avec une relation one-to-many
    Par el_harrathi dans le forum Développement Web en Java
    Réponses: 2
    Dernier message: 01/11/2011, 16h01
  3. [Mapping] Problème avec la relation one-to-many
    Par nadhir84 dans le forum Hibernate
    Réponses: 4
    Dernier message: 16/08/2011, 16h32
  4. lister une table avec relation one-to-many
    Par dublow dans le forum ASP.NET MVC
    Réponses: 1
    Dernier message: 27/10/2010, 11h42
  5. [hibernate] relation one-to-many avec plusieurs clés
    Par seb_fou dans le forum Hibernate
    Réponses: 6
    Dernier message: 16/03/2006, 15h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo