THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline


Bonjour,

Dans la doc, il est écrit :

Since the version 2.3, it’s possible to generate an URL from the route id. The argument router has a default value the current environment (front or admin).

{url route_id="contact.success"}
{url route_id="admin.catalog"}
{url route_id="admin.folders.update" folder_id=42}

Dans mon tempate "services.html", j'ai un formulaire de contact qui appelle le controlleur via la route contact.success
J'ai écrit :

<form id="form-contact" action='{url route_id="contact.success"} folder_id={folder attr="id"}' method="post">

L'URL générée est : https://www.monsite.fr/contact/success folder_id=5 (remarquez l'espace)
Ecrire manuellement https://www.monsite.fr/contact/success?folder_id=5 ne fonctionne guère mieux.

Est-il réellement possible de passer un paramètre à une route ?

Last edited by anti-conformiste (03-05-2017 10:47:55)

Offline


Plus simplement, comment passer un paramètre dans la form ci-dessous ?
En ajoutant un paramètre, la route n'est plus reconnue et rien ne fonctionne évidemment.

<form id="form-contact" action='{url path="/contact"} method="post">

Dans ce cas, 'contact' est une route qui fait appelle au module front qui transmet au contrôleur, si j'ai bien compris.

Je pose la question autrement : est-il possible de passer des paramètres sans écrire un module ?

Last edited by anti-conformiste (01-05-2017 20:13:27)

Offline


Il faut écrire :

{url route_id="contact.success" folder_id={folder attr="id"}}

et non pas  :

{url route_id="contact.success"} folder_id={folder attr="id"}'

En résumé la bonne syntaxe c'est celle de la doc : {url route_id="id de la route" param1=val1 param2=val2 ...}

Ceci dit, tu veux passer un paramètre à quoi ? A un contrôleur ? A un template ?


OpenStudio Toulouse

Offline


Je veux passer le paramètre {folder attr="id"} au contrôleur via la route 'contact' pour que le template "contact-success.html" reprenne ma page services.html (qui commence par {extends file="services.html"} )

En bas de mon template "services.html", il y a un formulaire. Lorsque l'internaute le valide, la même page se recharge, il revient sur la même ancre, et le formulaire est remplacé par le message de succès. Et sa navigation n'est pas perturbée. Via un "hidden field", je sais router le message au bon service et le client n'a pas à dispatcher tous les e-mails qui arrivent dans sa boîte contact.

Offline


J'ai écrit

<form id="form-contact" action='{url path="/contact" folder_id={folder attr="id"}}' method="post">

Thelia répond

Unable to find image source. Valid sources are category,product,folder,content,module,brand

