Jump to content

Choper l'id client dans prestashop 1.5


Recommended Posts

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

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();

  • Like 1
Link to comment
Share on other sites

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 :P) 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 by blob (see edit history)
Link to comment
Share on other sites

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

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

  • Like 1
Link to comment
Share on other sites

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

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

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 by Steeve.c (see edit history)
Link to comment
Share on other sites

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

"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

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

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