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 :

Form Builder et datetimepicker [2.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 115
    Par défaut Form Builder et datetimepicker
    Je suis un peu perdu quant à l'utilisation du builder ... qui fait très bien son boulot pour construire un formulaire.

    Cela dit, j'ai un champ date qui est mis en "text" dans mon form builder auquel j'applique un datetime picker. Pour l'ajout aucun souci. Pour la modification, je me retrouve avec une exception étant donné que le champ est un objet de type DateTime.

    Modifier le type du champ dans le builder en le passant à datetime revient à afficher des select... donc sort du cadre du picker !

    L'erreur précise est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    The form's view data is expected to be of type scalar, array or an instance of \ArrayAccess, but is an instance of class DateTime. You can avoid this error by setting the "data_class" option to "DateTime" or by adding a view transformer that transforms an instance of class DateTime to scalar, array or an instance of \ArrayAccess.
    Avez-vous des solutions pour contourner ce problème ? Je crois qu'il faudrait que j'hydrate mes champs manuellement parce que là je vois pas...

    Si une bonne âme saurait me donner une solution ! Merci !

  2. #2
    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,

    Si tu veux gérer une date il est préférable d'utiliser le type datetime.
    Le fait de configurer la sortie html de ce champs, cela se fait dans les options
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $builder->add('my_date','datetime',array('widget'=>'single_text','format'=>'d/m/Y h:i));
    http://symfony.com/doc/current/refer.../datetime.html

    A priori il ne semble pas possible de n'avoir qu'un seul input (il y a a toujours 1 date + 1 time).
    Peut-être est-il possible dans la configuration de ton datetimepicker de spécifier que la date doit aller dans un champ et l'heure dans un autre?


    Reste la solution d'implémenter ta propre solution en créant un data transformer (gestion de la transformation d'une chaine de caractère en objet DateTime et vice-versa)
    http://symfony.com/fr/doc/current/co...nsformers.html
    (c'est ce que dis ton erreur d'ailleurs
    adding a view transformer that transforms an instance of class DateTime to scalar
    )

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 115
    Par défaut
    Merci pour ta réponse, je vais me pencher sur ces deux solutions pour voir.

    Sur le moment j'ai légèrement contourné le problème en modifiant mon entité pour lui passer un string.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $entity->setPdate( $entity->getPdate()->format('Y-m-d H:i:s') );
    et je fais ça juste avant d'instancier mon formulaire... C'est pas propre mais ça a le mérite de fonctionner correctement (et que je comprenne comment ça se passe !)

    Le datetime picker est difficilement modifiable aussi, sauf si j'en écris un moi-même. Par contre la solution des data transformers m'a l'air beaucoup plus propre, mais un peu lourde par rapport à ce que je veux faire ! Je vais quand même voir comment ça fonctionne.

  4. #4
    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
    Il est préférable de garder tes méthodes getPdate et setPdate telles qu'elles ont été généré par Doctrine (gérant des objets DateTime donc).

    Tu pourrais par contre ajouter des méthodes getDateAsString et setDateAsString dans ton entité
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public function getDateAstring(){
      $d=$this->getPdate();
      if($d){
        return $d->format('Y-m-d H:i:s');
      }
      return '';
    }
    public function setDateAstring($dateAstring){  
      return $this->setPdate(new \DateTime($dateAstring));
    }
    Et dans ce cas ton champ de formulaire devrait être mappé à 'dateAsString' et non plus à 'pdate' (Et il n'y a rien à faire dans le controller)

    Les problèmes restant étant :
    - format de date en dur dans le code donc pas trés personnalisable.
    - quel comportement lorsque l'utilisateur entre une chaine de caractère invalide ?

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 115
    Par défaut
    Je ne modifie pas les méthodes créées par Doctrine ! Par contre oui c'est une bonne idée de créer de nouveaux getters et setters.

    - format de date en dur dans le code donc pas trés personnalisable.
    En fait je récupère un string seulement avant l'affichage sur le navigateur et je le repasse en objet date dès que je le récupère. Il n'y a que le temps de l'affichage côté client ou je travaille vraiment sur du string ; et j'en ai besoin !

    quel comportement lorsque l'utilisateur entre une chaine de caractère invalide ?
    A priori on ne peut pas modifier sauf la date manuellement, le datetime picker se déclenche dès qu'on arrive sur ce champ !

    Voilà je mets en résolu !

    Merci !

    ps: si par ailleurs t'as une idée pour mon autre question concernant les chemins relatifs dans le css avec assetic (post un peu plus bas...)

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

Discussions similaires

  1. [Forms Builder] Gif animé dans un module
    Par Diane L'Hérault dans le forum Forms
    Réponses: 15
    Dernier message: 07/08/2009, 17h14
  2. enregistré une image dans forms builder
    Par sofian001 dans le forum Forms
    Réponses: 4
    Dernier message: 28/06/2006, 10h18
  3. [Forms]forms builder
    Par jmoez dans le forum Forms
    Réponses: 2
    Dernier message: 26/04/2006, 12h19
  4. FORMS BUILDER
    Par todier dans le forum Forms
    Réponses: 1
    Dernier message: 03/04/2006, 18h27
  5. Réponses: 8
    Dernier message: 12/01/2005, 07h20

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