Jump to content

[Résolu] Probleme langue template smarty AJAX !


Recommended Posts

Bonjour,

Voilà j'ai un souci avec un template smarty que je fais afficher en Ajax.

Je m'explique j'ai sur une page un lien qui au clic lance en ajax un template smarty, mais j'ai beau être en FR ou EN ou ES il m'affiche toujours ce template en EN (alors que quand j'affiche le {$lang_iso} dans le template, il m'affiche bien la bonne langue en cours).

Voilà le code JS :

$(".link_add_collection").click(function() {
       $("body").append("");
       var htmlBefore = "";
       var htmlAfter = "";
       var o = $(this);
       var lan = o.attr("rel");
       var language = (lan==undefined || lan=='' || languageCollection[lan]==undefined) ? 1 : lan;
       $.ajax({
          type: "GET",
          url: o.attr("href")+"&ajax_mode=true",
          success: function(data){

                  htmlBefore += '';
                  htmlBefore += '';
               htmlBefore += '';
               htmlBefore += '';
               htmlBefore += '';
               htmlBefore += '';
               htmlBefore += '';
               htmlBefore += '';
               htmlBefore += ''+languageCollection[language].title+'X';
               htmlBefore += '';
               htmlBefore += '';
               htmlAfter += '';

               $("#popup_collection").append(htmlBefore+data+htmlAfter);

          }
        });
       return false;
   });



Et le code coté serveur :

require_once(dirname(__FILE__).'/config/config.inc.php');
require_once(dirname(__FILE__).'/init.php');
$output = "";

       global $smarty;

       $product = new Product($idProduct, true, intval($cookie->id_lang));
       $rewrited_url = $link->getProductLink($product->id, $product->link_rewrite);

       $images = $product->getImages(intval($cookie->id_lang));
       $productImages = array();
       foreach ($images AS $k => $image)
       {
           if ($image['cover'])
           {
               $cover = $image;
               $cover['id_image'] = intval($product->id).'-'.$cover['id_image'];
               $cover['id_image_only'] = intval($image['id_image']);
           }
           $productImages[intval($image['id_image'])] = $image;
       }
       $src_img = $link->getImageLink($product->link_rewrite, $cover['id_image'], 'slider_thumb_pdt');

       $smarty->assign(array(
          'rewrited_url' => $rewrited_url,
       'src_img' => $src_img,
       'product' => $product,
       'base_uri' => __PS_BASE_URI__));

       $output = $smarty->fetch(_PS_THEME_DIR_.'collection_popup.tpl');

       if ($samepdtadd)
           $output = $smarty->fetch(_PS_THEME_DIR_.'collection_popup_existant.tpl');

       echo $output;




J'ai aussi bien traduit la page dans l'administration !


Voilà j'espère que c'était compréhensible :-)

Merci de m'éclairer !

Bye Bye

Link to comment
Share on other sites

Salut , la réponse est juste ici :

$product = new Product($idProduct, true, intval($cookie->id_lang));



$cookie est null , car tu n'as pas placé un

global $cookie;

au début de ton script ...

en résumé : ta 5 eme ligne devrait être :

        global $smarty, $cookie;



et ça devrait rouler .... sauf erreur ou omission ...

Link to comment
Share on other sites

Merci pour la réponse :-)

Mais en fait les variables globales de mon fichier sont au début du fichier

require_once(dirname(__FILE__).'/config/config.inc.php');
require_once(dirname(__FILE__).'/init.php');

global $smarty, $cookie;



Je n'avais montré qu'une partie du code :P

mais j'ai l'impression qu'il récupère bien la langue dans le template car si j'affiche {lang_iso} il me sort le bon code correspond, c'est quand même bizarre ! Je sais pas trop j'avoue ...

Link to comment
Share on other sites

Merci pour la réponse :-)

Mais en fait les variables globales de mon fichier sont au début du fichier

require_once(dirname(__FILE__).'/config/config.inc.php');
require_once(dirname(__FILE__).'/init.php');

global $smarty, $cookie;



Je n'avais montré qu'une partie du code :P

mais j'ai l'impression qu'il récupère bien la langue dans le template car si j'affiche {lang_iso} il me sort le bon code correspond, c'est quand même bizarre ! Je sais pas trop j'avoue ...



ben je veux bien te croire , mais tu as bien montré ça :

       global $smarty;



et je n'y trouve pas du tout la globale cookie...

Donc tu as peut être montré une mauvaise version du code mais pas juste une partie , hein ;) ?

Alors bon du coup , je vois plus trop , mais juste une question : pourquoi $smarty->fetch() au lieu de $smarty->display() ??

Link to comment
Share on other sites

Adit : parce que je n'ai pas été très clair , mais $smarty->fetch() attend 3 paramètres en théorie , et ne sert pas à plus de choses que ça dans ton cas car :

$output = $smarty->display(...) ; 
echo $output; 



est ce que l'on utilise plus généralement , du coup sans tester ni avoir le temps de le faire , c'est ce qui me vient ...

