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 :

Formulaire et EmbedForm a plusieurs niveaux et ajax.


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 28
    Par défaut Formulaire et EmbedForm a plusieurs niveaux et ajax.
    Bonjour,

    Alors j'espère que quelqu'un aura une réponse a m'apporter sur un formulaire assez complexe que je dois mettre en oeuvre...

    Bon pour résumer et comprendre ma situation :

    Je dois mettre en oeuvre un formulaire d'inscription assez complexe... (désolé pas possible de le changer, on me le demande ainsi... )

    Donc quand j'entre une compagnie, la personne peux rajouter des bureaux, et dans chaque bureau, la personne peux rajouter divers informations (url, contact...etc...).

    Niveau formulaire j'ai cela :
    compagnie -> [array embed] bureaux -> [array embed] urls|contacts|...

    A la validation, j'ai bien mes bureaux (même ceux rajouté a la volé avec mon overload de la méthode bind et un add des forms a la volé en fonction des values). Parcontre pour chaque bureau, je n'ai plus mes champs rajouté a la volé....

    Voici les différents portions de codes:

    !! CompagnieForm.class.php
    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
     
    public function addBureau($num) {
    	$b = new CompagnieBureau();
    	$b->setCompagnie($this->getObject());
    	$bf = new CompagnieBureauForm($b);
    	$this->embeddedForms['bureaux']->embedForm($num, $bf);
    	$this->embedForm('bureaux', $this->embeddedForms['bureaux']);
    }
     
    public function bind(array $values = null, array $files = null) {
    	foreach ($values['bureaux'] as $k=>$b) {
    		if (!isset($this['bureaux'][$k])) {
    			$this->addBureau($k);
    		}
    		// ici je force le binding dans chaque sous formulaire pour générer les sous champs a la volé
    		$this->embeddedForms['bureaux']->embeddedForms[$k]->bind($values['bureaux'][$k]);
    	}
    	return parent::bind($values, $files);
    }
    // Dans CompagnieBureauxForm.class.php
    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
     
     
    	// Methode permettant de rajouter un form (embed) de manière générique...
    	public function addForm($modelName, $n) {
    		$classname = 'CompagnieBureau'.ucfirst($modelName);
    		$formname = $classname.'Form';
    		$o = new $classname();
    		$o->setCompagnieBureau($this->getObject());
    		$m = 'get'.ucfirst($modelName).'s';
    		$objs = $this->getObject()->$m();
    		$objs->add($o);
    		$m = 'set'.ucfirst($modelName).'s';
    		$this->getObject()->$m($objs);
    		$of = new $formname($o);
    		$this->embeddedForms[$modelName.'s']->embedForm($n, $of);
    		$this->embedForm($modelName.'s', $this->embeddedForms[$modelName.'s']);
    	}
     
    	// Methode permettant de rajouter un form a la volé (ça passe pas...)
    	protected function bindForm($modelName, array $values = null, array $files = null) {
    		foreach ($values[$modelName.'s'] as $k=>$o) {
    			if (!isset($this[$modelName.'s'][$k])){
    				$this->addForm($modelName, $k);
    			}
    		}
    	}
     
    	public function bind(array $values = null, array $files = null) {
    		$this->bindForm('url', $values, $files);
    		$this->bindForm('contact', $values, $files);
    		$this->bindForm('telephone', $values, $files);
    		$this->bindForm('fondateur', $values, $files);
    		$this->bindForm('dirigeant', $values, $files);
    		foreach ($this->embeddedForms as $name=>$form) {
    			if (isset($values[$name]))
    				$this->embeddedForms[$name]->bind($values[$name]);
    		}
    		$output = parent::bind($values, $files);
    		return $output;
    	}
    Donc mes binds sont bien passé dans les sous formulaires et les sous-sous formulaires... Parcontre lors du render je n'ai qu'un champs... Les autres (meme si le bind et que le rajout a été effectué) ne sont pas du tout là!. De plus ça me génére une erreur, mais aucun output (pourtant en environnement de dev avec tout qui est actif...).

    PS: le binding générique et la génération a la volé des forms marchent aux embedForm de 1er niveau, parcontre ça coince a plus bas...

    Bref, ça fais 3 jours que je suis dessus, mais impossible de savoir... Quelqu'un aurait une idée?
    Images attachées Images attachées  

  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
    Je ne suis pas convaincu que les embedForm soient conçu pour être inclu les uns dans les autres.

    De plus, si je le fessais, je n'inclurais pas tous au même niveau de configure(). Je pense qu'il faut faire l'embed des url dans le configure() du formulaire des bureaux et l'embed des bureaux dans le configure() de la personne.

    Ce qui permet de garder une certaine indépendance des forms entre elles, le bureau aura toujours ses url.

    Mais je n'ai pas tous en mains et fait qu'un survol rapide.

    Et je ne suis pas sur du tout que cela puisse fonctionner ainsi.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 28
    Par défaut
    Je ne suis pas convaincu que les embedForm soient conçu pour être inclu les uns dans les autres.
    Je commence à le croire!

    De plus, si je le fessais, je n'inclurais pas tous au même niveau de configure(). Je pense qu'il faut faire l'embed des url dans le configure() du formulaire des bureaux et l'embed des bureaux dans le configure() de la personne.
    C'est ce que j'ai actuellement, c'est pas le souci a ce niveau là! Chaque formulaire embed le sous form dans le configure, Compagnie embed bien les bureaux, et le bureau embed bien les urls (dans configure biensur)...

    En faite je crois que je commence a comprendre l'intérêt des embedForms sous symfony, du moins les limitations...

    Donc réellement la, c'est vraiment au niveau de la sauvegarde que ça coince. J'ai pu lire quelque part que les embedForm n'appelait pas du tout les méthodes bind des sous formulaire... Car ça n'a pas été inventé pour ça si je comprend bien.

    Bon je vais voir si j'arrive a trouver une solution... Je sais pas si ça intéresse quelqu'un, mais c'est pratique lorsqu'on veux de l'ajax a plusieurs niveau sur un formulaire!

    ps : ça ressemble un peu a ça ce que je souhaite avoir mais sur plusieurs embed http://www.thatsquality.com/articles...x-a-love-story

  4. #4
    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
    J'ai démonté l'objet form pour d'un autre projet et cela vaut la peine de rentrer dans le code pour essayer de comprendre ce qui ce passe et comment.

    Même si ce n'est pas toujours évident de suivre le cheminement du code dans les différentes strate des class et des dérivées de class.

    Le pire étant l'appel du dispatcher, on n'est jamais sur de qui va y répondre.

    Mais petit à petit, on arrive à saisir l'esprit du framework et mieux comprendre.

Discussions similaires

  1. Formulaire regroupement plusieurs niveaux
    Par johan_m dans le forum IHM
    Réponses: 6
    Dernier message: 06/03/2012, 12h14
  2. Nav ajax: plusieurs niveaux de chargement d'html
    Par franckichmish dans le forum jQuery
    Réponses: 3
    Dernier message: 12/02/2012, 23h45
  3. Plusieurs niveaux de colonnes dans TDBGrid
    Par TicTacToe dans le forum Composants VCL
    Réponses: 4
    Dernier message: 31/01/2006, 10h44
  4. Création de plusieurs niveaux de sous formulaires
    Par Farbin dans le forum Access
    Réponses: 2
    Dernier message: 25/10/2005, 20h15
  5. formulaire qui doit appeler plusieurs pages
    Par rohel dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 27/01/2005, 08h59

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