Jump to content

Un hook dans product_list


ChrOnOs

Recommended Posts

Bonjour à tous,

Je suis entrain d'intégrer une solution prestashop pour un site de vente de matériel audio et de vinyles. En, ce qui concerne les vinyles, le commerçant à besoin d'extrait sonore pour ses articles. J'ai donc fais l'achat du module MP3 Player de Joel GAUJARD qui fonctionne très bien mais ne permet d'être "hooker" uniquement sur la page du produit (hookProductFooter, hookExtraLeft, hookExtraRight).

Mon problème est que le commerçant aimerai que le player soit aussi présent dans la liste des produits des catégories et dans les résultat d'une recherche.

Après avoir jeté quelques coup d'oeil aux fichiers PHP, je me suis rendu compte que ce sont les templates category.tpl et search.tpl qui include product_list.tpl. Cela rend donc impossible le rajout d'un hook dans product_list qui serai propre à chaque produit.

J'ai donc pensé include dans ces deux fichiers un product_list.php qui s'occuperai du hook et afficherai le template product_list.tpl. Ma question serai alors de savoir comment éviter l'écrasement de mes fichiers category.tpl et search.tpl lors d'un mise à jours.

Plus généralement, j'aimerai que l'on m'éclaire sur comment se déroule la contribution à un projet open source. Idéalement, j'aimerai pouvoir vous commit ma modification mais j'imagine qu'il y a de grandes chance pour que cela vienne à l'encontre de vos modifications.

En espérant avoir été suffisamment clair...
Bonne année à tous :-)

++

Link to comment
Share on other sites

Bon j'ai trouver une solution à mon problème.

J'ai créer un plugin pour smarty /tools/smarty/plugins/function.hook.php :

<?php
/**
* Prestashop Hook plugin
* @package Prestashop
* @subpackage plugins
*/


/**
* Prestashop {hook} function plugin
*
* Type:     function

* Name:     hook

* Purpose:  Generate hook

* @author ChrOnOs
* @param array
* @param Smarty
*/
function smarty_function_hook($params, &$smarty)
{

   if (!isset($params['name'])) {
       $smarty->trigger_error("hook: missing 'name' parameter");
       return;
   }

   if($params['name'] == '') {
       return;
   }

   $args = array();
   foreach ($params as $pKey=>$pValue){
       if ($pKey != 'name'){
           $args[$pKey] = $pValue;
       }
   }

      return Module::hookExec($params['name'], $args);
}

/* vim: set expandtab: */

?>



Ce plugin permet de placer un hook ou l'on veux en mettant simplement dans le template :

{hook name='leNomDuHook'}



ou encore

{hook name='leNomDuHook' var1='value1'}
{hook name='leNomDuHook' var1='value1' var2='value2'}
{hook name='leNomDuHook' var1='value1' var2='value2' var3='value3'}



'leNomDuHook' correspond au hook.name de la base de données.

Avec cette méthode, il est donc possible de placer des hook sans se soucier du $smarty->assign.

Attention cependant, smarty ne fonctionne pas avec des objets mais des tableaux... Dans mon exemple, le fichier product_list.tpl contient :

>
{if isset($products)}
   <!-- Products list -->
</pre>
<ul>
   {foreach from=$products item=product name=products}
       ...
       {hook name='productListExtraRight' product=$product}
       ...
   {/foreach}
</ul>
<br>   <!-- /Products list --><br>{/if



Dans mon module, j'avais :

public function hookProductListExtraRight($params)
   {
       global $smarty, $cookie;

       if (isset($params['product'])){
           $product = $params['product'];            
       else if ($id_product = Tools::getValue('id_product'))
           $product = new Product(intval($id_product));
       if (!Validate::isLoadedObject($product))
           Tools::displayError('Object product not loaded.');
               ...
       return $this->display(__FILE__, 'mp3player.tpl');
   }



que j'ai du remplacer par :

public function hookProductListExtraRight($params)
   {
       global $smarty, $cookie;

       if (isset($params['product'])){
           if (is_array($params['product'])) $product = new Product(intval($params['product']['id_product']));
           else $product = $params['product'];                
       else if ($id_product = Tools::getValue('id_product'))
           $product = new Product(intval($id_product));
       if (!Validate::isLoadedObject($product))
           Tools::displayError('Object product not loaded.');
               ...
       return $this->display(__FILE__, 'mp3player.tpl');
   }



N'hésitez pas pour toutes remarques ou suggestions.

++

Link to comment
Share on other sites

  • 4 weeks later...

Et bien tu as bien de la chance de maîtriser cette langue extra-terrestre!

J'ai acheté le plugin aussi, mais moi je suis musicien et pas informaticien. Donc même les explications données par Joël, je pige rien et le lecteur ne s'affiche pas :S

Je suis son explication en prenant l'exemple qu'il donne pour le template "product-list.tpl ", à savoir:

01. {if isset($products)}
02. {php}Module::hookExec('productlist', array('products' => $this->_tpl_vars['products'])){/php}
...
11. {$mp3player[$product.id_product]}

Ou dois-je mettre ces lignes, aux lignes 01,02 et 11?
Dois-je changer quelque chose?

J'ai besoin d'aide, pour moi c'est du martien. Merci!!!!

Link to comment
Share on other sites

  • 1 year later...
  • 4 weeks later...

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