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 :

Surcharger la classe Form


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut Surcharger la classe Form
    Bonjour,

    Je souhaite surcharger la classe Form au sein d'un bundle pour pouvoir ajouter des méthodes à mon formulaire.
    Je sais comment créer un FieldType custom, mais je ne sais pas comment surcharger la classe Form. En effet, le FormBuilder me renvoie toujours une instance de Form.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?php
    namespace Snafu\SnafBundle\Form;
     
    use Symfony\Component\Form\Form;
     
    class Myform extends Form
    {
        public function foo()
        {
            return 'hello foo !';
        }
    }
    Comment faire pour créer un formulaire de la classe MyForm ?

  2. #2
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Je continue de chercher, et je dois bien dire que j'avance dans l'obscurité presque totale.
    Mais finalement, peut-être que mon problème se situe plutôt au niveau du service form.builder ou form.factory

    Comment paramétrer ces deux services ?

  3. #3
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    J'avance, et je patauge...
    Le FormBuilder n'utilise pas de service, mais bien une classe Form codée "en dur".

    Je tente donc un autre truc :

    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
     
    <?php
     
    namespace Snafu\HelpBundle\Form;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilder;
     
    class BasicType extends AbstractType
    {
        public function buildForm(FormBuilder $builder, array $options)
        {
            $builder->add('mon texte', 'text', array('label'=> "mon texte", 'attr' => array('title' => 'foo')));
            $builder->add('email', 'email');
            $builder->add('mon texte2', 'text', array('label'=> "mon texte", 'attr' => array('title' => 'bar')));
            $builder->add('message', 'textarea');
        }
     
        public function getName()
        {
            return 'basic';
        }
     
        public function createBuilder($name, FormFactoryInterface $factory, array $options)
        {
            return new FormBuilder($name, $factory, new EventDispatcher(), $options['data_class']);
        }
     
    }
    Et là le message d'erreur me plante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fatal error: Declaration of Snafu\HelpBundle\Form\BasicType::createBuilder() must be compatible with that of Symfony\Component\Form\FormTypeInterface::createBuilder() in .../Snafu/HelpBundle/Form/BasicType.php on line 9
    Et là je dis : GNEE ?

    L'interface en question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        /**
         * Returns a builder for the current type.
         *
         * The builder is retrieved by going up in the type hierarchy when a type does
         * not provide one.
         *
         * @param string                $name       The name of the builder
         * @param FormFactoryInterface  $factory    The form factory
         * @param array                 $options    The options
         *
         * @return FormBuilder|null A form builder or null when the type does not have a builder
         */
        function createBuilder($name, FormFactoryInterface $factory, array $options);
    Je rate quelque chose, mais quoi ?

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function createBuilder($type, $data = null, array $options = array());

  5. #5
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Je dois avoir quelque chose dans les yeux, mais je ne vois pas où est écrit cette fonction dans l'interface : j'ai de nouveau téléchargé le framework (au cas où) et j'ai vérifié la méthode Symfony\Component\Form\FormTypeInterface::createBuilder

    Je recolle le source :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        /**
         * Returns a builder for the current type.
         *
         * The builder is retrieved by going up in the type hierarchy when a type does
         * not provide one.
         *
         * @param string                $name       The name of the builder
         * @param FormFactoryInterface  $factory    The form factory
         * @param array                 $options    The options
         *
         * @return FormBuilder|null A form builder or null when the type does not have a builder
         */
        function createBuilder($name, FormFactoryInterface $factory, array $options);
    Ceci dit, merci Stealth, je vais voir si ça marche dès que je récupère un accès au serveur.

  6. #6
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Cela ne marche pas.
    La signature donnée par stealth35 ressemble plus à la fonction "createForm" du controller.
    Je ne comprends pas pourquoi l'interface n'est pas respecté.



    Surtout quand je regarde AbstractType qui est la classe mère de mon 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
     
        /**
         * Returns a builder for the current type.
         *
         * The builder is retrieved by going up in the type hierarchy when a type does
         * not provide one.
         *
         * @param string                $name       The name of the builder
         * @param FormFactoryInterface  $factory    The form factory
         * @param array                 $options    The options
         *
         * @return FormBuilder|null A form builder or null when the type does not have a builder
         */
        public function createBuilder($name, FormFactoryInterface $factory, array $options)
        {
            return null;
        }

Discussions similaires

  1. Surcharge de classes Struts
    Par blbird dans le forum Struts 1
    Réponses: 8
    Dernier message: 10/11/2006, 13h08
  2. [C#] Comment surcharger la classe DataGrid ?
    Par Dozer71 dans le forum ASP.NET
    Réponses: 8
    Dernier message: 27/07/2006, 13h43
  3. [Struts]control dans la class form
    Par jimi dans le forum Struts 1
    Réponses: 8
    Dernier message: 01/06/2005, 16h50
  4. [MFC] surcharger une classe
    Par exter666 dans le forum MFC
    Réponses: 9
    Dernier message: 16/03/2005, 00h53
  5. Réponses: 12
    Dernier message: 01/07/2004, 11h03

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