Jump to content

Accéder aux données produit depuis le hook ExtraRight


Recommended Posts

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

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

  • 1 month later...

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

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

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

  • 4 weeks later...

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

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