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 :

Imbriquer une Collection de Formulaires , Relation Many-To-One avec attributs


Sujet :

Symfony PHP

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 128
    Points : 79
    Points
    79
    Par défaut Imbriquer une Collection de Formulaires , Relation Many-To-One avec attributs
    Salut

    J'ai deux entités, Product et Feature (caractéristique: largeur, hauteur, composition ...) et une autre entité intermédiaire ProductFeature qui fait la relation entre les deux autres entités.

    Je voudrais afficher toutes les Features dans la forme lors de l'ajout de nouveaux produits comme celui-ci mais j'ai pas réussi :

    Nom : features.jpg
Affichages : 1035
Taille : 31,2 Ko

    Voici mon code :

    ProductType

    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
     
    class ProductType extends AbstractType
    {
     
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
     
        $builder
            //.....
            ->add('productFeatures', 'collection', array(
            'type' => new ProductFeatureType(),
            ))
        ;
    }
     
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Project\StoreBundle\Entity\Product'
        ));
    }
     
    }
    ProductFeatureType

    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
     
    class ProductFeatureType extends AbstractType
    {
     
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('value', 'text');
    }
     
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Project\StoreBundle\Entity\ProductFeature'
        ));
    }
     
    }
    FeatureType

    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
     
    class FeatureType extends AbstractType
    {
     
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', 'text', array(
             'required' => true,
             'label' => 'Feature',
             'attr' => array('class' =>'form-control'),
             ))
        ;
    }
     
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Project\StoreBundle\Entity\Feature'
        ));
    }
     
     
    }
    form.html.twig

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    {% for feature in form.productFeatures %}
                            <div class="form-group">
                                {{ form_label(form.feature, null, { 'label_attr': {'class': 'col-sm-3 control-label'} }) }}
                                <div class="col-sm-7">
     
                                {{ form_row(feature.name) }}
     
                                </div>
                                {{ form_errors(form.feature) }}
                            </div>
                        {% endfor %}
    Entity\Product

    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
     
    class Product
    {
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
     
    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255, nullable=false)
     */
    private $name;
     
     //....
     
     /**
     * @ORM\OneToMany(targetEntity="Project\StoreBundle\Entity\ProductFeature", mappedBy="product", cascade={"persist"})
     * @ORM\JoinColumn(nullable=true)
     */
     private $productFeatures ;
     
    public function __construct()
    {
        $this->categories = new \Doctrine\Common\Collections\ArrayCollection();
        $this->productFeatures = new \Doctrine\Common\Collections\ArrayCollection();
    }
     
    //........
     
    /**
     * Add productFeatures
     *
     * @param \Project\StoreBundle\Entity\ProductFeature $productFeatures
     * @return Product
     */
    public function addProductFeature(\Project\StoreBundle\Entity\ProductFeature $productFeatures)
    {
        $this->productFeatures[] = $productFeatures;
     
        return $this;
    }
     
    /**
     * Remove productFeatures
     *
     * @param \Project\StoreBundle\Entity\ProductFeature $productFeatures
     */
    public function removeProductFeature(\Project\StoreBundle\Entity\ProductFeature $productFeatures)
    {
        $this->productFeatures->removeElement($productFeatures);
    }
     
    /**
     * Get productFeatures
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getProductFeatures()
    {
        return $this->productFeatures;
    }
    Entity\Feature

    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
     
    class Feature
    {
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
     
    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;
     
     
    /**
    * @ORM\ManyToOne(targetEntity="Project\StoreBundle\Entity\Store", inversedBy="features", cascade={"persist"})
    * @ORM\JoinColumn(nullable=true)
    */
    private $store ;
     
     
    /**
     * Constructor
     */
    public function __construct()
    {
        $this->products = new \Doctrine\Common\Collections\ArrayCollection();
    }
     
     
    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }
     
    /**
     * Set name
     *
     * @param string $name
     * @return Feature
     */
    public function setName($name)
    {
        $this->name = $name;
     
        return $this;
    }
     
    /**
     * Get name
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }
     
     
    /**
     * Set store
     *
     * @param \Project\StoreBundle\Entity\Store $store
     * @return Feature
     */
    public function setStore(\Project\StoreBundle\Entity\Store $store = null)
    {
        $this->store = $store;
     
        return $this;
    }
     
    /**
     * Get store
     *
     * @return \Project\StoreBundle\Entity\Store
     */
    public function getStore()
    {
        return $this->store;
    }
     
    }
    Entity\ProductFeature

    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
     
    class ProductFeature
    {
    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Project\StoreBundle\Entity\Product", inversedBy="productFeatures")
     */
    private $product;
     
    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Project\StoreBundle\Entity\Feature")
     */
    private $feature;
     
     
    /**
     * @var string
     *
     * @ORM\Column(name="value", type="string", length=255)
     */
    private $value;
     
     
    /**
     * Set value
     *
     * @param string $value
     * @return ProductFeature
     */
    public function setValue($value)
    {
        $this->value = $value;
     
        return $this;
    }
     
    /**
     * Get value
     *
     * @return string
     */
    public function getValue()
    {
        return $this->value;
    }
     
    /**
     * Set product
     *
     * @param \Project\StoreBundle\Entity\Product $product
     * @return ProductFeature
     */
    public function setProduct(\Project\StoreBundle\Entity\Product $product)
    {
        $product->addProductFeature($this);
     
        $this->product = $product;
     
        return $this;
    }
     
    /**
     * Get product
     *
     * @return \Project\StoreBundle\Entity\Product
     */
    public function getProduct()
    {
        return $this->product;
    }
     
    /**
     * Set feature
     *
     * @param \Project\StoreBundle\Entity\Feature $feature
     * @return ProductFeature
     */
    public function setFeature(\Project\StoreBundle\Entity\Feature $feature)
    {
        $this->feature = $feature;
     
        return $this;
    }
     
    /**
     * Get feature
     *
     * @return \Project\StoreBundle\Entity\Feature
     */
    public function getFeature()
    {
        return $this->feature;
    }
    }
    Merci d'avance

  2. #2
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    yeeeeaah cool man rastafariiiiii,


    si tu débute en Symfony et que tu es perdu dans la fumée alors voici une astuce pour refaire tout ça.


    1 - tu créais ton modèle de données avec un outil genre mySqlWorkbench (table et relation), tu exporte en .sql à partir de ce logiciel et avec ça tu créais tes tables, en base de donnée mySql
    2 - ensuite tu génère tes entités à partir de la base de donnée (commande Symfony)
    3 - tu génère un CRUD sur tes entités (commande Symfony)

    tu analyses le crud ainsi généré pour te faire la main.

    voilà mon petit conseil de derrière les fagots pour les débutants.


    yééééééééééééahhh

    sinon faut nous dire ton erreur, c'est quoi le soucis ...

  3. #3
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 128
    Points : 79
    Points
    79
    Par défaut
    J'ai essayé avec CRUD mais ca ne satisfait pas tous les besoins.

    Je voudrais afficher toutes les Features dans la forme lors de l'ajout de nouveaux produits mais j'ai pas réussi.
    Je pense qu' il faut que ajouter une collection de ProductFeatureType dans ProductType mais j'ai pas trouvé comment

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 150
    Points : 157
    Points
    157
    Par défaut
    Bonjour,

    Pouvez vous détaillez ce que vous voulez dire par :
    Je voudrais afficher toutes les Features dans la forme lors de l'ajout de nouveaux produits

  5. #5
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 128
    Points : 79
    Points
    79
    Par défaut
    OUI

    C'est site boutique en ligne , dans la partie administration l’utilisateur peut créer des caractéristiques(Features en anglais) et lors l'ajout de nouveaux produits il peut donner à chaque produit ses propres caractéristiques ,

    produit1 => largeur 150 , hauteur => 220
    produit2 => largeur 200 , hauteur => 320

    donc je voudrais afficher dans la forme la liste des noms caractéristiques et devant chacune il y'a un champ texte pour donner le valeur.
    Voici une image exemple de formulaire :

    Nom : features.jpg
