[Symfony 3] Formulaire imbriqué, choisir entre New ou Edit

Mirfak
Invité n'ayant pas de compte PHPfrance

13 juin 2016, 10:17

Bonjour,

J'ai une entité réservation avec différents types de réservation (Stage, Stagiaire, Chambre, Gite, Camping).

Avec Javascript j'affiche dans mon formulaire Réservation un formulaire imbriqué correspondant au type selectionné. Je souhaiterais pouvoir choisir entre utiliser un modèle du type existant pour pré-remplir mon formulaire... ou faire un nouveau enregistrement...

je sais pas trop comment m'y prendre, auriez vous une piste?

Merci de votre aide!
Dernière édition par moogli le 14 juin 2016, 16:44, édité 1 fois.
Raison : Correction du titre

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

13 juin 2016, 11:30

salut,

[3.x] : c'est quoi ? :)

le problème se situe en JS ou en php ?
A priori je pense que c'est coté JS.
si j'ai bien compris il te faut un bouton "pré remplir" et quand tu clique dessus les champs sont remplis.
Du coup je pense qu'il te faut une fonction js par type de formulaire et la fonction appelée sur le clic du bouton contient un switch qui appel la bonne fonction (il est possible de passer la référence vers le formulaire pour simplifier la chose.

Sans code on ne peux pas beaucoup t'aider, c'est vraiment trop abscons.

@+
Il en faut peu pour être heureux ......

jMirfak
Invité n'ayant pas de compte PHPfrance

13 juin 2016, 12:12

Salut Moogli,

[3.x], c'est un copier/coller foireux, je voulais mettre [Symfony 3]

En faite, je voudrais un select avec la liste des enregistrements existant de chaque type + la possibilité d'un nouveau.
Par exemple, si je veux faire une réservation de type "Stage", ma liste se rempli des intitulés de stage déjà existant en bdd et d'une option "nouveau stage".

Si on sélection nouveau stage, j'affiche mon formulaire de création de stage, si je sélectionne un stage existant, j'affiche mon formulaire d'édition de ce stage.

Donc oui, je pense qu'il va me falloir non seulement du javascript, mais aussi de l'Ajax... Il y a aussi peut-être moyen de faire ça avec les écouteurs d’événements sur mon formulaire...

J'ai pas encore de code par rapport à cette partie, je me demande juste si c'est la bonne méthode? (Chui pas en grand connaisseur de javascript et d'Ajax :( )

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

14 juin 2016, 17:14

j'ai corrigé ton titre ;)

Il y a plusieurs façon de faire, je t'en donne deux :
- old school :
étape 1 :
tu affiches le premier le premier select à partir de données de la base (select en base + boucle pour le traitement des données)
sur le select tu ecoute l'event onChange, dans cette event tu valides le formulaire dans lequel se trouve le select (avec un paramètre caché du genre etape=2 dans le formulaire)
étape 2 :
- Tu affiches toujours le premier select (comme à l'étape 1) mais avec le choix fait à l'étape 1 pré sélectionné
- Tu affiches le second en fonction du choix du premier (if(!empty($_POST['etape']) && $_POST['etape']>1) j'affiche le select 2)
- Tu écoutes l'évent du onChange du second select pour valider le formulaire après le choix
- Tu affiches les deux select pré remplis + le formulaire de création de stage. Le formulaire est pré remplis si le type de "stage" n'existe pas (idéalement le choix autre doit retrouner une valeur que tu n'auras pas en base et que tu peu facilement tester (genre nouveau et les autres c'est l'id de la table).
- tu valides le formulaire pour insérer en base (si "select2" == nouveau) ou update.

Voilà c'est pas super "user friendly" mais y a moyen de faire avec peu de JS (simple) et que du html / php simple

La méthode plus moderne : on fait péter le JS partout avec du full REST !

la je te conseil de te munir de ton framework JS préféré :
il te faut :
- un service REST (méthode GET) qui retourne la liste des types de réservation (select 1)
- un service REST (méthode GET) qui retourne la liste des réservations possible pour le type selectionné (l'id du type du select 1 en paramètre d'url, voir path param pour faire bien ;) )
- un service REST (méthode GET) qui retourne une réservation à partir de sont id (reservation/id)
- un service REST (méthode POST) qui va permettre l'enregistrement en base d'une nouvelle réservation (une nouveau stage dans ton exemple)
- un service REST (méthode PUT idéalement) qui va permettre d'enregistrer la modification.

1/ tu affiche le select en js dynamiquement depuis le données fournit par le premier service.
Tu écoutes l'event onChange du select.
2/ Lors de la modification du select 1 tu affiches le select 2 et utilise les données fournit par le service N°
3/ écoutes l'event onChange du select 2
Si la valeur du select N°2 est différente de "nouveau" utilise le service N°3 pour récupérer les données et pré remplir le formulaire
Affiche le formulaire d'ajout / modification pré remplis ou non ( au départ il a un display: none, ce qui te permet quand même d'utiliser les champs).

le clic sur le bouton permet de faire une requête serveur pour l'ajout (service N°4 si select 2 == "nouveau") ou mettre a jour (service N°5).

Voilà c'est "facile" XD

L'avantage de la seconde solution est que bien partis pour un MVC (découpage front / back d’emblée), coté utilisateur pas de rafraîchissement ça semble aller plus vite, une api rest s'ouvre au monde etc. :)

Exemple d'api rest avec symphony (1er lien google qui semble pertinent).
http://obtao.com/blog/2013/12/creer-une ... n-symfony/

je précise :
- Je connais pas du tout symphony
- Je suis loin d'être pro JS mais il faut avouer que l'on fait des ihm sexy avec ça (et pis bon qui n'as pas js d'activé de nos jour).

Voilà je pense avoir rien oublié, j'espère que c'est relativement clair ;)


@+
Il en faut peu pour être heureux ......

Avatar de l’utilisateur
Petit nouveau ! | 2 Messages

16 juin 2016, 09:18

Bonjour Moogli,

Merci pour cette réponse et pour le temps que tu as pris.
Merci pour le titre aussi! :) J'étais pas inscrit au forum quand j'ai ouvert la discussion, chose faite maintenant! :)

Mon côté puriste est bien attiré par le côté REST, mais je crains de m'embarquer aujourd'hui dans quelque-chose qui me dépasse et me prenne beaucoup de temps.
La méthode Old School m’apparaît moins terre inconnu... Je vais creuser de ce côté... Et repasserais avec un peu de code! :)
@+