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 :

sfForm, embedForm et bind()


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Santé

    Informations forums :
    Inscription : Août 2006
    Messages : 55
    Par défaut sfForm, embedForm et bind()
    Bonjour,

    Je travaille sur un formulaire un peu complexe et du coup, je me suis mis, non sans mal, aux embedForms de symfony. Mon problème, c'est que je n'arrive pas à lier les données | récupérer les données liées.

    Le contexte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class GestionForm extends sfForm // classe formulaire perso
    class GessehPeriodeForm extends BaseGessehPeriodeForm // classe doctrine
    class ImportForm extends sfForm // classe perso qui contient un unique champ file 'fichier'
    L'intérêt de la classe ImportForm, c'est de pouvoir l'utiliser avec ses méthodes dans un autre contexte.

    On a donc dans gestionActions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $this->form = new GestionForm();
    $this->form->embedForm('PromoP2', new ImportForm());
    $this->form->embedForm('Periode1', new GessehPeriodeForm());
    $this->form->embedForm('Periode2', new GessehPeriodeForm());
    $this->form->embedForm('Periode3', new GessehPeriodeForm());
    $this->form->embedForm('Periode4', new GessehPeriodeForm());
    Le problème se pose au niveau du traitement des données. Pour le formulaire hérité de GestionForm, pas de soucis, j'utilise une fonction perso avec un traitement à part. Pour les autres ça se complique, j'ai donc créé une fonction saveEmbeddedForms à partir d'exemples glanés sur le net.

    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
    // lib/form/GestionForm.class.php
     
    [...]
     
    public function saveEmbeddedForms($con = null, $forms = null)
    {
      if (is_null($forms))
        $forms = $this->getEmbeddedForms();
      foreach ($forms as $key => $form)
      {
        if ($form instanceof sfFormDoctrine)
        {
          $form->bind($this->values[$key]);
          $form->save($con);
          $form->saveEmbeddedForms($con);
        }
        elseif ($form instanceof sfForm)
        {
          if($form->isMultipart())
            $form->bind($this->values[$key], $this->values[$key]);
          else
    	$form->bind($this->values[$key]);
          if($form->isBound())
            $form->save();
          $form->saveEmbeddedForms($con);
        }
        else
          $this->saveEmbeddedForms($con, $form->getEmbeddedForms());
      }
    }
    Et je me heurte à un message d'erreur dans le traitement de l'instance de ImportForm : $file n'est pas un objet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // lib/form/ImportForm.class.php
     
    [...]
     
    $file = $this->getValue('fichier');
    $filename = sha1($file->getOriginalName()).$file->getExtension($file->getOriginalExtension());
    $file->save(sfConfig::get('sf_upload_dir').'/'.$filename);
     
    [...]
    Au final, je n'arrive pas à récupérer l'objet File du formulaire. Et pourtant la classe est liée aux données (->isBound() : true).

    Je coince un peu... Quelqu'un aurait une idée de ce que j'ai mal fait ?

  2. #2
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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
    Par défaut
    Bien documenté, mais il manque quelques informations.

    Dans ton objet form GessehPeriodeForm tu utilises un sfWidgetInputFile et le validateur qui va avec ?

    Si oui, ton bind devrait avoir deux arguments, les data et le fichier. Ce qui pourrait expliquer l'erreur.

  3. #3
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Santé

    Informations forums :
    Inscription : Août 2006
    Messages : 55
    Par défaut
    Bah au final, je ne m'en suis pas trop sorti dans cette voie-là... mais j'ai contourné le problème en faisant 3 formulaires séparés et ça s'intègre même mieux dans mon interface.

Discussions similaires

  1. [1.x] erreur sfForm::bind() must be an array()
    Par megaloplex dans le forum Symfony
    Réponses: 3
    Dernier message: 08/07/2010, 15h53
  2. Récupérer l'adresse de bind d'un socket
    Par gloode dans le forum Réseau
    Réponses: 4
    Dernier message: 04/02/2005, 10h56
  3. Bind ou pas Bind?
    Par jonzuzu dans le forum MFC
    Réponses: 4
    Dernier message: 19/03/2004, 10h00
  4. []Erreur sur second emploi collection binding
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 08/03/2004, 18h02
  5. Bind - sous-domaine
    Par _Gabriel_ dans le forum Réseau
    Réponses: 4
    Dernier message: 07/03/2004, 11h54

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