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 :

Call to undefined method CommandeForm::save()


Sujet :

Symfony PHP

  1. #1
    Membre averti Avatar de sacricri
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 324
    Points : 384
    Points
    384
    Par défaut Call to undefined method CommandeForm::save()
    Bonjour,

    J'ai créé une classe de formulaire CommandeForm() qui gère plusieurs fois le même formulaires via un embedForm.

    L'affichage se passe bien, la validation aussi mais c'est au moment de sauvegarder que le problème se pose : Call to undefined method CommandeForm::save()

    Voici le code du formulaire :
    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
     
    class CommandeForm extends sfForm
    {
      public function configure()
      {
        // ...........
     
        foreach ($choices as $date => $c)
        {
          foreach($personnel as $p)
          {
            $personnelMenu = new PersonnelMenu();
            $personnelMenu->id_personnel = $p->getId();
            $w = new PersonnelMenuForm($personnelMenu);
            unset($w['created_at'], $w['updated_at']);
            $w->widgetSchema['id_personnel'] = new sfWidgetFormInputHidden();
            $w->widgetSchema['id_menu'] = new sfWidgetFormChoice(array('expanded' => true, 'choices' => $c, 'renderer_options' => array('formatter' => array($this, 'formatter'))));
            $w->widgetSchema['id_menu']->setLabel($p->getNom()." ".$p->getPrenom());
            $w->validatorSchema['id_menu'] = new sfValidatorString(array('required' => true));
            $w->widgetSchema->addFormFormatter('Row', new sfWidgetFormSchemaFormatterRow($w->widgetSchema, $w->validatorSchema));
            $w->widgetSchema->setFormFormatterName('Row');
            $this->embedForm($date.'-'.$p->getId(), $w);
            $this->widgetSchema->setNameFormat('commande[%s]');
          }
        } 
      }
    Et le code de l'action :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      public function executeCommand(sfWebRequest $request)
      {
        // .........
     
        if($request->isMethod('post')){
          $this->form->bind($request->getParameter('commande'));
          if ($this->form->isValid()){
            $this->form->save();
            $this->getUser()->setFlash('notice', 'The command has been passed.');
            $this->redirect('@commande');
          }
        }
      }
    Effectivement, je n'ai pas de méthode save() dans la classe de formulaire. Mais ce qui me taraude, c'est que les formulaires auto générés ne l'ont pas non plus.
    J'ai testé de l'ajouter mais rien n'y fait, j'ai testé de créer cette méthode dans une nouvelle classe (Commande.class.php) dans le modèle mais pas mieux.

    Si vous avez une idée, je suis tout ouïe.
    symfony power user !

  2. #2
    Membre averti
    Inscrit en
    Août 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 360
    Points : 396
    Points
    396
    Par défaut
    Salut,

    Il semble que ton formulaire n'hérites pas de la bonne classe.

    Normalement, tu dois avoir une classe BaseCommandeForm, non ?

    J'espère t'avoir aidé...

    Mathieu

  3. #3
    Membre averti Avatar de sacricri
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 324
    Points : 384
    Points
    384
    Par défaut
    Bonsoir,

    En fait, c'est un formulaire perso que j'ai créé. Il n'a pas été généré par Doctrine et du coup, il étend sfForm.
    C'est le problème :p
    symfony power user !

  4. #4
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Dans ton code,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public function executeCommand(sfWebRequest $request)
      {
        // .........    
            $this->form->save();
          }
        }
      }
    Comme tu le dis toi même tu étends sfForm qui n'a pas de méthode save(). cette méthode n'apparait qu'avec sfFormObject, parent des classe propel et doctrine.

    Je pense que l'erreur est quelque par par là.

    Amicalement,
    Michel
    Bonne année 2010
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

  5. #5
    Membre averti Avatar de sacricri
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 324
    Points : 384
    Points
    384
    Par défaut
    Bonjour,

    Effectivement, c'est ce que je me suis dis mais du coup, comment gérer ce problème ?
    symfony power user !

  6. #6
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Tu ne peux pas utiliser une méthode save(), elle ne saurait quoi sauvegarder ni où. Dans les objets issus de DoctrineForm, le formulaire est lié à un objet de la base de donnée qui peut alors être mis à jour et sauvegardé, ici pas.

    La solution est dans les fonctions :
    • getValue($field) - retourne la valeur d'un champ
    • getValues() - retourne un tableau avec les champs et leurs valeurs

    a noter que que les valeurs sont "nettoyée", les chaines et les dates notamment.

    Après :
    • soit tu utilises les données dans une méthode save() (que tu dois créer dans ton objet). Propre dans le contrôleur, mais le formulaire est très spécialisé et embarque une partie du modèle.
    • soit tu le fais au niveau de contrôleur (méthode executeCommand()). Mais là aussi, c'est un peu pas top.
    • dernière possibilité, tu crées une méthode dans ton objet <table>.class.php dans le genre de ajoutDateDeFormTable($array) qui va faire la mise à jour dans la table et dans le contrôleur à la place du save un truc dans le genre Doctrine::getTable('<table>')->ajoutDateDeformTable($this->form->getValues()).

    J'ai pas testé, mais cela me semble viable, a vue de nez.

    Bonne chance
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).

    • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
    • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
    • Une discussion est terminée ? Alors le bouton est votre ami !

Discussions similaires

  1. [PHP 5.2] Fatal error: Call to undefined method DateTime::sub()
    Par made_in_france dans le forum Langage
    Réponses: 2
    Dernier message: 31/01/2011, 09h39
  2. [sfGuard] Call to undefined method myUser::setReferer
    Par jylac dans le forum Plugins
    Réponses: 3
    Dernier message: 11/06/2010, 00h13
  3. [PDO] Call to undefined method PDOStatement::lastinsertid()
    Par megacool dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 18/10/2008, 15h32
  4. [Artichow] Call to undefined method Graph::getDrawer()
    Par belocom dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 17/04/2008, 22h56
  5. Réponses: 0
    Dernier message: 25/02/2008, 17h28

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