Lou2862 Posted January 17, 2013 Share Posted January 17, 2013 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! Link to comment Share on other sites More sharing options...
franckm1000 Posted January 17, 2013 Share Posted January 17, 2013 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} Link to comment Share on other sites More sharing options...
Lou2862 Posted January 18, 2013 Author Share Posted January 18, 2013 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 Link to comment Share on other sites More sharing options...
franckm1000 Posted January 18, 2013 Share Posted January 18, 2013 (edited) 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 January 18, 2013 by franckm1000 (see edit history) 1 Link to comment Share on other sites More sharing options...
Lou2862 Posted January 18, 2013 Author Share Posted January 18, 2013 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. Link to comment Share on other sites More sharing options...
franckm1000 Posted January 19, 2013 Share Posted January 19, 2013 Alors c'est que tu assignes ta variable au mauvais endroit (mauvais fichier ou mauvais emplacement) Link to comment Share on other sites More sharing options...
Lou2862 Posted January 25, 2013 Author Share Posted January 25, 2013 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! Link to comment Share on other sites More sharing options...
franckm1000 Posted January 25, 2013 Share Posted January 25, 2013 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 ? Link to comment Share on other sites More sharing options...
Lou2862 Posted January 25, 2013 Author Share Posted January 25, 2013 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 Link to comment Share on other sites More sharing options...
franckm1000 Posted January 25, 2013 Share Posted January 25, 2013 (edited) 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 January 25, 2013 by franckm1000 (see edit history) Link to comment Share on other sites More sharing options...
Lou2862 Posted January 25, 2013 Author Share Posted January 25, 2013 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 Link to comment Share on other sites More sharing options...
franckm1000 Posted January 25, 2013 Share Posted January 25, 2013 (edited) 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 January 25, 2013 by franckm1000 (see edit history) Link to comment Share on other sites More sharing options...
sangria777 Posted October 3, 2013 Share Posted October 3, 2013 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 !! 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