Jump to content

product.valeur ou bien product->valeur , c'est quoi la difference


Recommended Posts

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

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

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

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

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

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

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

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 by SylRob (see edit history)
  • Like 1
Link to comment
Share on other sites

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

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