Jump to content
Lou2862

Lire tableau Php dans fichier TPL, Liste fabricants pour chaque catégorie!

Recommended Posts

Bonjour à tous!

 

Je débute en prestashop et pire en php, smarty, etc..

J'ai un site dans lequel j'ai énormément de fabricants, et j'aurai aimé afficher pour chaque catégorie les fabricants concernés. Comme il n'y pas directement de catégorie affectée à un fabricant, je souhaite afficher chaque fabricant dont au moins un produit est affecté à la catégorie en question.

J'espère être à peu près clair, mais je n'en suis pas certain.. bref, pour ceux qui ont compris, voilà mon problème:

 

J'ai crée une fonction php, (dans categoryController) avec en entrée l'ID de la catégorie, et qui me sort la liste de ID fabricants sous forme de tableau (array). J'aimerai pouvoir exploiter ce tableau dans Product-list.tpl, ou category.tpl, mais je n'y arrive pas. Il y a une incompatibilité.

Je ne peux pas dans smarty utiliser la syntaxe $montableau[1] .. puisque le dit tableau n'est pas défini dans smarty. J'arrive simplement à afficher les ID des fabricants avec:

 

 

foreach ($montableau as $value)

echo $value;

 

 

Voilà à peu près ou j'en suis. Je ne sais pas si c'est la bonne méthode pour y arriver. Si vous avez la moindre remarque je suis preneur!! Merci beaucoup!

Share this post


Link to post
Share on other sites

Il faut que tu assignes ton tableau via smarty depuis ton controller. Une fois le tableau construit dans categoryControlle tu utilises:

global $smarty;
$smarty->assign('montableau',$montableau);

 

Ensuite côté smarty il te reste à lister avec un foreach par exemple:

{foreach from=$montableau item=value}
{$value}
{/foreach}

Share this post


Link to post
Share on other sites

Merci beaucoup pour cette réponse,

 

J'ai essayé d'assigner mon tableau mais je n'arrive pas à l'afficher. Quand j'apelle {$montableau} dans mon tpl, ça m'affiche "Array" sur ma page, ça c'est rassurant, mais par contre je n'arrive pas à en extraire les valeurs par {$montableau} ou alors

 

{foreach from=$montableau item=value}

{$value}

{/foreach}

 

Mon code est le suivant en fait:

 

public function triermanu($a){

$db = mysql_connect('localhost', 'root', '');
mysql_select_db('coupon',$db);
$sql = 'SELECT id_category,id_product FROM ps_category_product';
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

$stockdonnees = array();
while($data = mysql_fetch_assoc($req))
   {
 if ($data['id_category'] == $a ) { 
 $stockdonnees[] = $data['id_product'];	 
 }
}
$sql2 = 'SELECT id_product,id_manufacturer FROM ps_product';
$req2 = mysql_query($sql2) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
$stockd2 = array();

while($data2 = mysql_fetch_assoc($req2))
 {  foreach ($stockdonnees as $value)
 if ($data2['id_product'] == $value) {   
 $stockd2[] = $data2['id_manufacturer'];	 
 }
   }
$hellot = array_unique($stockd2);
global $smarty;
$smarty->assign('montableau',$hellot);
}

 

Ce qui est incompréhensible c'est que si je défini un tableau quelconque à la fin du code (par ex:

$data = Array(100,200,300);

global $smarty;

$smarty->assign('montableau',$datat);

)

 

là ça fonctionne très bien... Et par ailleurs mon tableau $hellot j'arrive à l'afficher en faisant simplement un

foreach( $hellot as $value)

echo $value;

 

Donc, voilà.. est ce que le tableau $hellot a un format particulier qui fait que je ne peux pas l'afficher par smarty dans ma tpl?

C'est peu être tout bête mais je débute.. donc, merci à toutes les bonnes volontés!

Merci beaucoup Frankm1000

Share this post


Link to post
Share on other sites
Quand j'appelle {$montableau} dans mon tpl

 

Ca c'est normal si $montableau est un tableau il t'affiche array ! si tu veux voir ce qu'il y a dedans:

{$montableau|print_r}

 

Ce qui est incompréhensible c'est que si je défini un tableau quelconque à la fin du code (par ex:

$data = Array(100,200,300);

Normal c'est un tableau simple sans clés

Ce que tu n'arrives pas à afficher c'est:

array([0]=>100,[1]=>200,[2]=>300);

Type de tableau que tu génères avec tes whiles.

 

Par contre, si tu dois travailler sur prestashop, je te conseille plus que vivement d'utiliser les classes pour t'en sortir et notamment la classe Db pour faire des requêtes. Pour ta première requête fait simplement:

$stockdonnees=Db::getInstance()->ExecuteS('select * from '._DB_PREFIX_.'category_product where id_category='.$a);

DB_PREFIX étant le préfixe de la base (pas forcément ps_)

 

Là tu as directement ton premier tableau.

 

 

Fais déjà un {$mon_tableau|print_r} pour voir ce qu'il t'affiche (conseil: en PHP ou samrty ou ce que tu veux, quand tu as des difficultés à afficher le contenu d'un tableau utilises print_r pour te donner un visuel de celui-ci, ça t'aidera pas mal). Ensuite, je regardera ton code.

