Forum CMS Made Simple FR
[Résolu] Problème Smarty/Back - Version imprimable

+- Forum CMS Made Simple FR (https://www.cmsmadesimple.fr/forum)
+-- Forum : Général (https://www.cmsmadesimple.fr/forum/forum-3.html)
+--- Forum : Général (https://www.cmsmadesimple.fr/forum/forum-10.html)
+--- Sujet : [Résolu] Problème Smarty/Back (/thread-3993.html)



[Résolu] Problème Smarty/Back - debutems - 12/03/2017

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


[Résolu] Problème Smarty/Back - airelibre - 13/03/2017

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+


[Résolu] Problème Smarty/Back - debutems - 13/03/2017

Bonjour,

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

Je passe le sujet en résolu.

(merci encore)


[Résolu] Problème Smarty/Back - airelibre - 13/03/2017

Super Wink Bonne continuation


[Résolu] Problème Smarty/Back - debutems - 13/03/2017

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


[Résolu] Problème Smarty/Back - airelibre - 13/03/2017

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.


[Résolu] Problème Smarty/Back - debutems - 13/03/2017

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


[Résolu] Problème Smarty/Back - Jean le Chauve - 13/03/2017

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.function.literal.tpl


[Résolu] Problème Smarty/Back - airelibre - 14/03/2017

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">';



[Résolu] Problème Smarty/Back - debutems - 14/03/2017

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


[Résolu] Problème Smarty/Back - airelibre - 14/03/2017

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



[Résolu] Problème Smarty/Back - debutems - 14/03/2017

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


[Résolu] Problème Smarty/Back - airelibre - 14/03/2017

C'est exactement ça - ca fonctionne ? Wink


[Résolu] Problème Smarty/Back - debutems - 14/03/2017

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...


[Résolu] Problème Smarty/Back - airelibre - 14/03/2017

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


[Résolu] Problème Smarty/Back - debutems - 14/03/2017

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.


[Résolu] Problème Smarty/Back - debutems - 14/03/2017

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 !


[Résolu] Problème Smarty/Back - airelibre - 14/03/2017

Super, ravi de t'avoir aidé Wink Bonne continuation !