Steeve.c Posted July 2, 2013 Share Posted July 2, 2013 Bonjour a tous, J'avais construit un systeme Quizz pour prestashop 1.4, mais je coince lors de son transfère vers 1.5. Voici en Bref comment j'ai procédé: A la racine du site j'ai créé un quiz.php contenant ces trois lignes require(dirname(__FILE__).'/config/config.inc.php'); Tools::displayFileAsDeprecated(); Tools::redirect('index.php?controller=quiz'.($_REQUEST ? '&'.http_build_query($_REQUEST, '', '&') : ''), __PS_BASE_URI__, null, 'HTTP/1.1 301 Moved Permanently'); Ensuite dans le dossier controllers / front j'ai cré un fichier QuizController.php contenant ce code class QuizControllerCore extends FrontController { public $php_self = 'quiz'; public function initContent() { parent::initContent(); $this->context->smarty->assign('content_only', 0); $this->setTemplate(_PS_THEME_DIR_.'quiz.tpl'); } public function setMedia() { parent::setMedia(); if ($this->assignCase == 1) $this->addJS(_THEME_JS_DIR_.'quiz.js'); $this->addCSS(_THEME_CSS_DIR_.'quiz.css'); } /** * Assign template vars related to page content * @see FrontController::initContent() */ } Et enfin dans mon template j'ai créer un fichier quiz.tpl qui lui même inclu un fichier php <script type="text/javascript"> <!-- var baseDir = '{$base_dir_ssl}'; --> </script> {include file="$tpl_dir./breadcrumb.tpl"} <A NAME='[1]'></A> <div id="editorial_block_center" class="editorial_block"> {php} $localisation_quiz = $base_dir."themes/sitecrea/quiz.php"; if (file_exists($localisation_quiz)) { include ($localisation_quiz) ; }{/php} </div> Jusqu'ici tout va bien, dans le site j'ai bien ma page qui s'ouvre avec le nom du site/quiz Par contre, dans mon fichier php j'ai besoin de récupérer l'id client, et la, impossible.... J'ai pas mal parcouru le forum, la méthode a changé depuis 1.4, j'ai croisé des choses comme $this->context->customer->id mais impossible de le caller ou il faut comme il faut. peut etre me faut il appeler la class avant . J'ai bien essayé dans mon Quizcontroller d'assigner une variable smarty dans ce genre ==> $this->context->customer->id->assign('id_client',$id_client); mais la page bug lorsque j'essais d'afficher id_client En bref, comment puis-je choper l'id du client qui visualise la page ? Merci beaucoup pour votre soutient Link to comment Share on other sites More sharing options...
J. Danse Posted July 2, 2013 Share Posted July 2, 2013 Je vais passer mon commentaire sur la structure du module qui est à revoir entièrement (p.ex: pas de fichiers à la racine, le contrôleur Front peut se trouver dans le dossier controllers du module en lui-même, retiré le PHP du template Smarty, ...). Concernant l'assignation, elle devrait se faire ainsi: $this->context->controller->smarty->assign('id_client', (int)$this->context->customer->id); Sinon, il faut commencer son fichier PHP par la ligne suivante: include_once(dirname(__FILE__).'/../../config/config.inc.php'); Et là, tu devrais avoir accès au contexte. Pour l'obtenir: $context = Context::getContext(); 1 Link to comment Share on other sites More sharing options...
blob Posted July 2, 2013 Share Posted July 2, 2013 (edited) Bonjour je commence tout juste Prestashop, et j'ai lu à droite à gauche que c'est également cette technique (celle de J. Danse) qu'il faut utiliser pour récuperer des cookies depuis une partie du site externe à Prestashop. Je me permets d'utiliser ce topic pour vous faire part de mon problème. J'utilise Spip (pas un choix personnel hein ) pour la partie "contenu" , et donc Prestashop pour la partie Catalogue. Je me suis débrouillée pour que l'utilisateur ne voit pas de différence entre les deux partie pour que la navigation soit fluide. J'essaye désormais de reprendre la partie "Bienvenue XXXX | Déconnexion" de Prestashop pour la mettre dans Spip. Et après pas mal de recherche je tombe souvent sur la solution citée au-dessus mais impossible, quelque chose bloque. Est-ce Spip ? Ou est-ce que j'ai oublié quelque chose ? <?php include_once('#URL_SITE_SPIP/catalogue/config/config.inc.php'); $context = Context::getContext(); $id_client = $this->context->controller->smarty->assign('id_client', (int)$this->context->customer->id); ?> Bienvenue <a class="login" href='#URL_SITE_SPIP/catalogue/index.php?controller=my-account'> <?php echo "$id_client"; if($id_client == "") { echo "Identifiez-vous"; } else{echo $nom_client;} ?> Pour le peu d'information que ça apporte, j'ai placé ce code dans le header de spip, et l'URL est bonne EDIT : J'ai oublié de préciser quelle erreur j'avais : J'ai une page blanche (enfin bleue, couleur du background...) et dans la console : "NetworkError: 500 Internal Server Error" Merci bien Edited July 2, 2013 by blob (see edit history) Link to comment Share on other sites More sharing options...
Steeve.c Posted July 2, 2013 Author Share Posted July 2, 2013 Merci J.Dance pour ta réponse, J'ai tenté vite fait d'appliqué ce que tu as indiqué, cependant, ca ne marche pas comme prévu. J'ai oublié de précisé, qu'il ne s'agit pas d'un module, juste de fichiers ajouté manuellement, je sais c'est pas très propre mais je dois faire vite et simple pour un usage quasi unique. J'ai quand même réussis a afficher l'id client dans le quiz.tpl du template, en y intégrant dans le QuizFrontcontroller.php un assignemement smarty quasi identique a celle que tu me proposait, soit: $this->context->smarty->assign('id_du_client', (int)$this->context->customer->id); Du coup dans le tpl lorsque j'ajoute ==> {$id_du_client}, il m'indique bien l'id du client Par contre, dans le php qui est inclu dans le tpl juste en dessous: {php} $localisation_quiz = $base_dir."themes/sitecrea/quiz.php"; if (file_exists($localisation_quiz)) { include ($localisation_quiz) ; }{/php} Impossible d'afficher depuis ce php la variable $id_du_client... j'ai essayer en vain de basculer la variable du tpl vers le php Concernant cette ligne que tu m'indique $context = Context::getContext(); j'ai pas bien saisie ou il me fallait l'intégrer. Pour résumer, voici ou j'en suis Dans le fichier quiz.php a la racine du site require(dirname(__FILE__).'/config/config.inc.php'); Tools::displayFileAsDeprecated(); Tools::redirect('index.php?controller=quiz'.($_REQUEST ? '&'.http_build_query($_REQUEST, '', '&') : ''), __PS_BASE_URI__, null, 'HTTP/1.1 301 Moved Permanently'); Dans le fichier QuizController.php class QuizControllerCore extends FrontController { public $php_self = 'quiz'; public function initContent() { parent::initContent(); $this->context->smarty->assign('content_only', 0); $this->setTemplate(_PS_THEME_DIR_.'quiz.tpl'); $this->context->smarty->assign('id_du_client', (int)$this->context->customer->id); } public function setMedia() { parent::setMedia(); if ($this->assignCase == 1) $this->addJS(_THEME_JS_DIR_.'quiz.js'); $this->addCSS(_THEME_CSS_DIR_.'quiz.css'); } /** * Assign template vars related to page content * @see FrontController::initContent() */ } Et enfin, dans le fichier quiz.tpl du template <script type="text/javascript"> <!-- var baseDir = '{$base_dir_ssl}'; --> </script> {include file="$tpl_dir./breadcrumb.tpl"} <A NAME='[1]'></A> <div id="editorial_block_center" class="editorial_block"> {$id_du_client} {php} $localisation_quiz = $base_dir."themes/sitecrea/quiz.php"; if (file_exists($localisation_quiz)) { include ($localisation_quiz) ; }{/php} </div> Et donc, dans le quiz.php juste a cote du quiz.tpl dans le template, rien de special pour l'instant puisqu'il me faut cette variable id client ==> echo $id_du_client; Encore merci pour ton aide Link to comment Share on other sites More sharing options...
coeos.pro Posted July 2, 2013 Share Posted July 2, 2013 il faut éviter les balises {php} en smarty, elles sont inutiles, il vaut mieux faire : {include file="./themes/sitecrea/quiz.php" id_customer=$id_du_client} du coup la valeur de la variable "id_du_client" est envoyé dans ton fichier quiz.php sous le nom id_customer 1 Link to comment Share on other sites More sharing options...
Steeve.c Posted July 5, 2013 Author Share Posted July 5, 2013 Merci Coeos.pro pour cette réponse, mais je me demande si ce n'est pas pour prestashop 1.4 plutôt, car sur le prestashop 1.5, dès que je tente d'include de cette façon, j'ai une erreur sur la page qui ne s'ouvre plus {include file="./themes/sitecrea/quiz.php" id_customer=$id_du_client} Ca me renvois Le site Web a rencontré une erreur lors de l'extraction de http://.../index.php?controller=quiz?010ab49071f316bad72083304aff7d1a=WRsbfLLManDfulUvu16rH277IO%2FoBnDimJKqAvtMpWLUjS2ktNkyQO5KwAS0rj%2Ffu3VBDfVPdcNvDcRB5fckAA%3D%3D000061&08763885b544b6331857d9b15485114e=NYCIMS3Jd%2F1rKtlpjYTRB9SSmdow0jw99Q6g6yAfGkDUjS2ktNkyQO5KwAS0rj%2Ff6OzTvcYO%2F3vYtid9SSwYtg%3D%3D000060&ffdbd13d96d903c026c4876e97eb63a4=WRsbfLLManDfulUvu16rH8Hm4%2FQzkSaANBhdne7JgXrOtDvlu7sx6f7voj5I59r110aHCacMCo44jhLTUJmPZ5T5YzIV24YsJrjVqPExuv2QlK7%2Fe%2FRgPIHUoAIFcI6LikBS9eRzJf4fBkELQheqpLyye6aQVezCrgp5kWHnGNRd5LsgdVVDKFpZYyjk%2FFqbikK5fiyoF1i4CH184%2FxN8nRR8Ti1r2f%2BkqMGRtsms7%2B.... Par contre, je peux includ des Tpl dans cette méthode et sans soucis, par exemple, j'ai juste au dessus {include file="$tpl_dir./breadcrumb.tpl"} Link to comment Share on other sites More sharing options...
Steeve.c Posted July 5, 2013 Author Share Posted July 5, 2013 Halala oui !!! si j'ai enfin récupéré l'id du client dans ta méthode coeos.pro ! avec {include file="$tpl_dir./quiz.php" id_customer=$id_client} Merci beaucoup !!! Merci aussi J.Dance pour l'autre moitié du parcours ! Link to comment Share on other sites More sharing options...
Steeve.c Posted July 5, 2013 Author Share Posted July 5, 2013 (edited) Mince, non ! J'ai parlé trop vite, en fait avec un includ dans cette méthode, il m'écris le code php comme du texte, snif, je me suis emmêlé les pinceaux avec un affichage id client dans la page précédente. Donc si j'include comme ça un php, au lieu de m'afficher l'id du client, il m'affiche echo $id_customer.... Après je me dis que lorsque j'ai modifier prestashop pour qu'il accepte les balise {php} {/php} j'ai modifier ca facon d'include Edited July 5, 2013 by Steeve.c (see edit history) Link to comment Share on other sites More sharing options...
Steeve.c Posted July 5, 2013 Author Share Posted July 5, 2013 Bon alors, je vous avoue que je perd patience avec la structure prestashop, qui parfois m'intrigue vraiment avec sa particularité dont je n'ai pas saisie l’intérêt. Pourquoi ne pas tout écrire en php simplement ? Bref, je vais donc tricher, et puis c'est tout. En bref, je récupère l'id client grace aux indication de J.Dance dans la page TPL, puis Paf, je balance en Ajax une fonction qui va charger le contenu de mon php dans la div en envoyer dans l'url en get l'id du client, et zou, le tour est joué. Donc pour ceux que ca interesse, voila ce que ca donne en résumé final Dans le fichier quiz.php a la racine du prestashop <?php require(dirname(__FILE__).'/config/config.inc.php'); Tools::displayFileAsDeprecated(); Tools::redirect('index.php?controller=quiz'.($_REQUEST ? '&'.http_build_query($_REQUEST, '', '&') : ''), __PS_BASE_URI__, null, 'HTTP/1.1 301 Moved Permanently'); ?> Dans le fichier Quizcontroller dans controllers/front/ <?php class QuizControllerCore extends FrontController { public $php_self = 'quiz'; public function initContent() { parent::initContent(); $this->context->smarty->assign('content_only', 0); $this->setTemplate(_PS_THEME_DIR_.'quiz.tpl'); $this->context->smarty->assign('id_du_client', (int)$this->context->customer->id); } public function setMedia() { parent::setMedia(); if ($this->assignCase == 1) $this->addJS(_THEME_JS_DIR_.'quiz.js'); $this->addCSS(_THEME_CSS_DIR_.'quiz.css'); } /** * Assign template vars related to page content * @see FrontController::initContent() */ } ?> dans le fichier quiz.tpl dans le dossier du thème avec la fonction ajax qui rempli la div interieur_quiz <script type="text/javascript"> <!-- var baseDir = '{$base_dir_ssl}'; --> </script> {capture name=path}Quiz{/capture} {include file="$tpl_dir./breadcrumb.tpl"} <A NAME='[1]'></A> <div id="editorial_block_center" class="editorial_block"> <input name="id_client" id="id_client" type="hidden" value="{$id_du_client}" /> <script type="text/javascript"> function declenche_quiz() { if (window.XMLHttpRequest) { xmlhttp_quiz=new XMLHttpRequest(); } else { xmlhttp_quiz=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp_quiz.onreadystatechange=function() { if (xmlhttp_quiz.readyState==4 && xmlhttp_quiz.status==200) { if(xmlhttp_quiz.responseText != "") { document.getElementById('interieur_quiz').innerHTML = xmlhttp_quiz.responseText; } } } xmlhttp_quiz.open("GET","/themes/sitecrea/quiz.php?id_client="+document.getElementById('id_client').value,true); xmlhttp_quiz.send(); } </script> <div id="interieur_quiz"> </div> </div> <script type="text/javascript"> <!-- declenche_quiz(); --> </script> Et enfin, dans le fichier quiz.php j'y récupère juste le $_GET['id_client'] puis je peux executer tout le code php que je veux, sans limite de prestashop Link to comment Share on other sites More sharing options...
coeos.pro Posted July 5, 2013 Share Posted July 5, 2013 "Pourquoi ne pas tout écrire en php simplement ?" le smarty peut se mettre en cache, ça augmente la rapidité d'affichage " il m'écris le code php comme du texte" oui j'avais pas fait attention, il faut inclure du tpl (smarty) ou de l'html et non du php, Dans ton quiz.tpl, pour l'ajax, je te conseil plutôt de mettre <script type="text/javascript"> function declenche_quiz() { $.ajax({ type: "POST", headers: { "cache-control": "no-cache" }, url: "../themes/sitecrea/quiz.php", async: true, cache: true, data: { "id_client":{$id_du_client} }, success: function(resultat) { ici tu mets ce qu'il faut quand ça marche }, error: function() { ici tu mets ce que tu veux quand ça marche pas } }); } </script> ... <script type="text/javascript"> <!-- declenche_quiz(); --> </script> ton fichier controller il est utilisé ailleurs ? sinon mets le code directement dans quiz.php Link to comment Share on other sites More sharing options...
Steeve.c Posted July 5, 2013 Author Share Posted July 5, 2013 Merci encore pour cette réponse et ton intérêt Coeos Concernant la fonction Ajax, en fait elle va chercher le contenu du quiz de l’extérieur, donc dans un fichier php qui traite plein d'info provenant de la bdd lié avec l'id client, que je chope que dans le tpl (d'ou mon problème) Dans la fonction que tu me propose tu indique success: function(resultat) { ici tu mets ce qu'il faut quand ça marche }, mais en fait l'ajax ne regarde pas si ca marche ou pas, mais renvois carement tout le contenu Sinon pour le second conseil, en effet mon controller ne sert que pour le quiz, mais le contenu du quiz varie biensur selon la question ou en est l'utilisateur, de plus il y a un chrono javascript, et autre chose javascript dedans, des images, etc.. Du coup, j'ai tester de faire un echo depuis le quiz.php a la racine du site, mais rien ne s'affiche dans la page quiz. J'ai tester un echo dans le controller, et la page, ne charge plus, elle rencontre une erreure. cela dit, ma méthode actuel fonctionne bien Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now