Comment mettre en place un formulaire en plusieurs étapes avec Symfony 1.2 et Doctrine? Je vais tenter de vous expliquer cela par un exemple concret.
![]()
Nous allons réaliser une inscription de membre en plusieurs étapes:
- - Etape 1 : Identification »(pseudo, mail, password) »
- - Etape 2 : Informations complémentaires »(nom, prenom, adresse, cp, ville) »
Dans le fichier /config/doctrine/schema.yml :
membre:
columns:
id: { type: integer(4), primary: true, notnull: true, autoincrement: true }
pseudo: { type: string(255) }
mail: { type: string(255) }
password: { type: string(255) }
nom: { type: string(255) }
prenom: { type: string(255) }
adresse: { type: string(255) }
cp: { type: string(255) }
ville: { type: string(255) }
Lancer ensuite la commande :
symfony doctrine:build-all
Editer le fichier /lib/form/doctrine/BaseFormDoctrine.class.php et ajouter cette fonction :
public function unsetAllExcept ($keepFields = array()) {
foreach ($this as $key => $value)
$baseFields[] = $key;
$temp = array_diff($baseFields, $keepFields);
foreach ($temp as $unsetField)
unset($this[$unsetField]);
}
Nous allons maintenant créer deux formulaires ‘membre’ pour les deux étapes du formulaire.
Créer le fichier /lib/form/doctrine/membreEtape1Form.class.php
class membreEtape1Form extends BasemembreForm {
public function configure () {
$this->unsetAllExcept(array( 'pseudo', 'mail', 'password' ) );
}
}
Créer maintenant le fichier /lib/form/doctrine/membreEtape2Form.class.php
class membreEtape2Form extends BasemembreForm {
public function configure () {
$this->unsetAllExcept(array( 'nom', 'prenom', 'adresse', 'cp', 'ville' ) );
}
}
Lancer ensuite la commande pour vider le cache :
symfony cc
Vous pouvez maintenant initialiser vos formulaires dans actions.class.php
public function executeInscriptionEtape1(sfWebRequest $request) {
$this->form = new membreEtape1Form();
}
public function executeInscriptionEtape2(sfWebRequest $request) {
$this->form = new membreEtape2Form();
}
Vous pouvez dès à présent vous inspirer de cette base pour vos propres besoins.
N’hésitez pas à me contacter par commentaire pour plus d’explications.
To be continued…
Merci pour ce tuto !
J’aurai une question est-ce que la fonction unsetAllExcept fonctionne correctement quand on a une table i18n car j’ai l’erreur suivante :
Widget « fr » does not exist
Une possibilité à ton problème : unsetAllExceptI18n, qui fera l’objet d’un prochain article.
Bonjour
j’ai une formulaire un peut compliqué
contenant des formulaire imbriqué (presque 3 form imbriqué)
est ce que je peut le faire comme votre exemple
merci
votre exemple manque plusieurs chose
vous avez pas décrit comment relier entre le deux étape
comment va être le sauvegarde des données (récupération des données du 1er étape dans le deuxième étape et en fin le sauvegarde)
je pense que cela manque plusieurs chose qui semble être flou pour nous jusqu’au maintenant !!!
pouvez vous nous expliquez un peu plus
merci