Link to comment
Share on other sites

J'utilisais le fetch car sinon il m'affichait les deux templates dans la variable $output.

Par contre ce que je viens de me rendre compte et merci :P c'Est que en remplacant fetch par display il m'affiche la bonne langue mais il m'affiche les 2 templates à la suite :

$output = $smarty->display(_PS_THEME_DIR_.'collection_popup.tpl');

       if ($samepdtadd)
           $output = $smarty->display(_PS_THEME_DIR_.'collection_popup_existant.tpl');

       echo $output;



Alors que si $samepdtadd est true il devrait écraser $output par l'autre template ...

Mais cool merci je comprends pourquoi maintenant :-)

Link to comment
Share on other sites

bon finalement je l'ai écris comme ça

if ($samepdtadd)
           $output = $smarty->display(_PS_THEME_DIR_.'collection_popup_existant.tpl');
       else
           $output = $smarty->display(_PS_THEME_DIR_.'collection_popup.tpl');



Mais je voulais pas faire de else :P et j'aime bien comprendre pourquoi ca fonctionne pas comme c'était avant ... mais en tout cas merci du coup de main !

Link to comment
Share on other sites

hmm , là le truc c'est que je trouve aucune référence à $samepdtadd .... dans ton php , avant son affichage ...
Elle devrait donc même être toute le temps à false , encore que ...
Bon bref il te reste à corriger sa valeur , ici il est clair qu'elle est tout le temps à true ... et je te demande même pas à quoi elle te sert lol ;)

Link to comment
Share on other sites

la variable est affecté avant

if ($add and isset($idProduct))
{
   if ($tabCollection)
       $tabCollectionArray = object_to_array(json_decode($tabCollection));
   else
       $tabCollectionArray = array();

   $samepdtadd = false;

   foreach($tabCollectionArray as $key=>$val)  {
       if($key == intval($idProduct))
           $samepdtadd = true;
   }

   if (!$samepdtadd) {
       $tabCollectionArray[intval($idProduct)] = date('Y-m-d H:i:s');
       //On met à jour la table ps_collection_product
       Db::getInstance()->AutoExecute(_DB_PREFIX_.'collection_product',
           array(    'id_guest' => intval($cookie->id_guest),
                   'id_product' => intval($idProduct),
                   'date_add' => pSql(date('Y-m-d H:i:s'))
           ), 'INSERT'
       );
   }

   $cookie->__set("collection", json_encode($tabCollectionArray));
   arsort($tabCollectionArray);
   $idsProduct = array();
   foreach($tabCollectionArray as $key=>$val)  {
       $idsProduct[] = $key;
   }
   $idsProducts = implode(",", $idsProduct);
   $cookie->__set("collectionIds", $idsProducts);

}



mais sans ça de toute façon même si la variable est à true ca devrait mettre que le output de collection_popup_existant.tpl et si false mettre que le output de collection_popup.tpl et pas les deux !

Link to comment
Share on other sites

Ah ben oui effectivement , l'un ou l'autre mais pas les deux en même temps ....
Vide donc ton cache juste pour voir : /tools/smarty/compile , /cache , / themes/nomdutheme/cache , juste par acquis de connscience mais bon ...
Là à cette heure je sais plus rien ;)

Link to comment
Share on other sites

Ah ben oui effectivement , l'un ou l'autre mais pas les deux en même temps ....
Vide donc ton cache juste pour voir : /tools/smarty/compile , /cache , / themes/nomdutheme/cache , juste par acquis de connscience mais bon ...
Là à cette heure je sais plus rien ;)



Ne cherche pas .. je m'édite c'est pas bon signe lol ...
L'appel à ->display suffit à déclancher la sortie .... ça explique que tu ais un affichage double .

L'usage de fetch était la bonne approche .

Sauf que , essaye plûtot comme ça :

$output=Module::display('/pathtomontpl/montheme.tpl') ; 



plutôt que d'appeler la fonction fetch directement ...

Link to comment
Share on other sites

Alors le problème avec ce code :

$output=Module::display('/pathtomontpl/montheme.tpl') ; 



C'est que ca met positionne directement le template dans le dossier des modules, mais finalement ca m'a aidé et j'ai trouvé comment faire alors voilà si ca peut en intéresser d'autres :


$output = display(_PS_THEME_DIR_.'collection_popup.tpl'); 

       if ($samepdtadd)
           $output = display(_PS_THEME_DIR_.'collection_popup_existant.tpl');        

       echo $output;



et j'ai crée la fonction display sur ma page :

function display($resource_name, $cache_id = null, $compile_id = null)
   {
       global $smarty;
       $smarty->currentTemplate = substr(basename($resource_name), 0, -4);
       return $smarty->fetch($resource_name, $cache_id, $compile_id, false);
   }



Car la fonction display de Smarty.class.php renvoi automatiquement l'affichage sans choisir de pouvoir stocker dans une variable ou pas.

Donc voilà problème résolu et de la bonne manière je pense :-)

merci broceliande :P

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...