Jump to content

Le module blocklayered supprime les variables créées dans le contrôleur


Recommended Posts

Nous utilisons une version 1.6 de Prestashop et nous avons mis en place des pictogrammes de garantie (garantie 1an, 2ans, etc..) personnalisés pour nos produits électronique.

Ces pictogrammes sont affichés dans le template product-list.tpl.

 

Chaque produit électronique a une caractéristique "Garantie" et une valeur "1an", "2ans", etc..

Grâce à cette information récupérée dans la classe Product.php (override), nous pouvons définir l'url menant au bon pictogramme. Voici un extrait du code pour récupérer cette url :

 



class CategoryController extends CategoryControllerCore
{
public function initContent()
{
parent::initContent();

...

foreach ($products as &$product)
{
$product['warranty'] = Product::getProductWarrantyUrl((int)$product['id_product']);
}

...

$this->context->smarty->assign('products', $products);
}
}


 

Product::getProductWarrantyUrl() permet de récupérer l'url du pictogramme et se trouve dans Product.php (override)

 

Et voici le code placé dans product-list.tpl : 



{if isset($product.warranty)}
<div class="df-warranty" style="background-image:url({$base_dir}themes/wt_furniture/img/icon/warranty_{$product.warranty}.png);"></div>
{/if}


 

Ce code fonctionne très bien et les pictogrammes s'affichent correctement dans la vue.

Cependant, lorsqu'on clique sur les checkboxes du module blocklayered, et après un chargement AJAX, les pictogrammes disparraissent, il semblerait que la variable {$product.warranty} ne soit plus renseignée.

Se pourrait-il que ce module utilise son propre controleur ou utilise un autre moyen pour générer de nouvelles variables Smarty ? Avez-vous une idée ?

 

Merci pour votre aide.

 

Link to comment
Share on other sites

Bonjour,

 

Oui je confirme, ce module est une plaie dès lors que l'on veut ajouter des variables personnalisées à la liste de produits et ce quelle que soit la version de Prestashop. Le module recharge la liste de produits en fonction des critères sélectionnés mais il ne prend en compte que les variables par défaut de Prestashop.

Link to comment
Share on other sites

J'ai trouvé la solution en analysant le code du module blocklayered.

Pour ce à qui ça pourrait intéresser, voici la procédure : 

 

1/ Faire une surcharge (override) du module blocklayered (override/modules/blocklayered/blocklayered.php)

2/ Créer une nouvelle méthode afin d'y ajouter sa variable personnalisée : 

	public function setCustomVar(&$products){
		foreach ($products as &$product)
		{
		        $product['warranty'] = Product::getWarranty((int)$product['id_product']); // Variable personnalisée
		}
	}	

3/ Faire un appel à cette nouvelle méthode dans la méthode ajaxCall : 

	public function ajaxCall()
	{
		global $smarty, $cookie;

		$selected_filters = $this->getSelectedFilters();
		$filter_block = $this->getFilterBlock($selected_filters);
		$this->getProducts($selected_filters, $products, $nb_products, $p, $n, $pages_nb, $start, $stop, $range);
		
                $this->setCustomVar($products); // Appel de la nouvelle méthode ligne 3091

                ...

         }

 Pour résumer, on intercepte le tableau contenant les produits avant son affectation à Smarty puis on y injecte un nouvel index (warranty) contenant la variable personnalisée.

  • Like 1
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...