[Symfony 3.x] Formulaire dans une popup en include - PHP - Programmation
Marsh Posté le 03-05-2018 à 17:11:26
Bonjour,
Je ne connais pas Symfony mais normalement le mot-clé pour étendre une classe c'est "extends" et non "extend". Cela devrait te retourner une erreur, en fonction de comment est paramétré ton gestionnaire d'erreurs... Donc avant d'aller plus loin il faudrait s'assurer que le problème ne vienne pas de là.
Marsh Posté le 17-05-2018 à 17:14:15
Bonjour @MaybeEijOrNot,
Merci d'avoir pris le temps de me répondre. Il s'agit bien d'une erreur lors du copier-coller au niveau du "mot-clé pour étendre ma classe avec 'extends' et non 'extend'".
J'arrive bien à afficher ma popup maintenant. Mais j'ai un autre souci lors de la validation de mon formulaire en Ajax. J'aimerais quand je valide le formulaire qu'il m'affiche un message de success sur la popup sans recharger la page. Mes données sont bien enregistrés en base de données mais la page se recharge automatiquement pour afficher le message de validation (comportement non souhaiter). Je n'arrive pas à bloquer le rechargement de la page ou même à afficher le message sur la popup pendant quelques secondes et puis la faire disparaître après. Merci !
Un exemple du code :
Code :
|
Code :
|
Marsh Posté le 17-05-2018 à 18:09:50
Bonjour,
La partie JQuery fait apparaître deux requêtes Ajax différentes, laquelle ne va pas ? (a priori la première)
Quel est le HTML (généré) correspondant à ces éléments ?
Marsh Posté le 17-05-2018 à 23:26:24
Re,
La première requête Ajax permet d'afficher ma popup. Cette dernière s'affiche bien avec mon formulaire. Et la deuxième permet de traiter la validation du formulaire. C'est celle-ci qui me pose problème. Car je valide le formulaire j'enregistre bien mes données en base mais je n'arrive pas à faire en sorte de garder la popup ouvert (sans recharger la page) pour afficher une alerte (success ou échec).
Cdlt,
Marsh Posté le 18-05-2018 à 09:42:08
Et tu récupères quelque chose dans la console ici :
Code :
|
?
Marsh Posté le 18-05-2018 à 10:29:59
Le resultat de console.log(result) me renvoie ce : "Formulaire validé avec success" quand je valide le formulaire.
Marsh Posté le 18-05-2018 à 10:42:17
Et tu n'as aucune erreur dans la console ?
Et si tu essayes d'attacher une id à l'élément form et de le sélectionner par son id plutôt que de sélectionner tous les éléments form ?
Sinon je veux bien voir le HTML généré car le preventDefault() devrait interrompre l'évènement submit donc il doit y avoir une subtilité cachée.
Marsh Posté le 18-05-2018 à 10:48:34
Au passage,
Code :
|
Pas la peine de mettre le type de requête si tu utilises $.post puisque c'est un alias de $.ajax pour le type post...
Marsh Posté le 18-05-2018 à 11:06:18
Ok c'est noté. J'ai enlevé le type dans le code.
Je n'ai aucune erreur dans la console.
Voici le html de mon formulaire:
Code :
|
et voici le corps de la popup dans lequel je viens injecter mon formulaire grâce au :
Code :
|
:
Code :
|
Le formulaire et le corps de la popup sont dans deux fichiers distincts : form.html.twig et popup.html.twig. Je récupère l'url du formulaire à l'aide de :
Code :
|
qui est passé en ajax et me permet d'inclure mon formulaire dans le body de la popup et afficher le tout en même temps :
Code :
|
Résultat de la console : {"formSuccess":{"headers":{}},"successMessage":"Formulaire validé avec success"}
Marsh Posté le 18-05-2018 à 14:13:04
Quand je dis le HTML généré je parle plus du code source de la page à minima ou alors carrément le code interprété quand du contenu dynamique est chargé.
Mais bon je pense avoir compris le problème quand même. Ce que tu as dans ta console c'est juste le message disant que tu as généré avec succès ton popup et non que les données du formulaire ont bien été envoyées. Les données de ton formulaire sont bien envoyées mais pas en ajax. En fait tu ajoutes une écoute de l'évènement "submit" :
Code :
|
Avant d'avoir généré ton popup, l'évènement n'est donc attaché à aucun formulaire.
Il faut en fait placé ce code dans le If suivant :
Code :
|
Ainsi l'évènement "submit" ne sera attaché à l'élément "form" qu'une fois ce dernier créé.
Marsh Posté le 18-05-2018 à 14:52:37
Désolé pour l'avant dernier message.
Ça marche maintenant.
Merci beaucoup !
Cdlt,
Marsh Posté le 22-05-2018 à 10:16:17
Bonjour @MaybeEijOrNot,
Je confirme ce que tu avais dit dans ton précédent post "Les données de ton formulaire sont bien envoyées mais pas en ajax."
Du coup j'ai du modifié ma requête ajax mais jusqu'à présent je ne vois pas mon message.
Code :
|
Marsh Posté le 22-05-2018 à 10:54:47
Et donc maintenant les données sont envoyées en Ajax ?
Le rechargement de la page est bien annulé ?
C'est pour savoir s'il n'y a que le message qui déconne ou si c'est encore toute la requête.
Marsh Posté le 22-05-2018 à 10:58:39
Les données ne sont pas envoyées en Ajax. C'est ça qui déconne je pense.
Mais le rechargement de la page est bien annulé.
Marsh Posté le 22-05-2018 à 11:11:19
Les données sont envoyées, pas en Ajax et il n'y a pas de rechargement de la page ? o_O
C'est quoi le code HTML de la balise form ?
Marsh Posté le 22-05-2018 à 11:49:33
C'est une simple vue twig : j'ai préféré illustrer mon code avec un petit exemple du code suivant pour être plus claire car il y a beaucoup de contenus dans mon code qui serait un peu compliqué d'exposer ici et aussi pour faciliter la compréhension. C'est juste un formulaire pour poser une question sur un article avec comme champs : le pseudo de l'utilisateur, le titre et le corps de la question.
Code :
|
Voici à quoi ressemble le code source :
Code :
|
Marsh Posté le 22-05-2018 à 16:17:05
Je ne connais pas trop jQuery mais ta sélection $('form') retourne une collection, je suppose qu'en suite jQuery traite ça avec un forEach. Mais peut-être que ça pose problème, peux-tu me dire ce qu'il en est si tu sélectionnes uniquement ton formulaire :
Code :
|
Et je ne comprends toujours pas si des données sont envoyées ou non actuellement.
Marsh Posté le 22-05-2018 à 16:43:31
J'ai bien ciblé mon formulaire avec l'Id mais c'est toujours le même résultat :
Code :
|
Mes données sont envoyées car je les enregistre dans ma base de données. Mais elles ne sont pas envoyées en Ajax.
Je crains si le problème ne vient pas de mon controller :
Code :
|
Marsh Posté le 22-05-2018 à 17:59:42
Comment sais-tu que ta requête n'est pas envoyée en Ajax ? Parce que là, normalement, si il n'y a pas de rechargement de la page c'est que l'évènement a bien été interceptée. Donc à moins qu'une autre partie du JS intercepte l'évènement (ce qui est très peu probable) je ne vois pas comment il pourrait passer ailleurs.
Que dit ta console dans la partie réseau ? Dans l'en-tête de la requête (pas de la réponse) tu retrouves :
Code :
|
ou
Code :
|
?
Et je ne vois pas trop comment la problème pourrait venir de ton controller, je ne connais pas Symfony mais là tu n'as que la création de ton pop-up/formulaire. Et pour l'instant il semble formé correctement.
Marsh Posté le 23-05-2018 à 09:27:16
Dans l'entête de la requête je trouve ceci:
Content-Type:
multipart/form-data; boundary=…----------------8531910721294
Marsh Posté le 23-05-2018 à 10:15:07
Du coup cela semble bien passer par la requête Ajax car chez moi une requête gérée par le formulaire passe avec l'entête : "Content-Type : application/x-www-form-urlencoded". Donc ce serait plus l'affichage de la réponse qui déconnerait. Par contre, de^puis que tu as changé le code, que retourne ton console.log(result) ?
Marsh Posté le 28-05-2018 à 10:39:43
Bonjour @MaybeEijOrNot,
Désolé pour le retard je travaillais sur un autre sujet.
En fait, je n'arrive pas à afficher mon message d'erreur.
Cdlt,
Marsh Posté le 28-05-2018 à 15:27:40
Et elle est où la partie PHP qui gère cette requête POST ?
Parce que, pour moi, le PHP que tu as mis c'est juste pour générer la pop-up avec le formulaire.
Marsh Posté le 28-05-2018 à 15:49:07
Hello,
Voici la partie qui traite le formulaire :
Code :
|
Marsh Posté le 28-05-2018 à 19:05:02
Donc si je comprends bien, c'est le même controller qui permet de gérer la requête pour afficher le pop-up du formulaire et gérer la requête du formulaire ?
Si je résume, tout semble indiquer que ta requête Ajax part bien puisque il n'y a pas rechargement de la page et dans la console réseau tu retrouves bien une requête POST avec un content-type "multipart/form-data".
D'après toi, ces données arrivent bien sur ton serveur et sont traitées car elles sont ajoutées à la base de données. (tu as bien vérifié que ce n'était pas un ancien jeu de données qui était déjà dans la base de données par hasard ?)
Et d'après ton controller, que la requête soit bonne ou non, une réponse est envoyée.
Mais toi de ton côté tu ne reçois aucune réponse.
Là il y a un truc qui nous échappe...
Juste une petite idée, ta réponse étant du json, tu peux préciser dans ta requête ajax que tu attends une réponse en json :
Code :
|
Mais je ne pense pas que ça puisse bloquer là.
Sinon je suis à court d'idées, faut essayer de fouiller dans ta console réseau voir que tout colle. Essaye de voir que ta requête va bien à la bonne adresse, une fois ta requête sélectionnée dans la console, regarde dans l'onglet "Paramètres" que tout correspond, regarde si dans l'onglet "Réponse" tu as une réponse ou non.
Marsh Posté le 03-05-2018 à 14:10:55
Bonjour à tous,
J'ai un souci d'affichage de mon formulaire dans une popup. Ma vue du formulaire est un fichier : add.html.twig qui lui même est inclut dans un template parent.
Quand je clique pour afficher ma popup, j'ai les erreurs suivantes : "Variable 'form' does not exist." et "Variable 'entity' does not exist". Les 2 vues n'ont pas le même controller.
Je n'arrive pas à accéder à mon formulaire via le fichier d'include. J'ai essayé de faire un : {{ rendre(contrôler('AppBundle:Form:add', {} )}} dans le template mais toujours rien.
J'affiche bien mon formulaire sans include() et mon controller s'exécute bien. Je ne vois pas d'où vient le problème à part qu'il me dit les variables 'form' et 'entity' n'existent. Hors ces 2 variables existent belle et bien mais ils ne sont pas accessibles en include. Merci par avance pour votre aide !