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 :

Ajout de plusieurs dates dans un formulaire [2.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 16
    Par défaut Ajout de plusieurs dates dans un formulaire
    Salut à tous,

    J'aurai une question, plutôt méthodologique que technique concernant les formulaires.

    Je possède un formulaire avec un champ date très classique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <?php 
    ->add('date','date', array('label'=> 'Date','format' => 'dd MM yyyy'))
    L'histoire, c'est que je souhaite mettre un bouton en dessous de ce champ pour rajouter un autre champ date, comme ça l'utilisateur pourra ajouter et choisir 3,4 dates.

    Maintenant, étant débutant dans le domaine, je ne vois pas comment récupérer ces dates pour les mettre dans la base de données.
    Je pense que c'est plus une question php que symfony2, mais défois qu'il y ait un truc simpa dans ce framework pour ça... je suis preneur.

    Merci d'avance

  2. #2
    Membre confirmé Avatar de Parmifer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2014
    Messages : 39
    Par défaut
    Salut à toi !

    Bon déjà si tu veux plusieurs champs de dates tu peux tout simplement les multipliers en donnant des noms du genre date1, date2, date3, etc...

    Ensuite, pour tout ce qui est relatif aux bases de données, tu as Doctrine qui marche bien (et qui est très utilisé).

    Je te laisse allez voir la documentation ici : http://symfony.com/fr/doc/current/book/doctrine.html

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Bonjour,

    je souhaite mettre un bouton en dessous de ce champ pour rajouter un autre champ date, comme ça l'utilisateur pourra ajouter et choisir 3,4 dates.
    Pour ça tu as le type de formulaire collection:
    http://symfony.com/fr/doc/current/co...llections.html

    Le formulaire n'est que le reflet de ta modélisation, si tu as +sieurs colonnes date dans ta table, ce n'est pas adapté.

    A priori il te faut une entité "Date" composé d'un attribut de type Date et une relation OneToMany avec ton entité principale.

  4. #4
    Membre confirmé Avatar de Parmifer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2014
    Messages : 39
    Par défaut
    Mince, j'avais mal lu, désolé pour les bétises alors.

    Cela dit, tu peux toujours allez voir Doctrine.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 16
    Par défaut
    Salut Parmifer merci pour ta réponse,

    alors, pour les champs date j'ai un ptit truc en place en ajax:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function ajout_date(i) {
    var i2 = i + 1;
    document.getElementById('date'+i).innerHTML = '<input type="date" name="date'+i+'"></span>';
    document.getElementById('date'+i).innerHTML += (i <= 30) ? '<br /><span id="date'+i2+'"><a href="javascript:ajout_date('+i2+')">Ajouter une date</a></span>' : '';
    }
    Concernant doctrine, c'est ce que j'utilise, j'ai mes entités en place en php, le tout en classe avec les liens en @ORM, bref j'ai essayé de respecter au maximum les conventions de Symfony.

    Du coup, je pensais à...

    _________

    Okay, apparition de réponses dans ma prévisualisation, merci pour les nouveaux messages.

    Bonjour arnooo999, merci pour ta réponse,

    Donc faut que je repense ma table, avec ce nouveau besoin, c'est noté.

    Du coup, si j'ai bien compris, je vire mon champ date de l'entity, je fais une nouvelle entité Date avec un onetomany et le nouveau formulaire DateType.
    j'imbrique le formulaire dans mon formtype avec un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $builder->add('dates', 'collection', array('type' => new DateType(), 'allow_add' => true));
    Avec le allow_add à true pour en ajouter autant que je veux.
    Je met mon morceau d'ajax en le bidouillant, ou je reprend celui de la doc que tu m'as fourni.
    Mon nouveau bouton d'ajout de date va donc créer un nouveau formulaire à l'intérieur du miens, et je peux en faire plusieurs.


    Par contre, j'ai un autre formulaire qui permet de modifier celui ci ( FormEditType ). Je conçois que je dois le bidouiller également. Mais une petite question, cela ne posera pas de problèmes d'avoir plusieurs dates si par exemple je veux en modifier une seule ?

    [HS]
    Pendant mes recherches, je pensais à l'array en php pour essayer de fusionner ces dates, du coup simple question de curiosité,penses tu que le data transformer pouvait répondre à ce problème?
    [/HS]

    Merci d'avance

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Pendant mes recherches, je pensais à l'array en php pour essayer de fusionner ces dates, du coup simple question de curiosité,penses tu que le data transformer pouvait répondre à ce problème?
    On pourrait simplement sérialiser ces dates pour les stocker dans la BDD, ça pourrait se faire dans les getter et setter
    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
     
    /**
    *@ORM\Column(type="text")
    **/
    protected $dates;
     
    protected $unserializedDates;
     
    public function getDates(){
     if (null===$this->unserializedDates){
         $dt=unserialize($this->dates);
         $this->unserializedDates=unserialize($this->date);     
     }
     return $this->unserializedDates;
    }
     
    public function setDates(array $dates){
    $this->unserializedDates=$dates;
    $this->dates=serialize($dates);
    }
    dans ce cas ton formulaire aura un champ collection de type "date" (le type natif de symfony)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $builder->add('dates', 'collection', array('type' => 'date', 'allow_add' => true));
    Le probleme étant qu'avec cette modélisation, il n'est pas possible de faire des requetes sur les dates puisqu'au final pour la BDD c'est un champ texte (pas possible de requeter les lignes ayant une date comprises entre tel date et tel date).
    Ce serait sans doute une solution viable avec une Base de données noSql (MongoDB)

    Par contre, j'ai un autre formulaire qui permet de modifier celui ci ( FormEditType ). Je conçois que je dois le bidouiller également.
    Est-ce vraiment utile d'avoir 2 formulaires pour la même entité?
    éventuellement tu peux passer des options si quelques champs différent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //MyEntityType
    public function buildForm($builder,$options){
      $builder->add('nom');
      if($options['mode']=='create'){
         $builder->add('something');
      }
    }
    public function setDefaultOptions($resolver){
       $resolver->setDefaults(array('mode'=>'update');
    }
    dans le controlleur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $this->createForm(new MyEntityType,$entity,array('mode'=>'create');
    Mais une petite question, cela ne posera pas de problèmes d'avoir plusieurs dates si par exemple je veux en modifier une seule ?
    Ton formulaire s'affichera en édition avec les dates préremplies et éditable, il n'y a pas de soucis.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 16
    Par défaut
    Bonjour,

    Alors, okay je comprend l'intérêt et le défaut du serializer.

    Pour le deuxième formulaire, je bouge quelques champs entre l'ajout et la modification(genre un nouveau champ modif, un remove de la date d'ajout, ce genre de truc)
    J'avoue que ton idée est plus optimisée, je l'utiliserais dans mon nouveau formulaire datetype, pour un champ.

    Concernant le parcours:
    Donc j'ai construit mon form, viré le champ date de l'ancien entity, fait une nouvelle entité Date comprenant logiquement le champ date.
    Ajouté le champ collection dans le FormType avec le DateType.

    Il s'affiche tout bien, j'ai bidouillé l'ajax pour en afficher plusieurs, la vie est belle.

    J'ai juste un petit "hic" concernant la validation.
    Je me prend un spl_object_hash() expects parameter 1 to be object, array given lors du flush().
    Si je comprend bien, mon formulaire imbriqué est compté comme un objet, sauf que je lui balance un array. Mais c'est une collection, donc une liste d'objets dans un array. La méthode serait de transformer ma liste en objet ?

    J'ai vu que c'est une erreur assez courante, mais les solutions ne sont pas très claires...

    Merci d'avance

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Est-ce que tout est bien configuré:

    - cache vidé (y compris apc)
    - config de la relation ( Date en ManyToOne vers ton entité + inverse side de ton entité vers Date en OneToMany)
    - table date avec champs id, date, foreign_key_de_ton_entité
    - methode addDate et removeDate dans ton entité

    - cascade persist sur cette relation
    - reverse et owning side OK ( http://docs.doctrine-project.org/en/...n-mapping.html )

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

Discussions similaires

  1. Ajouter plusieurs champs dans un formulaire
    Par _Carole dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 18/04/2013, 15h57
  2. Ajouter / supprimer plusieurs éléments dans un formulaire
    Par nesswaw dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 07/03/2008, 10h52
  3. Date dans un formulaire
    Par stonda dans le forum IHM
    Réponses: 3
    Dernier message: 15/10/2005, 08h32
  4. insere une date dans un formulaire
    Par lepeintre dans le forum ASP
    Réponses: 5
    Dernier message: 13/05/2005, 10h46
  5. Réponses: 3
    Dernier message: 19/03/2003, 15h19

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