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 :

Création dynamique de champs dans un formulaire [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 135
    Points : 153
    Points
    153
    Par défaut Création dynamique de champs dans un formulaire
    Bonjour,

    J'ai un formulaire avec les informations profil (nom prenom date de naissance) ProfilForm et un sous formulaire AdressesForm où j'ai les adresses.

    Dans ProfilForm j'ai ajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            $builder->add('adresses', 'collection', array(
        	    	'type' => new AdressesForm(),
        	    	'required' => false,
        	'error_bubbling'=>true
        	));
    qui fait appel au formulaire AdressesForm.


    Dans la page twig je propose à l'utilisateur d'ajouter de nouvelles adresses mais je ne vois pas trop comment le faire car aujourd'hui je suis obligé de créer des adresses vides avant de faire appel au formulaire Profil afin de les modifier. Mais je cherche une solution car je ne peux pas savoir à l'avance combien d'adresses il veut remplir...
    En fait j'ai plusieurs idées :
    1ere : Dissocier les deux formulaires Profil et Adresses, puis créer des formulaires en Jquery/Ajax et les validés à la voler (mais j'aime pas)
    2eme : trouver un moyen de lui rajouter dynamiquement des champs dans le formulaire, ce que j'ai fait mais il me renvoie une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Ce formulaire ne doit pas contenir des champs supplémentaires
    Donc si vous avez une idée ou une piste à me donner . Merci.

    Cordialement

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    bonjour,
    regarde du coté des options allow_add, allow_delete et prototype et consulte ce lien :

    https://github.com/beberlei/AcmePizz...ndex.html.twig

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 135
    Points : 153
    Points
    153
    Par défaut
    Re, merci je suis allez voir le lien, j'ai suivi des tutoriels Symfony mais j'ai une erreur et je cherche depuis toute l'après-midi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Expected argument of type "object or array", "NULL" given

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Il faudrait plus d'infos sur cette erreur (quel objet, quel méthode,...) ainsi que le mapping de tes entités et le code du controller.

    Néammoins peut être que ça vient de l'option required=false.
    enlève la, elle me semble de toute façon inutile (il y aura toujours une collection dans l'attribut adresses, même si elle ne contient aucun item)

    En attendant voici un exemple d'implémentation au niveau du formulaire et de l'entité.
    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
     
    //// My/Bundle/Form/ProfilType
    	$builder->add('adresses', 'collection', array(
    			    	'type' => new AdressesForm(),
    					'error_bubbling'=>true,
    					'allow_add'=>true,
    					'allow_delete'=>true,
    					'prototype'=>true,
    					'by_reference' => false,
    			));
    /*l'option 'by_reference' indique que le binding  appelera la méthode setAdress de l'entité Profil
    sinon le binding se ferait ainsi :
    foreach($adressInForm as $adress){
    	$profil->getAdresse()[]=$adress;//pas de référence inversé dans adresse!
    }
    */
    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
     
    //// My/Bundle/Entity/Profil
    /**
    * @ORM\OneToMany(targetEntity="Adress", mappedBy="profil",  cascade={"persist", "remove", "merge"}, orphanRemoval=true )
    * l'option orphanRemoval indique que les entités Adress n'ayant pas de relation avec une entité profile doivent être supprimés de la BDD
    */
    private $adresses;
     
    public function __construct(){
    	$this->adresses=new \Doctrine\Common\Collections\ArrayCollection();
    }
    public getAdresses(){
    	return $this->adresses;
    }
    /* ajoute la référence à profil dans l'adresse*/
    public function addAdress(Adress $adress){
    	$adress->setProfil($this);
    	$this->adresses[]=$adress;
    }
    // function qui sera appelé par le formulaire*/
    public function setAdresses($listOfAdress){
    	$this->adresses=new \Doctrine\Common\Collections\ArrayCollection();
    	foreach($listOfAdress as $adress){
    		$this->addAdress($adress);
    	}
    }
    d'aprés http://sf.khepin.com/2011/08/inconsi...orm-framework/

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 135
    Points : 153
    Points
    153
    Par défaut
    Re, merci c'est bon j'ai trouvé.
    En fait j'avais un problème avec un champ read_only.

    Par contre l'ajout marche bien mais quand je veux supprimer sa ne me le supprime pas... J'ai bien mis
    De plus, je comprends pas parce que quand je supprime une adresse et que je valide il me renvoie la page sans l'adresse supprimer (donc ca va) mais quand je clique sur le lien ou il y a toute mes adresses il est toujours présente! (je n'ai pas oublié le:

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Est ce que tu as bien le parametre "orphanRemoval" dans ton mapping?

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 135
    Points : 153
    Points
    153
    Par défaut
    Ah ok. En effet c'était cela. Par contre mon autre problème est revenue c'est-a-dire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Objet or array, null given
    L'erreur vient d'un champ que je met en hidden.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $builder->add('typeCoordonnee', 'hidden', array(
        	    			'required' => true,
        	    			'read_only'=>true,
        	    			'property_path'=>'typeCoordonnee.libelle',
        	    			'error_bubbling'=>true
        	));
    Ce champ sera affiché pour chaque adresse et quand je génère une adresse j'ajoute ce champ et sa me met cette erreur.

  8. #8
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    S'il ne s'agit que de l'affichage, pourquoi le mettre dans un champ du formulaire, on pourrait faire simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    {{form.vars.value.typeCoordonnee.libelle}}

  9. #9
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 135
    Points : 153
    Points
    153
    Par défaut
    Non je ne l'affiche même pas. C'est juste un paramètre que je change en fonction de l'adresse. Et c'est lors de la validation qui me donne cette erreur...

  10. #10
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    typeCoordonnée est une entité en relation avec adresse c'est bien ça ?

    pourquoi faut-il l'envoyer coté client: tu fais des traitements javascript avec?

    n'est t'il pas possible de faire ces traitements dans l'entité
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    /// My\Bundle\Entity\Adress
    public function __construct(){
    $this->typeCoordonnee=new TypeCoordonee();
    $this->typeCoordonnee->setLibelle('profil adress...');
    }
    ou bien
    /*
    * @PrePersist,@PreUpdate
    */
    public function updateTypeCoordonne(){
    // calculé les valeurs de TypeCoordonées en fonction de l'adresse en cours
    }

  11. #11
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 135
    Points : 153
    Points
    153
    Par défaut
    TypeCoordonnee est bien en relation avec adresse. Elle a deux valeurs Personnelle ou Professsionnelle. Et sur ma page je propose d'ajouter des adresses personnelle et professionnelle donc c'est a ce moment la que je dois les différencier et non dans le cote serveur...
    Sinon je peux essayer de mettre le champs en type text mais je le met en display none? c'est pas tres jolie mais bon...

    Mais je comprends pas pourquoi il retourne une sur ce champ!

  12. #12
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Dans ce cas je ne comprend pas pourquoi tu n'affiche pas tout simplement une liste de choix si c'est l'utilisateur qui doit pouvoir choisir un type de coordonnées...

    Si tu n'as que deux type de coordonnées, pourquoi ne pas utiliser un booléen "isAdresseProfessionnel" plutôt qu'une table qui ne contient que 2 lignes?

    Ou bien ce que tu veux dire c'est que l'utilisateur:
    1 : choisi entre adresse pro et perso
    2 : ajoute des adresses de type pro ou perso en fonction du choix précédent
    Si c'est le cas tu pourrais gérer ça par un parametre supplémentaire dans la route

    C'est normal que tu ais une erreur le service de formulaire va essayer de faire un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $adress->setTypeCoordonnee($_POST['form']['typeCoordonnees'])
    L'option 'property_path' n'a pas l'air de fonctionner, et si elle fonctionnait elle ferait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $adress->getTypeCoordonnees()->setLibelle($_POST['form']['typeCoordonnees']'
    donc cela ne modifierait pas la relation mais uniquement le libellé de l'objet, ce qui casserait la cohérence de ta base de données base
    regarde également ce Bundle http://symfony2bundles.org/fr/Gregwar/FormBundle
    il permet de générer un champ hidden qui va représenter une entité

  13. #13
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 135
    Points : 153
    Points
    153
    Par défaut
    Re,
    désolé du retard. En effet j'ai utilisé un nouveau type de champ EntityId qui fait exactement ce que je veux!!
    Merci.

  14. #14
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Alors tu peux passer ce sujet en résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/08/2012, 14h07
  2. [1.x] EmbedForm et ajout dynamique de champ dans une formulaire.
    Par Noobboy dans le forum Symfony
    Réponses: 6
    Dernier message: 10/08/2011, 15h03
  3. [MySQL] Création dynamique de champs dans une table
    Par kamnouz dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 31/05/2011, 11h09
  4. [AC-2003] Création d'un champ dans un formulaire (Débutant)
    Par chicabonux dans le forum IHM
    Réponses: 4
    Dernier message: 23/05/2010, 20h27
  5. Ajout dynamique de champ dans un formulaire
    Par gendalf37400 dans le forum Ruby on Rails
    Réponses: 5
    Dernier message: 06/06/2007, 15h11

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