(eh oui, je suis hors contexte, une des boucles attend une variable folder={folder attr="id"}, mais  {folder attr="id"} n'est pas transmise.

J'ai tenté

<form id="form-contact" action='{url route_id="contact" folder_id={folder attr="id"}}' method="post">

Thelia répond

Unable to generate a URL for the named route "contact" as such route does not exist.

Pourtant, /contact est bien une route puisque si je supprime "contact.html" , le module est appelé et le contrôleur exécute la form qui me renvoie un message de succès et je reçois mon e-mail de contact.

Je sèche un peu...

Last edited by anti-conformiste (01-05-2017 23:10:51)

Offline


En fait la route ce n'est pas "contact", mais "contact.send"

Ecrire ceci ne change rien cela dit :

<form id="form-contact" action='{url route_id="contact.send" folder_id={folder attr="id"}}' method="post">

Thelia dit

Unable to find image source. Valid sources are category,product,folder,content,module,brand

La variable n'est pas transmise sad

PS, j'ai remplacé folder_id={folder attr="id"} par une id en "en dur" (folder_id=5) pour être sûr, même résultat.

Offline


Le message d'erreur n'a rien à voir avec ta form, regarde du côté de la boucle image dans ta page, un dew paramètres (folder ?) doit être vide.


OpenStudio Toulouse

Offline


roadster31 wrote:

Le message d'erreur n'a rien à voir avec ta form, regarde du côté de la boucle image dans ta page, un dew paramètres (folder ?) doit être vide.

Sur ma page j'ai

{loop type='folder' name='service' id={folder attr="id"}}

Quand je supprime la boucle, ça fonctionne parfaitement. J'en déduit que folder_id n'est pas transmis.

Last edited by anti-conformiste (02-05-2017 08:05:58)

Offline


Le message vient d'une boucle image.


OpenStudio Toulouse

Offline


roadster31 wrote:

Le message vient d'une boucle image.

C'est exact :
{loop type='image' name='ref.thumb' folder={folder attr="id"} width='452' height='283' resize_mode='borders' offset="1"}

Offline


D'un coté (template "services.html"), j'ai ça

[..]
{block name="contact-form"}
       {form name="thelia.front.contact"}
            <form id="form-contact" action='{url route_id="contact.send" folder_id=5}' method="post">
                    [..]
             </form>
       {/form}
{/block}
[..]

Cette page est rappelée via le contrôleur du module front à travers la route "contact.success" qui renvoie vers le template "contact-success.html" qui contient ça :

{extends file="services.html"}

{block name="contact-form"}
    <div class="contact-success alert alert-success text-center">
        {ifhook rel="contact.success"}
           {hook name="contact.success"}
        {/ifhook}
        {elsehook rel="contact.success"}
        <h2 class="fa fa-comments">{intl l="Thanks !"}</h2>
        <p>{intl l="Thanks for your message, we will contact as soon as possible."}</p>
        {/elsehook}
    </div>
{/block}

Le template "services.html" est donc rappelé ({extends file="services.html"}) et la boucle qui n'obtient pas le paramètre d'entrée folder est celle-ci

[..]
{loop type='image' name='ref.thumb' folder={folder attr="id"} width='452' height='283' resize_mode='borders' offset="1"}
[...]
{/loop}
[..]

Dans la chaine, j'ai un paramètre "folder_id" qui se perd...

J'espère avoir pu apporter un maximum d'info le plus clairement possible... smile

Last edited by anti-conformiste (02-05-2017 09:09:20)

Offline


Pour récupérer un paramètre de l'url, tu dois utiliser {$smarty.get.nom_du_parametre}, et pas {folder attr=id}, qui n'est utilisable que sur les pages folder (dossier, quoi)


OpenStudio Toulouse

Offline


Oui, j'avais omis ce détail important.

D'ailleurs dans ce cas, c'est plus un post : {$smarty.post.nom_du_parametre} (formulaire).

Mais en écrivant cela

<form id="form-contact" action='{url route_id="contact.send" folder_id={folder attr="id"}}' method="post">

et en récupérant àa

{$smarty.get.folder_id}

Thelia renvoie une erreur 500 avec l'url suivante

/contact?folder_id=7

L'erreur 500 (not found 404, bien oui...)

Fatal error: Uncaught Thelia\Core\Template\Exception\ResourceNotFoundException: Template file 404.html cannot be found. in /home/monsite/public_html/id-media/local/modules/TheliaSmarty/Template/SmartyParser.php:392 Stack trace: #0 /home/monsite/public_html/id-media/core/lib/Thelia/Action/HttpException.php(87): TheliaSmarty\Template\SmartyParser->render('404.html') #1 /home/monsite/public_html/id-media/core/lib/Thelia/Action/HttpException.php(46): Thelia\Action\HttpException->display404(Object(Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent)) #2 [internal function]: Thelia\Action\HttpException->checkHttpException(Object(Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent), 'kernel.exceptio...', Object(Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher)) #3 /home/monsite/public_html/id-media/core/vendor/symfony/event-dispatcher/EventDispatcher.php(181): call_user_func(Array, Object(Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent), 'kernel.exceptio...', Object(Symfony\ in /home/monsite/public_html/id-media/local/modules/TheliaSmarty/Template/SmartyParser.php on line 392

Ce qui fait que je me demande si on peut vraiment passer une variable à une route, même dans la v2.3.3.

Last edited by anti-conformiste (02-05-2017 15:04:09)

Offline


On peut toujours "passer" une variable à une route pour fabriquer une URL, ce n'est pas pour çà que ça va faire quelque chose d'intelligent dans le controleur ou le template qui est invoqué par cette URL.

Déjà, le template 404.html n'existe pas. Crée le.

Ensuite, le dossier ID=7 existe-t-il ?


OpenStudio Toulouse

Offline


Oui, le j'ai crée le template. Oui, le dossier id=7 existe bien, je teste tout manuellement dans l'url non ré-écrite avant de tester avec des variables dynamiques, voire je remplace directement par des valeurs en dur.

Offline


Lorsque tu essaies de passer un paramètre via le formulaire, le récupères-tu dans le template "contact-success.html" ?

Last edited by anti-conformiste (02-05-2017 16:26:51)

Offline


OK, j'ai compris.

Ta form est en POST, et l'URL générée par {url route_id="contact.send" folder_id={folder attr="id"}} comporte un paramètre (/contact?folder_id=x)

Comme la ré-écriture est activée, le système de gestion de ré-écriture essaie de trouver une route qui matche "/contact?folder_id=x" (au lieu de "/contact"), et évidemment, il ne trouve rien.

Autre problème : La méthode qui traite la soumission de la form (Front\Controller\ContactController::sendAction(), pointée par la route contact.send) fait une redirection vers /contact-success via la route "contact.success", et ton paramètre, s'il était passé à cette méthode, disparaitrait bien sûr dans la redirection.

Mais tout n'est pas perdu. En effet, si le champ "success_url" est défini dans la form (c'est un champ standard de toutes le form), alors Front\Controller\ContactController::sendAction() redirigera vers cette URL plutôt que vers  la route "contact.success".