Affichages : 952
Taille : 31,2 Ko

    et voici la table qui fait la relation entre Product et Feature

    Nom : table3.jpg
Affichages : 961
Taille : 27,0 Ko

    Donc le problème c'est comment faire dans formBuilder pour afficher tous les caractéristiques dans la formulaire avec un champ texte pour donner les valeurs pour chaque produit.

    C'est une chose qui ressemble un peux l'ajout des produit dans prestaShop

    Nom : p.jpg
Affichages : 1005
Taille : 215,9 Ko

  6. #6
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    yoo rastafariiiiiiiiiiiiiiii,

    tout est expliqué dans la doc officielle, et divers tutos qu'on trouve partout.

    suffit de prendre exemple la dessus.... google est ton ami

Discussions similaires

  1. [Mapping] Relation <many-to-one> avec dans les 2 tables, 2 champs de noms différents
    Par thomas_31 dans le forum Hibernate
    Réponses: 3
    Dernier message: 26/09/2012, 15h14
  2. Réponses: 2
    Dernier message: 12/03/2010, 16h10
  3. problème de jointure dans une relation many to one
    Par info_plus dans le forum JPA
    Réponses: 1
    Dernier message: 25/12/2008, 12h29
  4. relation many-to-one avec clefs composites
    Par Foub dans le forum Hibernate
    Réponses: 2
    Dernier message: 27/09/2007, 14h33
  5. Relation Many-to-One dans une application JSF
    Par KooKoolen dans le forum JSF
    Réponses: 1
    Dernier message: 27/12/2006, 14h13

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