[Résolu] Problème Smarty/Back

Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
#1
Citation :#~~~~~ DEBUT BLOC A NE PAS SUPPRIMER ~~~~~
#~ Version du CMS: 2.1.2
#~ Url du site :
#~ Hébergeur / Soft : wampserver
#~ Informations Système :
#~~~~~ FIN BLOC A NE PAS SUPPRIMER ~~~~~


Bonjour à tous,

Je bloque sur un petit problème qui est d'ailleurs lié à Smarty, du coup je viens vers vous afin de savoir si quelqu'un aurait une idée de solution Wink

Sur mon fichier .tpl j'ai :

Code :
[== HTML ==]
{foreach from=$listfiles key=k item=file }

    {$file["Key"]}

   <input type="submit" name="{$actionid}downloadfile" value="{$mod->Lang('download_file')}"/>

{/foreach}

Mon but étant de récupérer sur mon back la value de mon {$file["Key"]} correspondant au submit.

Sur le back :
Code :
[== PHP ==]
if(isset($params['downloadfile'])){

}

Pour résoudre ce problème, j'avais dans l'idée d'ajouter un input hidden pour chaque item de mon foreach :
Code :
[== HTML ==]
{foreach from=$listfiles key=k item=file }

      <input type="hidden" name="{$actionid}cache[]" value="{$file['Key']}"/>  

      {$file["Key"]}

      <input type="submit" name="{$actionid}downloadfile" value="{$mod->Lang('download_file')}"/>

{/foreach}

Le problème étant que je n'ai pas la possibilité de savoir quel est la key "k"... Donc quand dans le back je fais un var_dump($params['cache']); L'ensemble du array s'affiche Wink

Merci d'avance pour toutes les réponses qui pourront faire avancer mon schmilblick Smile
#1
Citation :#~~~~~ DEBUT BLOC A NE PAS SUPPRIMER ~~~~~
#~ Version du CMS: 2.1.2
#~ Url du site :
#~ Hébergeur / Soft : wampserver
#~ Informations Système :
#~~~~~ FIN BLOC A NE PAS SUPPRIMER ~~~~~


Bonjour à tous,

Je bloque sur un petit problème qui est d'ailleurs lié à Smarty, du coup je viens vers vous afin de savoir si quelqu'un aurait une idée de solution Wink

Sur mon fichier .tpl j'ai :

Code :
[== HTML ==]
{foreach from=$listfiles key=k item=file }

    {$file["Key"]}

   <input type="submit" name="{$actionid}downloadfile" value="{$mod->Lang('download_file')}"/>

{/foreach}

Mon but étant de récupérer sur mon back la value de mon {$file["Key"]} correspondant au submit.

Sur le back :
Code :
[== PHP ==]
if(isset($params['downloadfile'])){

}

Pour résoudre ce problème, j'avais dans l'idée d'ajouter un input hidden pour chaque item de mon foreach :
Code :
[== HTML ==]
{foreach from=$listfiles key=k item=file }

      <input type="hidden" name="{$actionid}cache[]" value="{$file['Key']}"/>  

      {$file["Key"]}

      <input type="submit" name="{$actionid}downloadfile" value="{$mod->Lang('download_file')}"/>

{/foreach}

Le problème étant que je n'ai pas la possibilité de savoir quel est la key "k"... Donc quand dans le back je fais un var_dump($params['cache']); L'ensemble du array s'affiche Wink

Merci d'avance pour toutes les réponses qui pourront faire avancer mon schmilblick Smile
#2
Bonjour,

Te faut-il obligatoirement passer par un formulaire ? Tu peux très bien faire des liens avec {cms_action_url} :
Code :
{foreach $listfiles as $k=>$file}
<a href="{cms_action_url action='NOM_ACTION' file_key=$k}">Télécharger {$file}</a>
{/foreach}

Ou alors j'ai mal compris le but de l'action... peux-tu préciser ton intention dans ce cas ?

Merci et a+
#2
Bonjour,

Te faut-il obligatoirement passer par un formulaire ? Tu peux très bien faire des liens avec {cms_action_url} :
Code :
{foreach $listfiles as $k=>$file}
<a href="{cms_action_url action='NOM_ACTION' file_key=$k}">Télécharger {$file}</a>
{/foreach}

Ou alors j'ai mal compris le but de l'action... peux-tu préciser ton intention dans ce cas ?

Merci et a+
#3
Bonjour,

HUM... Merci pour la réponse !!! c'est exactement ce que je cherchais. Smile

Je passe le sujet en résolu.

(merci encore)
#3
Bonjour,

HUM... Merci pour la réponse !!! c'est exactement ce que je cherchais. Smile

