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 :

custom form field bind avec attribut de l'entity


Sujet :

Symfony PHP

  1. #1
    Membre habitué Avatar de Echyzen
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2012
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 123
    Points : 178
    Points
    178
    Par défaut custom form field bind avec attribut de l'entity
    Salut à tous,

    Voilà, j'ai passé la journée a essayer de mettre en place un champ number pour symfony car le type number proposer par Symfony est un input de type test....

    Du coup j'ai commencé par écrire le type :
    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
    <?php
     
    namespace Echyzen\TestBundle\Form\Type;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
    use Symfony\Component\Form\FormBuilderInterface;
     
     
    use Symfony\Component\Form\FormView;
    use Symfony\Component\Form\FormInterface;
     
     
    class NumberFieldType extends AbstractType
    {
    /**
         * {@inheritDoc}
         */
        public function getDefaultOptions(array $options)
        {
            $options = parent::getDefaultOptions($options);
            return $options;
        }
     
    public function setDefaultOptions(OptionsResolverInterface $resolver){
     
        $resolver->setDefaults(array( 'min' => 0));
        $resolver->setDefaults(array( 'max' => 100));
        $resolver->setDefaults(array( 'step' => 0));
        $resolver->setDefaults(array( 'value' => 0));
     
     
    }
     
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder->setAttribute('min', $options['min']);
            $builder->setAttribute('max', $options['max']);
            $builder->setAttribute('step', $options['step']);
            $builder->setAttribute('value', $options['value']);
        }
     
        /*public function buildView(FormView $view, FormInterface $form, array $options)
        {
            $view->set('min', $form->getAttribute('min'));
        }*/
            public function buildView (FormView $view, FormInterface $form, array $options)
        {
             //$form->offsetSet('min', 3);
            $view->vars['min'] = $options['min'];
            $view->vars['max'] = $options['max'];
            $view->vars['step'] = $options['step'];
            $view->vars['value'] = $options['value'];
     
        }
     
        /**
         * {@inheritDoc}
         */
        public function getName()
        {
            return 'number_field';
        }
     
     
    }
    Et enfin le widget en le référençant dans le app\config\config.yml vla.
    Le problème du widget est que j'ai des problème pour le binder avec avec l'attribut de l'entité du coup j'ai le faire à la main mais cela ne fonctionne pas :s

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    {# src\NewsBundle\Resources\views\Form\fields.html.twig #}
    {% block number_field_widget %}
    {% spaceless %}
    	<input id="{{ id }}" name="echyzen_testbundle_film[avis]"" type="number" step="{{ step }}" value="{{ value }}" min="{{ min }}" max="{{ max }}" />
    {% endspaceless %}
    {% endblock %}
    Et bien sur il dit que la valeur est vide du coup pas d'insert valeur pas valid normale il y a rien XD


    Ski une âme sensible peut m'aider j'en serais ravis

  2. #2
    Membre habitué Avatar de Echyzen
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2012
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 123
    Points : 178
    Points
    178
    Par défaut
    Bon bah visiblement c'est pas bon j'ai donc changer d'optique même si cela fonctionne toujours pas c'est vraiment de la merde Symfony car perdre une journé pour des chiffre a virgule en input c quand même pas croyable...
    Cette fois j'ai modifié directement le type integer voila :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ->add('avis', 'integer', 
                  array('attr' => array('max' => '5', 'min' => '0', 'step' => '0.1', 'value' => '0'),
                    ))
    Affichage cela fonctionne mais lors de l'insert cela arrondie car il reconnait pas la virgule mais seulement le point...

    Quand je met un point la tout marche le problème c'est que par défaut l'input sort en virgule et çà je en sais pas comment le controller car je n'arrive pas après a récuperer nivea controller pour faire un str_replace....

    Si vous avez des idées???

  3. #3
    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
    ta première méthode est la meilleure, quel est le problème de binding que tu as?

  4. #4
    Membre habitué Avatar de Echyzen
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2012
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 123
    Points : 178
    Points
    178
    Par défaut
    En faite, j'ai un attribut avis dans mon entité de type float car je veut que mes chiffres soit floatant le problème c'est qu'en france on utilise la virgule comme chrome formate le input avec des virgules... Et donc quand j'insert dans la BDD cela arrondie à l'entier inférieur dans MySQL.

    Alors, il faudrait que je puisse récupéré la valeur envoyer pour modifier par un str_replace...

    Alors la j'ai tenter d'implémenter un DataTransfomer mais j'ai pas réussi du coup je voulais juste pour tester récupérer la value sur le form avant le handleRequest pour voir si c'est bien ce que je pense le problème....

  5. #5
    Membre habitué Avatar de Echyzen
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2012
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 123
    Points : 178
    Points
    178
    Par défaut
    En faite, quand je met le type number de base fournit par symfony cela fonctionne que ej marque avec des virgules ou avec des points mais le rpoblème c'est que c'est un champ text ou donc il n'y a pas de pas est on peut écrire n'importe quoi...

  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
    dans un champs number on peut aussi écrire n'importe quoi, j'espère que tu fais bien une vérification coté serveur avec les asserts!
    J'ai pas de pistes pour ton problème, ca me semble bizar, je dirais de continuer la solution avec le data transformer si jamais

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


    le type number proposer par Symfony est un input de type text.

    Par défaut c'est un input[type=number] qui est rendu cf https://github.com/symfony/symfony/b...tml.twig#LC139
    Aprés ça va dépendre de ta version de symfony, ou du fait que les themes de formulaire ait été customisé.

    De toute façon c'est facile à modifier (et ajouter les options, min,max, etc...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $builder->add('price','number',array(
       'attr'=>array('type'=>'number')
    ));

    Même réflexion que gototog, la validation coté server est importante, d'autant plus qu'un input[type=number], ce n'est pas compatible sur tout les navigateurs, et ça se contourne facilement.


    Quelques infos pour créer un type personalisé
    Se baser sur un type déjà existant c'est bien plus facile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function getParent()
        {
            return 'number';
        }
    Dans ton cas il est plus légitime de redéfinir la méthode finishView (afin de conserver le type, même si on passe une option 'attr' au formbuilder).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function finishView(FormView $view, FormInterface $form, array $options)
        {
            $view->vars['attr']['type']='number';
        }

  8. #8
    Membre habitué Avatar de Echyzen
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2012
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 123
    Points : 178
    Points
    178
    Par défaut
    Bah cela fonctionne pas cela donne toujours un input type text avec deux fois l'attribut type cela ne l'écrase pas :s

    Mais sinon cela semble une bonne idée je vais chercher de ce côté ci

Discussions similaires

  1. [2.x] [Form] Type pour une relation ManyToMany avec attributs
    Par FadeToBlack dans le forum Symfony
    Réponses: 10
    Dernier message: 09/08/2014, 03h46
  2. Binding avec un Enum en fonction de l'attribut Flag
    Par Chekov dans le forum Windows Presentation Foundation
    Réponses: 8
    Dernier message: 02/10/2009, 12h11
  3. [MFC]Probleme avec attributs d'une LOGFONT
    Par Fildz dans le forum MFC
    Réponses: 3
    Dernier message: 08/01/2006, 17h59
  4. [C#] Définir le forme de démarrage avec SharpDevelop
    Par fabrice1596 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 15/10/2004, 10h52

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