vendredi 28 juin 2013

Prestashop 1.4.10 : conserver filtre manufacturer sur tout le site

Problème du jour :
- Site avec quelques fournisseurs et 5 catégories ---> conserver le filtre "fournisseur" quand on change de catégorie.
Donc, les catégories deviennent dynamiquement :
- catégorie1 fournisseur1

Le truc, donc, c'est de récupérer l'id_manufacturer et de la déployer dans les requêtes SQL et la génération des liens.

On commence par :
le listing produit.
classes/Category.php

Nous modifions public function getProducts
ligne 535
$id_supplier = (int)(Tools::getValue('id_supplier'));
en dessous :
$id_manufacturer = (int)(Tools::getValue('id_manufacturer'));

Pour le nombre d eproduits correspondant au filtre fournisseur :
Dans la requête if ($getTotal) (ligne 541)
WHERE cp.`id_category` = '.(int)($this->id).($active ? ' AND p.`active` = 1' : '').'
'.($id_supplier ? 'AND p.id_supplier = '.(int)($id_supplier) : ''));

on rajoute le test d'existence du manufacturer

WHERE cp.`id_category` = '.(int)($this->id).($active ? ' AND p.`active` = 1' : '').'
'.($id_manufacturer ? 'AND p.id_manufacturer = '.(int)$id_manufacturer : '').'
'.($id_supplier ? 'AND p.id_supplier = '.(int)($id_supplier) : ''));

idem dans la requete du dessous
A la ligne 567 :
WHERE cp.`id_category` = '.(int)($this->id).($active ? ' AND p.`active` = 1' : '').'
'.($id_manufacturer ? 'AND p.id_manufacturer = '.(int)$id_manufacturer : '').'
'.($id_supplier ? 'AND p.id_supplier = '.(int)$id_supplier : '');

On va désormais dans controllers/CategoryController.php
Et on va assigner au template smarty le nom du manufacturer (histoire de bien préciser, dans l'entete du listing produit, qu'on affiche les résultats correspondants à un fabriquant bien spécifique)

ligne 173, on rajoute :
$id_manufacturer = (int)(Tools::getValue('id_manufacturer'));
$name2 = Manufacturer::getNameById($id_manufacturer);
self::$smarty->assign('namemanu', $name2);
namemanu devient donc la variable smarty qui affichera le nom du fabriquant

Le tpl category-count.tpl
ligne 30, à la fin (après le {/if}, on rajoute : de la marque {$namemanu}
Ca donnera un truc du genre :
categorie1 il y a 16 produits de la marque xxxxx

Bon.
Désormais, il va falloir :
ajouter l'id_manufacturer aux liens produits (pour que le filtre soit conservé tout le temps)
ajouter le nom du fabriquant aux item de menu principal (histoire de bien expliquer qu'on est dans une boutique filtrée par fabriquant)

classes/Link.php
on modifie public function getProductLink
sous global $cookie;

on rajoute

$id_manufacturer = (int)(Tools::getValue('id_manufacturer'));


toutes les occurences

$link .= (_PS_BASE_URL_.__PS_BASE_URI__.'product.php?id_product='.(int)$id_product->id
deviennent :

$link .= (_PS_BASE_URL_.__PS_BASE_URI__.'product.php?id_product='.(int)$id_product->id.''.($id_manufacturer ? '&id_manufacturer='.(Tools::getValue('id_manufacturer')) : ''));


pour le menu :
Bon, là, ca dépend du mofule utilisé, mais généralement, on retrouve toujours une fonction getCategory
avec généralement le 
$name = $categorie->name;
En dessous, on rajoute :
  $id_manufacturer = (Tools::getValue('id_manufacturer'));
   $name2 = Manufacturer::getNameById($id_manufacturer);
    $this->_menu .= ''.$name.'
'.$name2.'
';

Voili voilou


jeudi 6 juin 2013

Virtuemart 2 - facebox is not defined

Comme le dit le sage : Virtuemart a l'art et la manière de rendre compliquées les aspects les plus simples du ecommerce.

Voyons cela avec la popup "ajouter au panier"

Si vous êtes sur cette page, c'est que ça plante, forcément.
Votre profiler de script vous indique "facebox is not defined" et ça énerve. ouais, je sais, ça m'a énervé aussi.

Tout ça à cause de jquery, comme d'hab.

Solution :
components/com_virtuemart/assets/js/facebox.js

Juste avant ligne 70
 (function($) {

On rajoute
jQuery(document).ready(function() {

Et tout à la fin, on rajoute :
});

Et hop ! il est enfin defined.