Edited by franckm1000 (see edit history)
  • Like 1

Share this post


Link to post
Share on other sites

Hello Frankm1000,

 

Quand je fais un {$mon_tableau|print_r} il m'affiche: Array()1

 

alors même que $hellot (ci-dessous) contient un liste de valeur, car je l'affiche avec un foreach $hellot as $value...:

global $smarty;

$smarty->assign('mon_tableau',$hellot);

 

Voilà, je ne sais pas si c'est bon signe..

Merci pour la classe DB, c'est super utile c'est clair, ça m'évitera de modifier plusieurs fichiers quand je le mettrai chez l'hébergeur.

Voilà, merci pour tes réponses.

Share this post


Link to post
Share on other sites

Hello! Cela faisait un moment que j'avais mis de côté ce petit problème technique, ayant trouvé un autre solution, moins élégante, bien que celle ci ne le soit pas beaucoup..

En fait, je pense que le problème, vous me dorez si j'ai tort, viens du fait que le controller est chargé lors de l'ouverture de la page, et que ma requête se fait logiquement après, (elle est commandée par le fichier TPL), ce qui fait que je fais une requète via le fichier TPL vers le controller (là ou j'ai ma fonction) qui est déjà chargé. Vous savez comment pallier à ce problème?

Merci franckm1000 pour tes réponses très efficaces et utiles!

Share this post


Link to post
Share on other sites

Tu ne fais aucune requête du TPL vers le controller.

 

Le seul fois où tu vas recharger un controller après un TPL est le cas où tu appuies sur un submit par exemple et que tu recharges la page en cours.

 

Dans ton cas, ce que j'ai dit doit marcher.

 

Ta fonction triermenu() tu la lances où dans le controller ?

Share this post


Link to post
Share on other sites

Je place ma fonction dans " class CategoryControllerCore extends FrontController {}", Je penser l'apeller depuis ma TPL? puisque le $a ( triermanu($a)) est en fait défini dans ma TPL (this->category). Je suis sur qu'il y a moyen de faire autrement, pour chopper la catégorie en cours d'execution.. Merci

Share this post


Link to post
Share on other sites

Non mais c'est là que tu bloques. Ta fonction tu comptes l'appeler comment dans le TPL ?

 

Ta fonction triermenu($a) tu dois la lancer depuis le controller.

 

Après :

public function process()
{

 

Tu ajoutes:

$this->triermenu($id_category);

 

Si $id_category ne fonctionne pas essaies $this->category->id

Edited by franckm1000 (see edit history)

Share this post


Link to post
Share on other sites

Pourquoi ne peut-on plus faire de boucle sur les fabricants, dans product-list.tpl dans PS 1.5.3.1?

par exemple:

 

Ah super, ça fonctionne.

Dsl, petit hick dans l'application, mais ça n'a directement rapport:

Je suis passé à la version 1.5.3.1. J'ai l'impression qu'on ne peut plus faire de boucles $manufacturer dans product-list.tpl et product.tpl :par ex:

{foreach from=$manufacturers item=manufacturer name=manufacturers}

{$manufacturer.name}

{/foreach}

Ce qui me permettait d'afficher la liste des fabricants par catégorie, et le fabricant sur chaque pages produit.. As tu une idée?

 

 

L'idée est de faire un liste des Fabricants par categorie

Share this post


Link to post
Share on other sites

Non mais tu peux faire des boucles en TPL tant que tu veux mais ta boucle ne sert qu'à afficher ton tableau envoyé via smarty. Or ta variable smarty que tu cherches à récupérer est dans ta fonction triermenu()

 

Mais ta FONCTION triermenu(), dans ton traitement PHP si tu ne l'exécutes pas quelque part elle ne sert à rien !

 

Une fonction, quand on l'écrit, si on ne l'exécute pas quelque part, elle ne fait rien. Par exemple, dans une classe, lorsque l'on créé une fonction (appelé aussi méthode) on l'appelle plus tard.

Par exemple la fonction getProducts() dans la classe Product.php on l'appelle ensuite de 2 façons différentes:

$produit=new Product($id_product);
$produit->getProducts();
ou encore
Product::getProducts();

 

C'est pareil dans ton controller. Ta fonction triermenu() doit être appelée quelque part. Le mieux étant la fonction process() qui est la fonction servant à l'affichage.

Or comme cette fonction est dans la même classe tu peux l'appeler via $this:

$this->triermenu();

Edited by franckm1000 (see edit history)

Share this post


Link to post
Share on other sites

Bonjour,

 

Je m'incruste dans le topic (je m’excuse Lou2862).

Mais je cherche moi-même à comprendre depuis bien longtemps les class, controller sans résultat !

 

Franckm1000, tu expliques les façon dont sont appellé getProducts(), mais je ne vois pas ou !

 

Je vois bien la fonction dans class>product

 

Et ensuite, ça s'affiche dans product.tpl

 

Il me manque l'étape du milieu, ça se passe dans controller ?

 

Je ne vois pas

$produit=new Product($id_product);
$produit->getProducts();
ou encore
Product::getProducts();

dans ProductController.php

 

La question est bête, mais je ne trouve pas la réponse !!

 

Share this post


Link to post
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...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More