Je passe le sujet en résolu.

(merci encore)
#4
Super Wink Bonne continuation
#4
Super Wink Bonne continuation
#5
Juste avant de mettre en résolu, j'ai une mini question Wink

Je voulais savoir si c'était possible de mettre un {cms_action_url} dans du jQuery Wink

Code :
[== HTML ==]
<a class="del_user" href="{cms_action_url action=delete_user hid=$user->id}" title="{$mod->Lang('delete')}">
                            

</a>

Par exemple avec ce type de code, j'aimerais l'intégrer dans une balise <td>, mais malgré mes recherches, pas trouvé...
Code :
[== JavaScript ==]
/**
* [sBuildTab create table]
* @type {String}
*/
var sBuildTab = "";

/**
* [oDictUser correspond user]
* @type {[type]}
*/
var oDictUser = oDictionnaryListFile[$id_select_client.val()];

/**
* [oDictUserWithFeatures correspond features]
* @type {[type]}
*/
var oDictUserWithFeatures = oDictUser[$id_select_features.val()];

$(oDictUserWithFeatures).each(function(index, value){
    
    sBuildTab += "<tr>";

        sBuildTab += "<td>";
            sBuildTab += value;
        sBuildTab += "</td>";

    sBuildTab += "</tr>";

});

$("#id_tbody_file").empty();
$("#id_tbody_file").append(sBuildTab);

Merci d'avance pour les personnes qui pourront me répondre Smile
#5
Juste avant de mettre en résolu, j'ai une mini question Wink

Je voulais savoir si c'était possible de mettre un {cms_action_url} dans du jQuery Wink

Code :
[== HTML ==]
<a class="del_user" href="{cms_action_url action=delete_user hid=$user->id}" title="{$mod->Lang('delete')}">
                            

</a>

Par exemple avec ce type de code, j'aimerais l'intégrer dans une balise <td>, mais malgré mes recherches, pas trouvé...
Code :
[== JavaScript ==]
/**
* [sBuildTab create table]
* @type {String}
*/
var sBuildTab = "";

/**
* [oDictUser correspond user]
* @type {[type]}
*/
var oDictUser = oDictionnaryListFile[$id_select_client.val()];

/**
* [oDictUserWithFeatures correspond features]
* @type {[type]}
*/
var oDictUserWithFeatures = oDictUser[$id_select_features.val()];

$(oDictUserWithFeatures).each(function(index, value){
    
    sBuildTab += "<tr>";

        sBuildTab += "<td>";
            sBuildTab += value;
        sBuildTab += "</td>";

    sBuildTab += "</tr>";

});

$("#id_tbody_file").empty();
$("#id_tbody_file").append(sBuildTab);

