Bonjour,
Je connais bien PHP avec lequel j'ai commencé en amateur depuis 2005, mais depuis peu j'ai décidé de monter en puissance et de me mettre à Symfony. J'ai la version 3.0.1, et je tourne sous WAMP avec PHP 5.5 pour le moment (le site n'est pas encore en ligne). Inévitablement, j'arrive avec plein de questions à mesure que je découvre ce framework, somme toute assez complexe et bien différent des petits bricolages habituels.
Aujourd'hui j'ai donc trois questions, qui sont liés à FOSUserBundle. J'en aurai sûrement d'autres par la suite.
Question 1
J'ai importé le FOSUserBundle pour avoir une gestion des utilisateurs toute faite, et je souhaite écraser les templates par défaut qu'il propose parce que forcément, ils sont ultra basiques. Pour ce faire, j'ai suivi la marche à suivre qui est expliquée ici: https://symfony.com/doc/master/bundles/FOSUserBundle/overriding_templates.html
J'ai donc créé deux fichiers app/resources/views/FOSUserBundle/views/layout.html.twig et app/resources/views/FOSUserBundle/views/Security/login.html.twig. Mais ça ne marche pas. Quand je vais à l'URL /login, je vois toujours le template par défaut.
J'ai essayé de supprimer le dossier var/cache complètement, comme plusieurs réponses stackoverflow le suggèrent. Mais ça ne change rien. J'ai même intégralement copié le dossier /vendor/friendsofsymfony/user-bundle/resources/views dans app/resources/views/FOSUserBundle/views et ai fait des modifications à partir de là pour être sûr d'avoir l'arborescence et les noms des fichiers corrects, mais ça ne fonctionne pas plus. Si je modifie les templates directement dans /vendor/friendsofsymfony/user-bundle/resources/views/, par contre ça fonctionne, je vois bien mes modifications. Mais normalement je ne suis pas censé les modifier à cet endroit.
Où est le problème ? Qu'est-ce que j'ai raté ?
Question 2
J'aimerais bien que les utilisateurs puissent se logger directement sur la page d'accueil, plutôt que de devoir aller sur /login. Quelle est la meilleure façon d'y parvenir ?
Pour le moment j'ai fait ça :
1 2 3 4 5 6 7 8 | {# app/resources/views/index.html.twig #} {% extends 'base.html.twig' %} {%block body%} <p>Du blabla qui n'a pas d'utilité ici</p> {% if not is_granted("IS_AUTHENTICATED_REMEMBERED") %} {{render(controller('FOSUserBundle:Security:login'))}} {% endif %} {%endblock%} |
Ca fonctionne, je peux me logger, mais j'entrevois un problème. Si je vais voir le code source HTML généré, je vois qu'il m'a inclus à double <!DOCTYPE HTML>
, <html>
, <body>
et tout le reste.
Logique vu que dans le layout.html.twig importé par login.html.twig ils y sont. Si j'arrive à résoudre la question 1, je devrais pouvoir modifier login.html.twig et grosso modo supprimer cette ligne qui en est responsable :
{% extends "FOSUserBundle::layout.html.twig" %}
Mais alors, si je supprime cette ligne, ça signifie que l'utilisateur qui ira sur /login n'aura que le formulaire brut et plus le reste de la page HTML autour. Pas bon vu qu'on atterrit sur cette page à chaque fois qu'on essaie d'aller sur une page sécurisée et qu'on n'est pas encore connecté.
J'en conclus donc que
{{render(controller('FOSUserBundle:Security:login'))}}
n'est pas la bonne solution pour intégrer le formulaire de login directement sur la page d'accueil.
Cependant, si je fais un include :
{{include('FOSUserBundle/views/Security/login.html.twig')}}
Alors je me ramasse des erreurs m'indiquant que des variables ne sont pas définies, des tokens CSRF par exemple. Donc ça ne doit sûrement pas être la bonne solution non plus.
Quelle est la bonne marche à suivre pour intégrer le formulaire de connexion directement sur la page d'accueil ?
Question bonus, faire en sorte que si on rentre un mauvais login, on reste sur la page où était le formulaire (qui ne sera pas forcément la page d'accueil dans le futur) et qu'on ne soit pas renvoyé vers /login dans ce cas.
Question 3 (résolue)
Réponse dans ce post
Mon site a vocation d'être traduit en plusieurs langues, j'ai donc activé le module de traduction. Il fonctionne très bien (je n'ai pas encore pigé comment utiliser transchoice, mais sinon ça va).
JE voudrais que la page de login soit aussi traduisible, et donc qu'elle soit à /{_locale}/login
au lieu de /login.
Si je copie le /vendor/friendsofsymfony/user-bundle/resources/config/routing/all.xml fourni avec FOSUserBundle, que je le modifie comme suit, et que j'indique le fichier de configuration mis à jour dans app/resources/routing.yml, j'obtiens bien le formulaire de connexion dans la bonne langue en allant sur /fr/login, /en/login, etc. et /login tout court ne fonctionne logiquement plus :
1 2 | <import resource="@FOSUserBundle/Resources/config/routing/security.xml" prefix="/{_locale}/login" /> |
Par contre, si j'essaie d'aller sur une page protégée sans être connecté, je suis toujours renvoyé vers /login pour m'identifier, et c'est donc une erreur 404 que j'obtiens à la place du formulaire de login. Il faut modifier security.yml pour lui indiquer la bonne page de login :
1 2 3 4 5 6 | # app/resources/config/security.yml form_login: provider: fos_userbundle login_path: ici le nouveau chemin à la place de /login use_referer: true csrf_token_generator: security.csrf.token_manager |
D'après ma compréhension de Symfony jusqu'ici, je pense avoir essayé assez logiquement :
login_path: "/{_locale}/login"
et
login_path: "/%_locale%/login"
mais ça ne fonctionne pas, il ne semble pas interpréter les variables.
Evidemment il faut que si j'essaie d'aller sur /fr/admin, je sois redirigé vers /fr/login pour me connecter, et similairement, avec /en/admin qui doit me renvoyer sur /en/login.
Je pourrais probablement ajouter une route alias sur /login pointant sur le même contrôleur pour m'éviter cette configuration, mais alors une autre question se pose: comment savoir en quelle langue le formulaire doit s'afficher ? Apparament il ne stocke pas la langue dans la session, il ne se base que sur l'URL; donc s'il n'y a pas de langue spécifiée dans l'URL, il s'affichera toujours en anglais par défaut.
Comment faire ?
Merci pour vos réponses
P.S. Merci de ne pas troller en me disant de passer à Django parce que python c'est bien et PHP c'est pourri. C'est un choix assumé.