ultraxa Posted November 28, 2012 Share Posted November 28, 2012 (edited) bonjour j'ai ajouté dans ma base de données , un nouveau champs boolean j'ai modifié comme expliqué dans le tuto, les fichier adminproduct.php et product.php pour afficher ce champs lorsque je suis dans ma page produit (product.tpl) : je fait comme ceci: {if $product->monchamps} bla bala ... {/if} et cela fonctionne tres bien cependant , je souhaiterais afficher mon champs dans les categories de produits et la ça ne marche pas j'ai essayé comme ceci également ca ne marche pas {if $product.monchamps} bla bala ... {/if} c'est bizarre car dans product_list.pl pour afficher la description par exemple , on fait bien $product.description_name pourquoi ça ne marcherai pas avec mon champs donc si vous avez une idée.... ps : pourquoi on met desfois -> et parfois le point ? Edited November 28, 2012 by ultraxa (see edit history) Link to comment Share on other sites More sharing options...
franckm1000 Posted November 29, 2012 Share Posted November 29, 2012 (edited) Certainement parce que le méthode utilisée côté PHP pour générer la variable $products (remarque bien le S à la fin) et qui avec un foreach (dans product-list.tpl) permet de LISTER les lignes du tableau et d'obtenir $product (sans S), cette méthode ne va peut être pas chercher ton champs (je pense que la méthode est getProducts() de la classe Category). Voilà la requête dans cette méthode: $sql = ' SELECT p.*, pa.`id_product_attribute`, pl.`description`, pl.`description_short`, pl.`available_now`, pl.`available_later`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, i.`id_image`, il.`legend`, m.`name` AS manufacturer_name, tl.`name` AS tax_name, t.`rate`, cl.`name` AS category_default, DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 AS new, (p.`price` * IF(t.`rate`,((100 + (t.`rate`))/100),1)) AS orderprice FROM `'._DB_PREFIX_.'category_product` cp LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = cp.`id_product` LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (p.`id_product` = pa.`id_product` AND default_on = 1) LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (p.`id_category_default` = cl.`id_category` AND cl.`id_lang` = '.(int)($id_lang).') LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)($id_lang).') LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)($id_lang).') LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group` AND tr.`id_country` = '.(int)Country::getDefaultCountryId().' AND tr.`id_state` = 0) LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`) LEFT JOIN `'._DB_PREFIX_.'tax_lang` tl ON (t.`id_tax` = tl.`id_tax` AND tl.`id_lang` = '.(int)($id_lang).') LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON m.`id_manufacturer` = p.`id_manufacturer` WHERE cp.`id_category` = '.(int)($this->id).($active ? ' AND p.`active` = 1' : '').' '.($id_supplier ? 'AND p.id_supplier = '.(int)$id_supplier : ''); Tout dépend après dans quelle table tu as mit ton champs. Si tu l'as mis dans la table product normalement il doit être récupéré (du fait de SELECT p.*) si tu l'as mis dans une autre table product comme product_lang par exemple alors il faut overrider la méthode pour récupérer ton champs. Le -> sert quand on appelle directement un objet. Le . sert principalement quand on fait des boucles pour appeler les éléments "intérieurs" du tableau de la variable. Edited November 29, 2012 by franckm1000 (see edit history) Link to comment Share on other sites More sharing options...
ultraxa Posted November 29, 2012 Author Share Posted November 29, 2012 dans product.tpl , ça fonctionne mais pas sur product_list.tpl Link to comment Share on other sites More sharing options...
franckm1000 Posted November 29, 2012 Share Posted November 29, 2012 Nan mais t'as lu au moins ce que je t'ai marqué ????????????????????????? Link to comment Share on other sites More sharing options...
ultraxa Posted November 29, 2012 Author Share Posted November 29, 2012 oui j'ai bien lu mais j'ai pas bien saisi .......... mon champs est dans la table product ce que j'en conclue c'est que "dans product.tpl , ça fonctionne mais pas sur product_list.tpl" dans quel fchier on dit que ca marche dans product.tpl ? Link to comment Share on other sites More sharing options...
franckm1000 Posted November 29, 2012 Share Posted November 29, 2012 (edited) Bon je vais essayer de t'expliquer: Ton fichier category.tpl est celui qui affiche tes listes de produits. Dans ce fichier, tu as la ligne suivante: {include file="./product-list.tpl" products=$products} Cette ligne appelle le fichier produc-list.tpl ok ? Tu vois dans ce bout de code le products=$products. Cela veut dire que la variable $products de product-list.tpl utilisera la variable $products issue de category.tpl. Tu suis toujours ? La question est comment est générée cette variable smarty ? Car c'est elle dans product-list.tpl qui affiche les variables comme tu dis $product.description... Là on va voir dans le controller associé à category.tpl à savoir controllers/CategoryController.php Dans ce fichier tu vois notamment la ligne suivante: self::$smarty->assign(array( 'products' => (isset($this->cat_products) AND $this->cat_products) ? $this->cat_products : NULL, Qui montre que la variable smarty $products est assignée grâce à $this->cat_products. Et à un autre endroit dans le fichier tu vois que: $this->cat_products = $this->category->getProducts((int)(self::$cookie->id_lang), (int)($this->p), (int)($this->n), $this->orderBy, $this->orderWay); C'est à dire que $this->cat_products et par déduction $products est générée par la méthode getProducts() de la classe Category. C'est donc dans cette méthode qu'est générée ta variable et c'est pourquoi c'est dans celle-ci qu'il faut regarder. Maintenant, si tout ce que je dis est du charabia tu ne devrais pas te lancer dans des choses qui sont compliquées et nécessitent des connaissances avancées en PHP. EDIT: un piste, essaies de mettre ton champs non pas dans la table product mais dans la table product_lang. Ensuite, dans le fichier classes/Category.php vers la ligne 543 (version 1.4.8.2 de prestashop), remplaces: $sql = ' SELECT p.*, pa.`id_product_attribute`, pl.`description`, pl.`description_short`, pl.`available_now`, pl.`available_later`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, i.`id_image`, il.`legend`, m.`name` manufacturer_name, tl.`name` tax_name, t.`rate`, cl.`name` category_default, DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 new FROM `'._DB_PREFIX_.'category_product` cp LEFT JOIN `'._DB_PREFIX_.'product` p ON (p.`id_product` = cp.`id_product`) LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (p.`id_product` = pa.`id_product` AND default_on = 1) LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (p.`id_category_default` = cl.`id_category` AND cl.`id_lang` = '.(int)$id_lang.') LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)$id_lang.') LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.') LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group` AND tr.`id_country` = '.(int)Country::getDefaultCountryId().' AND tr.`id_state` = 0) LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`) LEFT JOIN `'._DB_PREFIX_.'tax_lang` tl ON (t.`id_tax` = tl.`id_tax` AND tl.`id_lang` = '.(int)$id_lang.') LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON m.`id_manufacturer` = p.`id_manufacturer` WHERE cp.`id_category` = '.(int)$this->id.($active ? ' AND p.`active` = 1' : '').' '.($id_supplier ? 'AND p.id_supplier = '.(int)$id_supplier : ''); Par: $sql = ' SELECT p.*, pa.`id_product_attribute`,pl.`mon_champs`, pl.`description`, pl.`description_short`, pl.`available_now`, pl.`available_later`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, i.`id_image`, il.`legend`, m.`name` manufacturer_name, tl.`name` tax_name, t.`rate`, cl.`name` category_default, DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 new FROM `'._DB_PREFIX_.'category_product` cp LEFT JOIN `'._DB_PREFIX_.'product` p ON (p.`id_product` = cp.`id_product`) LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (p.`id_product` = pa.`id_product` AND default_on = 1) LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (p.`id_category_default` = cl.`id_category` AND cl.`id_lang` = '.(int)$id_lang.') LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)$id_lang.') LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.') LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group` AND tr.`id_country` = '.(int)Country::getDefaultCountryId().' AND tr.`id_state` = 0) LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`) LEFT JOIN `'._DB_PREFIX_.'tax_lang` tl ON (t.`id_tax` = tl.`id_tax` AND tl.`id_lang` = '.(int)$id_lang.') LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON m.`id_manufacturer` = p.`id_manufacturer` WHERE cp.`id_category` = '.(int)$this->id.($active ? ' AND p.`active` = 1' : '').' '.($id_supplier ? 'AND p.id_supplier = '.(int)$id_supplier : ''); Où pl.`mon_champs` doit être remplacé par le nom de ton champs. Ca marche ? Edited November 29, 2012 by franckm1000 (see edit history) Link to comment Share on other sites More sharing options...
ultraxa Posted November 30, 2012 Author Share Posted November 30, 2012 (edited) ok , j'ai mieux compris comme cela mais ce qui est bizarre , c'est que j'ai mis le champs dans la table product , pourquoi ? , parce c'est un champs similaire au champs "on sale" donc ca me parraissait logique de le mettre la ce qui veut dire qu'il devrait etre recuperé par le p.* ? pourquoi le fait de le mettre dans product_lang , ca marcherais plus ? lorsque l'on regarde le champs "on_sale" dans aucune requête sql on ne parle de "on_sale" et a part le fichier product.php , on ne parle de on_sale mon champs est cree de la même manière que le champs "on_sale" dans le fichier product.php egalement au point de vue base de données et pourtant {if $product.on_sale} bla bla {/if} fonctionne dans product_list.tpl et {if $product->on_sale} bla bla {/if} fonctionne dans product.tpl ça veut bien dire que ça se joue ailleurs Edited November 30, 2012 by ultraxa (see edit history) Link to comment Share on other sites More sharing options...
franckm1000 Posted November 30, 2012 Share Posted November 30, 2012 Bah je sais pas mais essaies quand même Link to comment Share on other sites More sharing options...
ultraxa Posted November 30, 2012 Author Share Posted November 30, 2012 c'est quand même étonnant , ca doit être possible , seul un développeur chez prestashop peut me répondre Link to comment Share on other sites More sharing options...
franckm1000 Posted November 30, 2012 Share Posted November 30, 2012 (edited) Et bien tu vois non qu'il n'y avait que moi pour t'aider... A noter que je ne t'ai pas dit que ce n'était pas possible mais je t'ai quasiment mâché tout le travail (et ce que je t'ai répondu ça se fait pas en 2 minutes mais plutôt en 30 tu vois...) en te donnant exactement où étaient générées les variables, il reste à faire des essais, des test... ..... Ah oui et quand on va sur un forum pour demander de l'aide, même si on a pas répondu entièrement à ta question, depuis le début du topic, je cherche encore le premier merci... Allez Ciaooo, et débrouilles bien toi tout seul maintenant ! Edited November 30, 2012 by franckm1000 (see edit history) Link to comment Share on other sites More sharing options...
ultraxa Posted December 3, 2012 Author Share Posted December 3, 2012 bien au contraire , heureusement que tu m'a répondu !! pourquoi j'irai critiqué la seule personne qui m'a repondu ?!j'ai dis cela pour que 1 des développeur mettent le nez dedans , si tu regarde certain de mes dernier topic , j'ai deja evoqué ce probleme , je trouve dommage qu'il n'y pas de réponse technique rapide chez prestashop alors je dis bien "rapide", et non "pas de reponse " !!!, car faut bien pesé ses mots sur le forum et pour en revenir au sujet ,j'ai fait pas mal d'essai en parallele , je cherche toujours et je n'arrive pas a trouver Link to comment Share on other sites More sharing options...
ultraxa Posted December 5, 2012 Author Share Posted December 5, 2012 j'ai beau chercher dans tous les sens , je ne trouve pas Link to comment Share on other sites More sharing options...
SylRob Posted December 5, 2012 Share Posted December 5, 2012 (edited) Salut, je dois avoir la réponse à ta question : "$product.id" par exemple c'est la syntaxe de smarty pour parler d'un array en equivalent php ça serait $product['id'] et "$product->id" c'est un objet donc pour savoir si tu as à faire a un array ou un objet il te suffit soit de savoir comment ta variable est appelé soit de faire un var_dump dessus pour voir ce qu'elle contient Edited December 5, 2012 by SylRob (see edit history) 1 Link to comment Share on other sites More sharing options...
franckm1000 Posted December 6, 2012 Share Posted December 6, 2012 (edited) Non mais j'avais déjà répondu à cette question (qui n'était pas sa question principale) Le -> sert quand on appelle directement un objet. Le . sert principalement quand on fait des boucles pour appeler les éléments "intérieurs" du tableau de la variable. Edited December 6, 2012 by franckm1000 (see edit history) Link to comment Share on other sites More sharing options...
SylRob Posted December 6, 2012 Share Posted December 6, 2012 En effet. dsl j'ai été un peu vite et je n'avais pas tous lue. Link to comment Share on other sites More sharing options...
franckm1000 Posted December 6, 2012 Share Posted December 6, 2012 2 précautions valent mieux qu'une Link to comment Share on other sites More sharing options...
ultraxa Posted December 6, 2012 Author Share Posted December 6, 2012 merci , les infos sont toujours bonne à prendre mais c'est vrai que je n'ai toujours pas résolu mon problème. grosso modo , j'ai un champ identique à "on_sale" , je n'arrive pas lire la valeur du champs comme la valeur de "on_Sale" alors il se pourrait que ça soit a cause de smarty ...mais la je ne saisi pas tout il faut pourvoir lire ce champs avec smarty 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