Merci d'avance pour les personnes qui pourront me répondre Smile
#6
Oui c'est possible, et il y a un paramètre "forjs" normalement pour la balise {cms_action_url} - regarde l'aide du plugin (Extensions / Balises , dans l'admin). Tu peux t'en servir pour disposer d'une URL d'action faite pour JS.
#6
Oui c'est possible, et il y a un paramètre "forjs" normalement pour la balise {cms_action_url} - regarde l'aide du plugin (Extensions / Balises , dans l'admin). Tu peux t'en servir pour disposer d'une URL d'action faite pour JS.
#7
Merci Smile

Je n'avais pas compris qu'il était possible de regarder la doc directement par le back... Wink

Code :
[== JavaScript ==]
$(oDictUserWithFeatures).each(function(index, value){
    
    sBuildTab += "<tr>";

        sBuildTab += "<td>";
            sBuildTab += value;
        sBuildTab += "</td>";


        sBuildTab += '<td>';
            sBuildTab +='<a class="del_file" href={cms_action_url action=delete_file namefile='+value+' forjs=1} title="delete">';
                sBuildTab += '{admin_icon icon="delete.gif"}';    
            sBuildTab += '</a>';
        sBuildTab += '</td>';

    sBuildTab += "</tr>";

});

Néanmoins, lors du retour sur le back, mon params["namefile"] a pour valeur "+value+"... et non la valeur de la variable, ce qui est logique parce qu'un petit coup de F12 me montre bien que la variable n'est pas interprétée...

Je vous embête encore une fois pour savoir si vous auriez une idée pour forcer l'interprétation d'une variable ?

Merci pour les réponses qui me seront apportées Smile
#7
Merci Smile

Je n'avais pas compris qu'il était possible de regarder la doc directement par le back... Wink

Code :
[== JavaScript ==]
$(oDictUserWithFeatures).each(function(index, value){
    
    sBuildTab += "<tr>";

        sBuildTab += "<td>";
            sBuildTab += value;
        sBuildTab += "</td>";


        sBuildTab += '<td>';
            sBuildTab +='<a class="del_file" href={cms_action_url action=delete_file namefile='+value+' forjs=1} title="delete">';
                sBuildTab += '{admin_icon icon="delete.gif"}';    
            sBuildTab += '</a>';
        sBuildTab += '</td>';

    sBuildTab += "</tr>";

});

Néanmoins, lors du retour sur le back, mon params["namefile"] a pour valeur "+value+"... et non la valeur de la variable, ce qui est logique parce qu'un petit coup de F12 me montre bien que la variable n'est pas interprétée...

Je vous embête encore une fois pour savoir si vous auriez une idée pour forcer l'interprétation d'une variable ?

Merci pour les réponses qui me seront apportées Smile
#8
Bonsoir,
Tu dois placer une balise {literal} avant le JS et {/literal} après le JS pour éviter que les accolades ne soit évaluées par Smarty : http://www.smarty.net/docsv2/fr/language...iteral.tpl
#8
Bonsoir,
Tu dois placer une balise {literal} avant le JS et {/literal} après le JS pour éviter que les accolades ne soit évaluées par Smarty : http://www.smarty.net/docsv2/fr/language...iteral.tpl
#9
Il est normal dans ce cas que +value+ soit la valeur car Smarty va interpréter le code, puis le renvoyer au navigateur. Ensuite seulement le JS prend le relais. Smarty est côté serveur, il faut le comprendre comme étant du PHP. Donc la logique n'est pas bonne dans ton code.

Dans ton cas, il faut trouver une astuce pour faire interagir les deux.

La remarque de Jean le Chauve, bien que pertinente de manière générale pour le JS au sein du Smarty, ne s'applique pas pour toi car tu as besoin d'utiliser du Smarty au sein du JS. Il faut juste veiller à ce que les accolades ouvrantes dans ton code JS soient suivies par au moins un espace ou un saut de ligne pour qu'il ne soit pas interprété par Smarty.

Pour ta solution, il faut tenter plutôt quelque chose comme ca :
Code :
$url = "{cms_action_url forjs=1 action='delete_file'}"

Puis dans ta boucle :
Code :
sBuildTab +='<a class="del_file" href="' + $url + '&cntnt01namefile=' + value + '" title="delete">';
#9
Il est normal dans ce cas que +value+ soit la valeur car Smarty va interpréter le code, puis le renvoyer au navigateur. Ensuite seulement le JS prend le relais. Smarty est côté serveur, il faut le comprendre comme étant du PHP. Donc la logique n'est pas bonne dans ton code.

Dans ton cas, il faut trouver une astuce pour faire interagir les deux.

La remarque de Jean le Chauve, bien que pertinente de manière générale pour le JS au sein du Smarty, ne s'applique pas pour toi car tu as besoin d'utiliser du Smarty au sein du JS. Il faut juste veiller à ce que les accolades ouvrantes dans ton code JS soient suivies par au moins un espace ou un saut de ligne pour qu'il ne soit pas interprété par Smarty.

Pour ta solution, il faut tenter plutôt quelque chose comme ca :
Code :
$url = "{cms_action_url forjs=1 action='delete_file'}"

Puis dans ta boucle :
Code :
sBuildTab +='<a class="del_file" href="' + $url + '&cntnt01namefile=' + value + '" title="delete">';
#10
airelibre a écrit :
Code :
$url = "{cms_action_url forjs=1 action='delete_file'}"

Puis dans ta boucle :
Code :
sBuildTab +='<a class="del_file" href="' + $url + '&cntnt01namefile=' + value + '" title="delete">';

La variable $url serait dans mon controller et je l'enverrais sur Smarty avec assign ?

Le problème est qu'il me faudrait {cms_action_url action=delete_file namefile=value forjs=1}, dans votre exemple le namefile est en dehors des "{" "}" du coup je ne peux pas le récupérer avec $params["namefile"] si ?

merci pour toutes les réponses
#10
airelibre a écrit :
Code :
$url = "{cms_action_url forjs=1 action='delete_file'}"

Puis dans ta boucle :
Code :
sBuildTab +='<a class="del_file" href="' + $url + '&cntnt01namefile=' + value + '" title="delete">';

La variable $url serait dans mon controller et je l'enverrais sur Smarty avec assign ?

Le problème est qu'il me faudrait {cms_action_url action=delete_file namefile=value forjs=1}, dans votre exemple le namefile est en dehors des "{" "}" du coup je ne peux pas le récupérer avec $params["namefile"] si ?

merci pour toutes les réponses
#11
Pour la variable $url, elle serait dans le JS. Smarty génère l'URL via {cms_action_url} puis JS la récupère sous forme de chaîne.

Tu peux récupérer ton $params['namefile'] car je l'ai ajouté à la fin de l'URL avec :
Code :
$url + '&cntnt01namefile=' + value
#11
Pour la variable $url, elle serait dans le JS. Smarty génère l'URL via {cms_action_url} puis JS la récupère sous forme de chaîne.

Tu peux récupérer ton $params['namefile'] car je l'ai ajouté à la fin de l'URL avec :
Code :
$url + '&cntnt01namefile=' + value
#12
Vous pensez à quelque chose comme ça ? Smile

Code :
[== JavaScript ==]
var url = "{cms_action_url action=delete_file forjs=1}";

$(oDictUserWithFeatures).each(function(index, value){

    sBuildTab +='<a class="del_file" href="'+ url + '&cntnt01namefile='+value+'"title="delete">';
        sBuildTab += '{admin_icon icon="delete.gif"}';    
    sBuildTab += '</a>';

});

merci encore pour les réponses, c'est vraiment super d'avoir autant d'aide sur le forum quand on débute Smile
#12
Vous pensez à quelque chose comme ça ? Smile

Code :
[== JavaScript ==]
var url = "{cms_action_url action=delete_file forjs=1}";

$(oDictUserWithFeatures).each(function(index, value){

    sBuildTab +='<a class="del_file" href="'+ url + '&cntnt01namefile='+value+'"title="delete">';
        sBuildTab += '{admin_icon icon="delete.gif"}';    
    sBuildTab += '</a>';

});

merci encore pour les réponses, c'est vraiment super d'avoir autant d'aide sur le forum quand on débute Smile
#13
C'est exactement ça - ca fonctionne ? Wink
#13
C'est exactement ça - ca fonctionne ? Wink
#14
Non Sad c'est comme si il n'y avait pas de "namefile" dans le href.

J'essaye de voir s'il n'y a pas d'autres solutions sans passer par jQuery.

J'avais pensé créer tout mon tableau et ensuite hide ou show en jQuery ce dont j'ai besoin mais pour ça il faudrait avoir des "class" avec des noms différents selon l'emplacement du dictionnaire, ça me semble hyper fouillis...
#14
Non Sad c'est comme si il n'y avait pas de "namefile" dans le href.

J'essaye de voir s'il n'y a pas d'autres solutions sans passer par jQuery.

J'avais pensé créer tout mon tableau et ensuite hide ou show en jQuery ce dont j'ai besoin mais pour ça il faudrait avoir des "class" avec des noms différents selon l'emplacement du dictionnaire, ça me semble hyper fouillis...
#15
Tu récupères bien l'url dans ton .each ? Après ca devient un problème de JS, donc l'inspecteur de code est ton ami Wink Tiens-nous au courant
#15
Tu récupères bien l'url dans ton .each ? Après ca devient un problème de JS, donc l'inspecteur de code est ton ami Wink Tiens-nous au courant
#16
airelibre a écrit :Tu récupères bien l'url dans ton .each ? Après ca devient un problème de JS, donc l'inspecteur de code est ton ami Wink Tiens-nous au courant

Dans mon .each j'ai bien l'url mais pas le "&cntn01namefile" à la suite dans le href ^^

Je vous tient au courant, merci pour les réponses.
#16
airelibre a écrit :Tu récupères bien l'url dans ton .each ? Après ca devient un problème de JS, donc l'inspecteur de code est ton ami Wink Tiens-nous au courant

Dans mon .each j'ai bien l'url mais pas le "&cntn01namefile" à la suite dans le href ^^

Je vous tient au courant, merci pour les réponses.
#17
Merci à tous pour les réponses Smile particulièrement à airlibre qui est ultra efficace !

J'ai fait un petit mix de tout, et finalement la solution était de mettre dans une variable l'URL comme l'avait proposé airlibre mais dans la boucle et lui associer directement le "namefile" que je récupère en GET dans le controller Smile

Problème réglé !! je lock vraiment le sujet du coup Big Grin

Encore merci !
#17
Merci à tous pour les réponses Smile particulièrement à airlibre qui est ultra efficace !

J'ai fait un petit mix de tout, et finalement la solution était de mettre dans une variable l'URL comme l'avait proposé airlibre mais dans la boucle et lui associer directement le "namefile" que je récupère en GET dans le controller Smile

Problème réglé !! je lock vraiment le sujet du coup Big Grin

Encore merci !
#18
Super, ravi de t'avoir aidé Wink Bonne continuation !
#18
Super, ravi de t'avoir aidé Wink Bonne continuation !


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)