Il te reste donc à ajouter à ta form :

{form_field field="success_url"}
    <input type="hidden" name="{$name}" value="{url path"/contact-success" folder_id=5}">
{/form}

Si tu préfère utiliser une route plutôt que directement une URL :

{form_field field="success_url"}
    <input type="hidden" name="{$name}" value="{url route_id="contact.success" folder_id=5}">
{/form}

Et ça devrait faire la blague, le controleur redirigera vers l'URL /contact-success?folder_id=5, et tu pourra récupérer ton folder ID avec {$smarty.get.folder_id}


OpenStudio Toulouse

Offline


Ta form est en POST, et l'URL générée par {url route_id="contact.send" folder_id={folder attr="id"}} comporte un paramètre (/contact?folder_id=x)

Comme la ré-écriture est activée, le système de gestion de ré-écriture essaie de trouver une route qui matche "/contact?folder_id=x" (au lieu de "/contact"), et évidemment, il ne trouve rien.

Oui, je m'en suis rendu compte rapidement et j'avais désactivé le rewriting.

Autre problème : La méthode qui traite la soumission de la form (Front\Controller\ContactController::sendAction(), pointée par la route contact.send) fait une redirection vers /contact-success via la route "contact.success", et ton paramètre, s'il était passé à cette méthode, disparaitrait bien sûr dans la redirection.

Mais tout n'est pas perdu. En effet, si le champ "success_url" est défini dans la form (c'est un champ standard de toutes le form), alors Front\Controller\ContactController::sendAction() redirigera vers cette URL plutôt que vers  la route "contact.success".

Tout cela est fort cohérent. Je teste et je feedback.
Merci pour ton soutien.

Offline


Non, j'ai parlé trop vite, j'ai bien désactivé la réécriture en fait et depuis le 2nd post...

Last edited by anti-conformiste (02-05-2017 17:26:44)

Offline


Essaie sur un site avec le rewriting à 0, on obtient toujours l'url "/contact?folder_id=x" au lieu de /contact/success

Offline


Je t'ai donné la bonne façon de faire, pourquoi t'acharnes-tu à essayer de passer une variable dans l'url de la form POSTée ?


OpenStudio Toulouse

Offline


roadster31 wrote:

Je t'ai donné la bonne façon de faire, pourquoi t'acharnes-tu à essayer de passer une variable dans l'url de la form POSTée ?

Parce que je fais 3 sites en même temps et les devoirs des enfant smile
Désolé, du coup, je n'avais pas tout compris, je pensais qu'il fallait aussi garder les paramètres en post dans la form, ce qui est en effet parfaitement incohérent avec tes précédentes remarques. Mais comme la doc dit que c'est possible, je suis tetu.

Je teste ça...

Last edited by anti-conformiste (02-05-2017 17:53:23)

Offline


Bon, on avance, ça fonctionne, y compris avec le rewriting activé !

Le contrôleur redirige bien vers/contact-success?folder_id=5, et je récupère mon paramètre "folder_id" directement, sans faire appel à  {$smarty.get.folder_id}. Je reçois mon petit message.

Reste un petit détail : au lieu du message success, il m'affiche à nouveau le formulaire...

Offline


Reste un petit détail : au lieu du message success, il m'affiche à nouveau le formulaire...

Une URL comme /contact-success?folder_id=5 permet bien d'afficher le message de remerciement, et de cacher le formulaire avec le template default.

Ton fichier contact-success.html a du être modifié.


OpenStudio Toulouse

Offline


Il fonctionnait en écrivant les paramètres en dur pourtant.
Le voici :

{extends file="services.html"}

{block name="contact-form"}
    <div class="contact-success alert alert-success text-center">
        {ifhook rel="contact.success"}
           {hook name="contact.success"}
        {/ifhook}
        {elsehook rel="contact.success"}
        <h2 class="fa fa-comments">{intl l="Thanks !"}</h2>
        <p>{intl l="Thanks for your message, we will contact as soon as possible."}</p>
        {/elsehook}
    </div>
{/block}