Julien Chaumond Posted July 13, 2011 Share Posted July 13, 2011 Bonjour,je débute en développement de modules Prestashop mais suis développeur PHP expérimenté.Je souhaite réaliser un module se branchant sur le hook ExtraRight (qui est présent sur les pages produits).Comment puis-je récupérer l'objet $product courant depuis ce hook ?Je m'explique : j'arrive à accéder facilement à l'id du produit : $id_product = Tools::getValue('id_product'); J'arrive aussi à récupérer le nom du produit : global $smarty; $smarty->get_template_vars($name) (Je précise que je suis sous Prestashop 1.3.5.0 car c'est la version de mon client).Or, j'ai besoin également de l'URL d'une image du produit, et c'est là que ça se complique. En ce moment, je suis obligé de faire une requête base de données, assez complexe : $id_lang = (int)$params['cookie']->id_lang; $row = Db::getInstance()->getRow(' SELECT p.*, pl.`description`, pl.`description_short`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, p.`ean13`, i.`id_image`, il.`legend`, t.`rate` FROM `'._DB_PREFIX_.'product` p 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` AS t ON t.`id_tax` = p.`id_tax` WHERE p.id_product = '.(int)$id_product); $product = Product::getProductProperties($id_lang, $row); Puis de récupérer l'URL de l'image de la manière suivante: $link = new Link(); $data['product']['image'] = _PS_BASE_URL_.$link->getImageLink($product['link_rewrite'], $product['id_image'], 'large'); // In Prestashop 1.3.5, image URLs are relative, so we have to prepend _PS_BASE_URL_ Cela me semble bien compliqué. Je devrais pouvoir avoir accès à l'objet $product courant sans avoir à requêter la base de données, non ?De plus, en parcourant le code de quelques autres modules, j'ai l'impression que certains hooks produits (ProductFooter en particulier), ont, eux, accès, à l'objet produit.Est-ce correct ?Merci d'avance de l'aide que vous pourrez m'apporter.Julien Chaumond Link to comment Share on other sites More sharing options...
Julien Chaumond Posted July 20, 2011 Author Share Posted July 20, 2011 UP ! Bonjour,je débute en développement de modules Prestashop mais suis développeur PHP expérimenté.Je souhaite réaliser un module se branchant sur le hook ExtraRight (qui est présent sur les pages produits).Comment puis-je récupérer l'objet $product courant depuis ce hook ?Je m'explique : j'arrive à accéder facilement à l'id du produit :$id_product = Tools::getValue('id_product'); J'arrive aussi à récupérer le nom du produit : global $smarty; $smarty->get_template_vars($name) (Je précise que je suis sous Prestashop 1.3.5.0 car c'est la version de mon client).Or, j'ai besoin également de l'URL d'une image du produit, et c'est là que ça se complique. En ce moment, je suis obligé de faire une requête base de données, assez complexe : $id_lang = (int)$params['cookie']->id_lang; $row = Db::getInstance()->getRow(' SELECT p.*, pl.`description`, pl.`description_short`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, p.`ean13`, i.`id_image`, il.`legend`, t.`rate` FROM `'._DB_PREFIX_.'product` p 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` AS t ON t.`id_tax` = p.`id_tax` WHERE p.id_product = '.(int)$id_product); $product = Product::getProductProperties($id_lang, $row); Puis de récupérer l'URL de l'image de la manière suivante: $link = new Link(); $data['product']['image'] = _PS_BASE_URL_.$link->getImageLink($product['link_rewrite'], $product['id_image'], 'large'); // In Prestashop 1.3.5, image URLs are relative, so we have to prepend _PS_BASE_URL_ Cela me semble bien compliqué. Je devrais pouvoir avoir accès à l'objet $product courant sans avoir à requêter la base de données, non ?De plus, en parcourant le code de quelques autres modules, j'ai l'impression que certains hooks produits (ProductFooter en particulier), ont, eux, accès, à l'objet produit.Est-ce correct ?Merci d'avance de l'aide que vous pourrez m'apporter.Julien Chaumond Link to comment Share on other sites More sharing options...
Optim'Informatique Posted July 20, 2011 Share Posted July 20, 2011 $product = new Product($id_product);le __construct fait un appel à la base de données aussi, mais bon ça simplifie le code 1 Link to comment Share on other sites More sharing options...
Julien Chaumond Posted September 8, 2011 Author Share Posted September 8, 2011 Correct, merci. Ca semble quand même étrange et contre-intuitif que l'objet produit ne soit pas passé dans les hooks de type Produit, et donc d'être obligé de faire une requête supplémentaire à la base de données... Quelle est la procédure si l'on souhaite faire une suggestion de contribution au code de Prestashop ? Julien Link to comment Share on other sites More sharing options...
Julien Chaumond Posted September 8, 2011 Author Share Posted September 8, 2011 Pour référence future, voilà ce que je suis obligé de faire ensuite pour récupérer l'image principale du produit : // Now we need the product image, which is more difficult to get. $id_lang = (int)$params['cookie']->id_lang; $product = new Product($id_product, false, $id_lang); // This snippet is from ProductController.php : // (We have to do this because hooks are executed BEFORE image loading, which seems stupid.) $images = $product->getImages($id_lang); foreach ($images AS $image) { if ($image['cover']) { $cover = $image; $cover['id_image'] = (Configuration::get('PS_LEGACY_IMAGES') ? ($product->id.'-'.$image['id_image']) : $image['id_image']); $cover['id_image_only'] = (int)($image['id_image']); } } $link = new Link(); $data['product']['image'] = $link->getImageLink($product->link_rewrite, $cover['id_image'], 'large'); // In Prestashop 1.3.5 (for instance), image URLs are relative, so we have to prepend _PS_BASE_URL_ if (stripos($data['product']['image'], 'http') != 0) { $data['product']['image'] = _PS_BASE_URL_.$data['product']['image']; } Link to comment Share on other sites More sharing options...
Pierre-Yves Posted September 9, 2011 Share Posted September 9, 2011 Je pense que tu te compliques la tache. $product = new ProductCore($id_product, false, (int)$params['cookie']->id_lang); $image_link = $link->getImageLink($product->link_rewrite, $product->getCoverWs(), 'large'); Comme tu le vois, en fait il y a une fonction qui te donne directement l'id de l'image de cover d'un produit. Maintenant attention, cela peut générer une erreur dans le cas où le produit n'a pas d'images . Link to comment Share on other sites More sharing options...
Julien Chaumond Posted September 9, 2011 Author Share Posted September 9, 2011 @Pierre-Yves : Effectivement, merci ! Bon, ça fait encore un appel à la base de données, mais j'imagine qu'il y en a un dans $product->getImages() aussi... C'est vraiment dommage que les hooks produits ne soient pas exécutés APRES la détermination des images dans ProductController.php Link to comment Share on other sites More sharing options...
Julien Chaumond Posted October 5, 2011 Author Share Posted October 5, 2011 Pour info : Product::getCoverWs() est assez récent (versions 1.4 seulement), mais l'implémentation de Product::getCover() est bien plus ancienne, il est donc préférable d'utiliser cette dernière dans les modules si l'on veut optimiser la compatibilité avec les différentes versions de Prestashop : $cover = $product->getCover($id_product); $cover = $cover['id_image']; 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