Jump to content
marty69

[MODULE] Blockcategories modifié pour n'afficher que la catégorie mère de la catégorie active

Recommended Posts

Bonjour,

 

Humble contribution...

Je commence à avoir de nombreuses catégories, du coup pour plus de lisibilité j'utilise un menu horizontal avec les liens vers les catégories principales. J'ai modifié le module blockcategories pour n'afficher en colonne de gauche que le bloc correspondant à cette catégorie principale.

 

exemple :

 

concrètement j'utilise le menu top de Julien Breux + bloc category de presta en colonne de gauche.

 

J'ai pour l'instant 2 grosses catégories principales (filles de la catégorie principale "accueil")

 

CAT A

----SS-CAT A1

----SS-CAT A2

 

CAT B

----SS-CAT B1

----SS-CAT B2

 

Si par exemple on est dans SS-CAT A1 ou sur un produit de cette catégorie je n' affiche que la branche

 

CAT A

----SS-CAT A1

----SS-CAT A2

 

ci joint le module blockcategories modifié

 

PS : je suis en version 1.3.7 et n'ai testé que sur cette version, mais il est fort probable que cela fonction sur d'autres versions.

 

Mise à jour 11/01/2012 :

- correction du lien sur la catégorie principale

- le module ne s'affiche plus quand on est ni dans une catégorie ni dans une fiche produit

 

Mise à jour 10/01/2012 :

- correction de pb de navigation quand un produit appartient à plusieurs catégories

- correction de pb aléatoires d'affichage quand on est sur un produit

- le module s'affiche maintenant en fonction du résultat de recherche d'un produit

 

(Merci à daYmo)

blockcategories.zip

Edited by marty69 (see edit history)
  • Like 1

Share this post


Link to post
Share on other sites

oui j'avais fait cela moi aussi depuis le début.

Le seul hic avec ton code c'est que si un produit appartient à plusieurs catégories ... y'a un petit problème de navigation.

 

Par exemple

CAT A

----SS-CAT A1

----SS-CAT A2

 

CAT B

----SS-CAT B1

----SS-CAT B2

 

Si un produit P appartient à la sous catégorie A1 (catégorie par défaut) ET à la sous catégorie B2

Si je navigue dans la catégorie B -> puis sous-catégorie B2 et que je clique dans la liste sur le produit P : l'arbre des catégories change pour afficher la branche

CAT A

----SS-CAT A1

----SS-CAT A2

 

alors que j'étais dans

CAT B

----SS-CAT B1

----SS-CAT B2

 

Alors qu'avec l'arbre dynamique de base cela fonctionne parfaitement...

Share this post


Link to post
Share on other sites

Voici le fichier et une bonne version de faire ce que tu fais... en un peu mieux par rapport au problème exposé plus haut.

Si on accède direct à la fiche produit ou via le formulaire de recherche : les catégories affichées sont celles de sa catégorie par défaut.

En revanche si on vient de l'éventuelle 2ème ou nième catégorie dans laquelle est placé ce produit, ce sera bien la branche de cette catégorie qui sera affichée.

 

Cordialement,

Damien

blockcategories.zip

Share this post


Link to post
Share on other sites

Bonjour,

Bravo pour votre boulot

peut être hors sujet, mais comme vous avez travaillé dans le sujet, aurez vous une piste, pour que :

si une catégories contient un seul produit => le lien de cette catégorie envoi directement sur ce produit.

Merci d'avance.

Share this post


Link to post
Share on other sites

Bonjour,

 

Une categorie avec un seul produit .... c'est quand même étrange à la base non ?

 

Bien sûr que c'est possible mais il faut modifier pas mal de choses et c'est un comportement quelque peu inhabituel.

Share this post


Link to post
Share on other sites

Hello !

 

Désolé je viens de voir qu'il y a des posts dans ce sujet :)

Merci pour la contribution daYmo, effectivement je n'avais pas prévu ce cas de figure. Et puis le dev c'est pas franchement mon gros fort :)

 

Je vais voir ce que ca donne avec tes modifs.

 

ceci dit c'est une version pour PS 1.4 ? ca risque de ne pas fonctionner, je tourne sur 1.3.7

Sans vouloir abuser, pourrais tu en faire une version pour 1.3 ? ou au moins indiquer le code modifié dans ta version pour l'adapter au module pour 1.3 ?

 

Merci pour le partage en tout cas.

Share this post


Link to post
Share on other sites

Bonjour daYmo, en fait j'a iresolu mon problème si ça intéresse quelqu'un je posterais la réponse.

Sinon pourquoi c'est etrange d'avoir une catégorie avec un seul produit?

Share this post


Link to post
Share on other sites

@daYmo (ou quiconque pourrait aider)

 

Je pense avoir réussi à faire fonctionner tes modifs sur une version 1.3.7

 

2 autres questions :

 

- le module blockcategories s'affiche (partiellement) sur la page d'accueil. Comment éviter cela (autrement que de cacher le module pour "index.php" dans les parametres du module en back office) ?

 

- Comment afficher le nom de la catégorie principale en titre de bloc plutot que le nom "Catégories" ? j'imagine qu'il faut passer un paramètre au tpl, mais lequel ? existe-t-il déja ?

 

Merci

Share this post


Link to post
Share on other sites

Bon à priori j'ai réussi à trouver une solution.

cf module mi à jour dans le premier post.

Share this post


Link to post
Share on other sites

Je le teste ce soir ou demain sur 1.4

 

Pour information, sur 1.4 ca marcher impec sauf la page produit ou il n'y avait plus rien

 

Merci encore Marty =)

Share this post


Link to post
Share on other sites

Fonctionne aussi sous PS 1.4 !

 

je n'ai plus le problème que j'avais.

Sur la page d'accueil il reprend je crois le dernier menu en place, mais comme je ne l'affiche pas en page d'accueil, ca me va parfaitement !!

 

Merci Marty =)

Share this post


Link to post
Share on other sites

Malheureusement, chez moi j'ai le même problème :

 

- il affiche le dernier menu catégorie

- quand je clique sur le header du bloc (lien vers la catégorie principale), ça me renvoie une page blanche... car le ID de la catagorie n'est pas reprise dans le lien...

 

Avez-vous le même problème?

Share this post


Link to post
Share on other sites

Sur PS 1.4.6.2 J'ai remplacé le fichier blockcategories.php par celui de Daymo , ca fonctionne pour les categories mais cela me cause une erreur de serveur (Internal Server Error) sur la page d'accueil monsite.com/maboutique/ ou monsite.com/maboutique/fr

Share this post


Link to post
Share on other sites

module mis à jour : cf premier post

 

détails :

 

Perso je n'affiche pas le module catégories quand je ne suis pas dans une catégorie ou un produit (ex : une page cms). Dans blockcategories.php rajouter ligne 143 :

else return null;

 

Correction du lien sur la catégorie principale. Dans blockcategories.php rajouter après ligne 193 :

// Add category ID to link rewrite
$rootCateg->link_rewrite = $link->getCategoryLink($main_category, $rootCateg->link_rewrite);

Share this post


Link to post
Share on other sites

Oui c'est assez logique de ne pas afficher en accueil, cms...

else return null;

Avec cette ligne ca marche, dans le blockcategories.php de Daymo c'est à ajouter ligne 195

Share this post


Link to post
Share on other sites

Effectivement, j'avais ces problèmes et je ne les avais pas vu o_o

Merci pour la rapidité d'action Marty et les autres pour avoir déceler sa.

Page CMS ok (ils plantés)

Page Catégorie OK

Share this post


Link to post
Share on other sites

Bonjour!

 

Merci pour cette super contribution, j'utilise le fichier de daymo, fonctionne tres bien sur 1.4.6.2. Par contre si j'ajoute

"else return null;" ligne 195

 

ca plante les liens cms, il reprend le premier lien cms visité pour tous les autres.

Une solution plutôt que de jouer avec les points d'accroche?

 

voici le bout de code où il figure

 

Merci

 

 

 

 

 Tools::enableCache();
 if (!$this->isCached('blockcategories.tpl', $smartyCacheId))
 {
  $maxdepth = Configuration::get('BLOCK_CATEG_MAX_DEPTH');
  if (!$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
SELECT c.id_parent, c.id_category, cl.name, cl.description, cl.link_rewrite
FROM `'._DB_PREFIX_.'category` c
LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category` AND `id_lang` = '.$id_lang.')
LEFT JOIN `'._DB_PREFIX_.'category_group` cg ON (cg.`id_category` = c.`id_category`)
WHERE (c.`active` = 1 OR c.`id_category` = 1)
'.((int)($maxdepth) != 0 ? ' AND `level_depth` <= '.(int)($maxdepth) : '').'
AND cg.`id_group` IN ('.pSQL($groups).')
GROUP BY id_category
ORDER BY `level_depth` ASC, c.`position` ASC')
  )
return;

  $resultParents = array();
  $resultIds = array();
  foreach ($result as &$row)
  {
$resultParents[$row['id_parent']][] = &$row;
$resultIds[$row['id_category']] = &$row;
  }
  if (Tools::isSubmit('id_category'))
  {
$cookie->last_visited_category = $id_category;
$smarty->assign('currentCategoryId', $cookie->last_visited_category);  
  }
  elseif (Tools::isSubmit('id_product'))
  {
if (!isset($cookie->last_visited_category) OR !Product::idIsOnCategoryId($id_product, array('0' => array('id_category' => $cookie->last_visited_category))))
{
 $product = new Product($id_product);
 if (isset($product) AND Validate::isLoadedObject($product))
  $cookie->last_visited_category = (int)($product->id_category_default);

}
$smarty->assign('currentCategoryId', (int)($cookie->last_visited_category));  
  }
// appears only on categories page
else return null;


  // Get the level1 parent category of $main_category :
  $main_category=1;

Share this post


Link to post
Share on other sites

Bonjour,

 

Comment accedes tu à tes pages CMS ? par un bloc de liens ?

Si oui tes liens sont ils déclarés en liens directs (http://tondomaine/lien) ou relatifs (/lien) ?

si ils sont en relatifs essaie des les passer en liens directs.

Si cela vient bien de la il faudrait pourvoir ajouter le domaine au lien depuis le code ce qui serait plus propre

Share this post


Link to post
Share on other sites

merci de repondre si vite Marty, j'utilise le menu horizontal et le block cms d'origine...

Share this post


Link to post
Share on other sites

Je n'utilise pas ce bloc.

Pour vérifier je l'ai installé sur ma version de dev en local et à priori cela fonctionne. (par contre je n'ai pas activé l'url Rewrinting, peut être que cela joue)

 

Je re-précise aussi que je suis en version 1.3.7

Share this post


Link to post
Share on other sites

chez moi ca bug avec ou sans l'url rewriting, par contre ca fonctionne bien si je force la compil de smarty (pas top en prod... lol) bon sinon je mettrai des exceptions dans les points d'accroche, mais j'aime pas quand y a des trucs bizarres..

Share this post


Link to post
Share on other sites

Je n'ai toujours pas ce pb.

probable qu'il faille purger une variable du cache quand on est dans le cas "else return null"

Share this post


Link to post
Share on other sites

attendons peut etre d'autres reactions, si j'ai du nouveau je posterai :) merci

Share this post


Link to post
Share on other sites

- Comment afficher le nom de la catégorie principale en titre de bloc plutot que le nom "Catégories" ? j'imagine qu'il faut passer un paramètre au tpl, mais lequel ? existe-t-il déja ?

 

Je cherche précisément à faire cela. Comment as-tu procédé ? Je te remercie par avance :)) J'ai épluché ton fichier et celui de Daymo que j'utilise.. mais je ne vois pas où ça se trouve..

Share this post


Link to post
Share on other sites

Bonjour,

Bravo pour votre boulot

peut être hors sujet, mais comme vous avez travaillé dans le sujet, aurez vous une piste, pour que :

si une catégories contient un seul produit => le lien de cette catégorie envoi directement sur ce produit.

Merci d'avance.

 

Bonjour,

 

Votre solution m’intéresse.

J'ai une catégories, contenant 12 sous catégories qui mènent vers mes produits.

Je voudrais, à l'affichage de ma catégorie que mes liens pointent directement vers certains produits et non pas vers les sous-catégories et je pense que votre solution peut me servir.

 

Merci d'avance.

Share this post


Link to post
Share on other sites

Bonjour, j'ai un problème avec le module accompagné du cache smarty.

Avec le cache activé, j'ai des problèmes dans les pages fabricant.

Peut importe la page fabricant à laquelle je veux accéder, je tombe toujours sur la même.

En page panier, je me retrouve toujours avec le même produit même si je le supprime du panier et que j'en ajoute un autre.

 

La seule solution est soit de désactiver le module, soit de désactiver le cache smarty ou de supprimer les fichiers dans tools->smarty->cache.

 

Quel peut en être la cause?

 

merci

Share this post


Link to post
Share on other sites

First of all excuse the translation

 

Try commenting on line 322

 

 $smarty->cache_lifetime = 31536000; // 1 Year
 $display = $this->display(__FILE__, 'blockcategories_footer.tpl', $smartyCacheId);
 Tools::restoreCacheSettings();
 return $display;

 

thus leaving it

 

}
 //$smarty->cache_lifetime = 31536000; // 1 Year
 $display = $this->display(__FILE__, 'blockcategories_footer.tpl', $smartyCacheId);
 Tools::restoreCacheSettings();
 return $display;

 

I hope it works for you.

Share this post


Link to post
Share on other sites

Bonjour,

 

Je cherche à n'afficher que les sous-categories de ma catégorie sélectionnée dans ce block ! Est ce que quelqu'un peut m'aider.

 

Merci

 

Zef

Share this post


Link to post
Share on other sites

Bonjour c'est justement ce que je cherchais !!

 

Je suis en version 1.5.3.1

 

Mais je n'ai pas le résultat escompté

Il y t'il des modifications à apporter pour cette version ?

Share this post


Link to post
Share on other sites

Petit doute comme même concernant la modification

 

J'ai simplement écrasé mes fichiers (racine/modules/bockcategories/(le php et les 3 tpl)) par les vôtres

Vidé le cache et rafraîchi...

 

C'est bien comme ça qui faut faire ?

Ou j'ai manqué une étape ?

Share this post


Link to post
Share on other sites

Bonjour,

 

Je suis également intéressée par cette fonctionnalité pour la version 1.5

Share this post


Link to post
Share on other sites

bonjour,

 

je suis sur la version 1.5.4.1.

 

j'ai plusieurs catégorie avec 1 seules produits et je souhaite affiché directement le détail du produit (product.tpl).

 

pouvez-vous m'aidé a avancez, par avance merci.

Share this post


Link to post
Share on other sites

Bonjour,
 
Tout d'abord, le code ci-dessous fonctionne sur la version 1.5.4.1 de Prestashop.
 
Après une bonne demi-journée de recherche, j'ai finalement bidouillé la fonction "hookLeftColumn" du fichier "/modules/blockcategories/blockcategories.php" pour afficher la catégorie courante à partir du niveau 2.
 
En prenant l'exemple de cette navigation :
 
Accueil
 -- categorie 1
    -- sous-categorie 1-1
    -- sous-categorie 1-2
       -- sous-categorie 1-2-A
       -- sous-categorie 1-2-B
       -- sous-categorie 1-2-C
    -- sous-categorie 1-3
       -- sous-categorie 1-3-A
       -- sous-categorie 1-3-B
    -- sous-categorie 1-4
    -- sous-categorie 1-5
 -- categorie 2
 -- categorie 3
    -- sous-categorie 3-1
    -- sous-categorie 3-2
    -- sous-categorie 3-3
       -- sous-categorie 3-3-A
       -- sous-categorie 3-3-B
 -- categorie 4
 
Scénario 1 : On est sur "categorie 1", on affiche : 
 
 -- categorie 1 (selected)
    -- sous-categorie 1-1
    -- sous-categorie 1-2
    -- sous-categorie 1-3
    -- sous-categorie 1-4
    -- sous-categorie 1-5
 
Scénario 2 : On est sur "categorie 3", on affiche : 
 
 -- categorie 3 (selected)
    -- sous-categorie 3-1
    -- sous-categorie 3-2
    -- sous-categorie 3-3
 
Scénario 3 : On est sur "categorie 1-3", on affiche : 
 
 -- categorie 1
    -- sous-categorie 1-1
    -- sous-categorie 1-2
    -- sous-categorie 1-3 (selected)
       -- sous-categorie 1-3-A
       -- sous-categorie 1-3-B
    -- sous-categorie 1-4
    -- sous-categorie 1-5
 
... Et ainsi de suite en fonction de la profondeur...
 
Voici la fonction :

 

public function hookLeftColumn($params)
{
$id_customer = (int)$params['cookie']->id_customer;
// Get all groups for this customer and concatenate them as a string: "1,2,3..."
// It is necessary to keep the group query separate from the main select query because it is used for the cache
$groups = $id_customer ? implode(', ', Customer::getGroupsStatic($id_customer)) : Configuration::get('PS_UNIDENTIFIED_GROUP');
$id_product = (int)Tools::getValue('id_product', 0);
$id_category = (int)Tools::getValue('id_category', 0);
$id_lang = (int)$params['cookie']->id_lang;
$smartyCacheId = 'blockcategories|'.$this->context->shop->id.'_'.$groups.'_'.$id_lang.'_'.$id_product.'_'.$id_category;
$this->context->smarty->cache_lifetime = 31536000; // 1 Year
Tools::enableCache();
if (!$this->isCached('blockcategories.tpl', $smartyCacheId))
{
$maxdepth = Configuration::get('BLOCK_CATEG_MAX_DEPTH');
if (!$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
SELECT c.id_parent, c.id_category, cl.name, cl.description, cl.link_rewrite
FROM `'._DB_PREFIX_.'category` c
INNER JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category` AND cl.`id_lang` = '.$id_lang.Shop::addSqlRestrictionOnLang('cl').')
INNER JOIN `'._DB_PREFIX_.'category_shop` cs ON (cs.`id_category` = c.`id_category` AND cs.`id_shop` = '.(int)$this->context->shop->id.')
WHERE (c.`active` = 1 OR c.`id_category` = '.(int)Configuration::get('PS_HOME_CATEGORY').')
AND c.`id_category` != '.(int)Configuration::get('PS_ROOT_CATEGORY').'
'.((int)$maxdepth != 0 ? ' AND `level_depth` <= '.(int)$maxdepth : '').'
AND c.id_category IN (SELECT id_category FROM `'._DB_PREFIX_.'category_group` WHERE `id_group` IN ('.pSQL($groups).'))
ORDER BY `level_depth` ASC, '.(Configuration::get('BLOCK_CATEG_SORT') ? 'cl.`name`' : 'cs.`position`').' '.(Configuration::get('BLOCK_CATEG_SORT_WAY') ? 'DESC' : 'ASC')))
return Tools::restoreCacheSettings();
 
$resultParents = array();
$resultIds = array();
 
foreach ($result as &$row)
{
$resultParents[$row['id_parent']][] = &$row;
$resultIds[$row['id_category']] = &$row;
}
 
$blockCategTree = $this->getTree($resultParents, $resultIds, Configuration::get('BLOCK_CATEG_MAX_DEPTH'));
 
$isDhtml = (Configuration::get('BLOCK_CATEG_DHTML') == 1 ? true : false);
if (Tools::isSubmit('id_category'))
{
$this->context->cookie->last_visited_category = $id_category;
$this->smarty->assign('currentCategoryId', $this->context->cookie->last_visited_category);
}
if (Tools::isSubmit('id_product'))
{
if (!isset($this->context->cookie->last_visited_category)
|| !Product::idIsOnCategoryId($id_product, array('0' => array('id_category' => $this->context->cookie->last_visited_category)))
|| !Category::inShopStatic($this->context->cookie->last_visited_category, $this->context->shop))
{
$product = new Product($id_product);
if (isset($product) && Validate::isLoadedObject($product))
$this->context->cookie->last_visited_category = (int)$product->id_category_default;
}
$this->smarty->assign('currentCategoryId', (int)$this->context->cookie->last_visited_category);
}
 
$oCategory = new CategoryCore((int)$this->context->cookie->last_visited_category, $id_lang);
$sCurrentCateogry = $oCategory->id;
$parentId = $oCategory->id_parent;
 
if ( $parentId != 2 ) // Je fais un test sur 2 car c'est l'ID de la Home chez moi
{
while ( $parentId != 2)
{
$oCategory = new CategoryCore($parentId,$id_lang);
$sCatId = $oCategory->id;
$parentId = $oCategory->id_parent;
}
$blockCategTree = $this->getTree($resultParents, $resultIds, Configuration::get('BLOCK_CATEG_MAX_DEPTH'), $sCatId);
}
else
$blockCategTree = $this->getTree($resultParents, $resultIds, Configuration::get('BLOCK_CATEG_MAX_DEPTH'), $sCurrentCateogry);
 
 
unset($resultParents, $resultIds);
 
$this->smarty->assign('blockCategTree', $blockCategTree);
 
if (file_exists(_PS_THEME_DIR_.'modules/blockcategories/blockcategories.tpl'))
$this->smarty->assign('branche_tpl_path', _PS_THEME_DIR_.'modules/blockcategories/category-tree-branch.tpl');
else
$this->smarty->assign('branche_tpl_path', _PS_MODULE_DIR_.'blockcategories/category-tree-branch.tpl');
$this->smarty->assign('isDhtml', $isDhtml);
}
$display = $this->display(__FILE__, 'blockcategories.tpl', $smartyCacheId);
Tools::restoreCacheSettings();
return $display;
}
 
---------
 
Et une micro modif au .tpl qui se trouve dans le même répertoire "/modules/blockcategories/blockcategories.tpl" : 
 
<!-- Block categories module -->
<div id="categories_block_left" class="block">
<!-- <p class="title_block">{l s='Categories' mod='blockcategories'}</p> -->
<h4>{$blockCategTree.name}</h4>
<div class="block_content">
<ul class="tree {if $isDhtml}dhtml{/if}">
{foreach from=$blockCategTree.children item=child name=blockCategTree}
{if $smarty.foreach.blockCategTree.last}
{include file="$branche_tpl_path" node=$child last='true'}
{else}
{include file="$branche_tpl_path" node=$child}
{/if}
{/foreach}
</ul>
{* Javascript moved here to fix bug #PSCFI-151 *}
<script type="text/javascript">
// <![CDATA[
// we hide the tree only if JavaScript is activated
$('div#categories_block_left ul.dhtml').hide();
// ]]>
</script>
</div>
</div>
<!-- /Block categories module -->
 
---------
 
En espérant que cela serve ;)
 
Hideo
Edited by hideo (see edit history)
  • Like 1

Share this post


Link to post
Share on other sites

Génial !!! Votre code fonctionne à MERVEILLE pour la version 1.5, merci infiniment Hideo  :)

Share this post


Link to post
Share on other sites

Oui je confirme c'est génial !!

ça fonctionne nickel...

 

Petite détail qui serait bien de faire c'est de rajouter le titre de la famille en haut de l'arbre 

 

Ca fait longtemps que je ne suis pas remis dans le code

pouvez vous me dire comment on peut appeler ce nom ?

Share this post


Link to post
Share on other sites

Oui je confirme c'est génial !!

ça fonctionne nickel...

 

Petite détail qui serait bien de faire c'est de rajouter le titre de la famille en haut de l'arbre 

 

Ca fait longtemps que je ne suis pas remis dans le code

pouvez vous me dire comment on peut appeler ce nom ?

 

C'est déjà inclus dans le code, sur cette ligne : <h4>{$blockCategTree.name}</h4>

Share this post


Link to post
Share on other sites

Merci à vous pour votre feedback, ça fait plaisir que cela puisse servir à d'autres !  :)

 

Hideo

  • Like 1

Share this post


Link to post
Share on other sites

Oui mais moi je parlais du nom principal celui qui se trouve sur le top menu

A moins qu'il existe comme vous le dite mais que moi il ne s'affiche pas !!!

Share this post


Link to post
Share on other sites

 

Bonjour,

 

Tout d'abord, le code ci-dessous fonctionne sur la version 1.5.4.1 de Prestashop.

 

Après une bonne demi-journée de recherche, j'ai finalement bidouillé la fonction "hookLeftColumn" du fichier "/modules/blockcategories/blockcategories.php" pour afficher la catégorie courante à partir du niveau 2.

 

En prenant l'exemple de cette navigation :

 

Accueil

 -- categorie 1

    -- sous-categorie 1-1

    -- sous-categorie 1-2

       -- sous-categorie 1-2-A

       -- sous-categorie 1-2-B

       -- sous-categorie 1-2-C

    -- sous-categorie 1-3

       -- sous-categorie 1-3-A

       -- sous-categorie 1-3-B

    -- sous-categorie 1-4

    -- sous-categorie 1-5

 -- categorie 2

 -- categorie 3

    -- sous-categorie 3-1

    -- sous-categorie 3-2

    -- sous-categorie 3-3

       -- sous-categorie 3-3-A

       -- sous-categorie 3-3-B

 -- categorie 4

 

Scénario 1 : On est sur "categorie 1", on affiche : 

 

 -- categorie 1 (selected)

    -- sous-categorie 1-1

    -- sous-categorie 1-2

    -- sous-categorie 1-3

    -- sous-categorie 1-4

    -- sous-categorie 1-5

 

Scénario 2 : On est sur "categorie 3", on affiche : 

 

 -- categorie 3 (selected)

    -- sous-categorie 3-1

    -- sous-categorie 3-2

    -- sous-categorie 3-3

 

Scénario 3 : On est sur "categorie 1-3", on affiche : 

 

 -- categorie 1

    -- sous-categorie 1-1

    -- sous-categorie 1-2

    -- sous-categorie 1-3 (selected)

       -- sous-categorie 1-3-A

       -- sous-categorie 1-3-B

    -- sous-categorie 1-4

    -- sous-categorie 1-5

 

... Et ainsi de suite en fonction de la profondeur...

 

Voici la fonction :

 

public function hookLeftColumn($params)
{
$id_customer = (int)$params['cookie']->id_customer;
// Get all groups for this customer and concatenate them as a string: "1,2,3..."
// It is necessary to keep the group query separate from the main select query because it is used for the cache
$groups = $id_customer ? implode(', ', Customer::getGroupsStatic($id_customer)) : Configuration::get('PS_UNIDENTIFIED_GROUP');
$id_product = (int)Tools::getValue('id_product', 0);
$id_category = (int)Tools::getValue('id_category', 0);
$id_lang = (int)$params['cookie']->id_lang;
$smartyCacheId = 'blockcategories|'.$this->context->shop->id.'_'.$groups.'_'.$id_lang.'_'.$id_product.'_'.$id_category;
$this->context->smarty->cache_lifetime = 31536000; // 1 Year
Tools::enableCache();
if (!$this->isCached('blockcategories.tpl', $smartyCacheId))
{
$maxdepth = Configuration::get('BLOCK_CATEG_MAX_DEPTH');
if (!$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
SELECT c.id_parent, c.id_category, cl.name, cl.description, cl.link_rewrite
FROM `'._DB_PREFIX_.'category` c
INNER JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category` AND cl.`id_lang` = '.$id_lang.Shop::addSqlRestrictionOnLang('cl').')
INNER JOIN `'._DB_PREFIX_.'category_shop` cs ON (cs.`id_category` = c.`id_category` AND cs.`id_shop` = '.(int)$this->context->shop->id.')
WHERE (c.`active` = 1 OR c.`id_category` = '.(int)Configuration::get('PS_HOME_CATEGORY').')
AND c.`id_category` != '.(int)Configuration::get('PS_ROOT_CATEGORY').'
'.((int)$maxdepth != 0 ? ' AND `level_depth` <= '.(int)$maxdepth : '').'
AND c.id_category IN (SELECT id_category FROM `'._DB_PREFIX_.'category_group` WHERE `id_group` IN ('.pSQL($groups).'))
ORDER BY `level_depth` ASC, '.(Configuration::get('BLOCK_CATEG_SORT') ? 'cl.`name`' : 'cs.`position`').' '.(Configuration::get('BLOCK_CATEG_SORT_WAY') ? 'DESC' : 'ASC')))
return Tools::restoreCacheSettings();
 
$resultParents = array();
$resultIds = array();
 
foreach ($result as &$row)
{
$resultParents[$row['id_parent']][] = &$row;
$resultIds[$row['id_category']] = &$row;
}
 
$blockCategTree = $this->getTree($resultParents, $resultIds, Configuration::get('BLOCK_CATEG_MAX_DEPTH'));
 
$isDhtml = (Configuration::get('BLOCK_CATEG_DHTML') == 1 ? true : false);
if (Tools::isSubmit('id_category'))
{
$this->context->cookie->last_visited_category = $id_category;
$this->smarty->assign('currentCategoryId', $this->context->cookie->last_visited_category);
}
if (Tools::isSubmit('id_product'))
{
if (!isset($this->context->cookie->last_visited_category)
|| !Product::idIsOnCategoryId($id_product, array('0' => array('id_category' => $this->context->cookie->last_visited_category)))
|| !Category::inShopStatic($this->context->cookie->last_visited_category, $this->context->shop))
{
$product = new Product($id_product);
if (isset($product) && Validate::isLoadedObject($product))
$this->context->cookie->last_visited_category = (int)$product->id_category_default;
}
$this->smarty->assign('currentCategoryId', (int)$this->context->cookie->last_visited_category);
}
 
$oCategory = new CategoryCore((int)$this->context->cookie->last_visited_category, $id_lang);
$sCurrentCateogry = $oCategory->id;
$parentId = $oCategory->id_parent;
 
if ( $parentId != 2 ) // Je fais un test sur 2 car c'est l'ID de la Home chez moi
{
while ( $parentId != 2)
{
$oCategory = new CategoryCore($parentId,$id_lang);
$sCatId = $oCategory->id;
$parentId = $oCategory->id_parent;
}
$blockCategTree = $this->getTree($resultParents, $resultIds, Configuration::get('BLOCK_CATEG_MAX_DEPTH'), $sCatId);
}
else
$blockCategTree = $this->getTree($resultParents, $resultIds, Configuration::get('BLOCK_CATEG_MAX_DEPTH'), $sCurrentCateogry);
 
 
unset($resultParents, $resultIds);
 
$this->smarty->assign('blockCategTree', $blockCategTree);
 
if (file_exists(_PS_THEME_DIR_.'modules/blockcategories/blockcategories.tpl'))
$this->smarty->assign('branche_tpl_path', _PS_THEME_DIR_.'modules/blockcategories/category-tree-branch.tpl');
else
$this->smarty->assign('branche_tpl_path', _PS_MODULE_DIR_.'blockcategories/category-tree-branch.tpl');
$this->smarty->assign('isDhtml', $isDhtml);
}
$display = $this->display(__FILE__, 'blockcategories.tpl', $smartyCacheId);
Tools::restoreCacheSettings();
return $display;
}
 
---------
 
Et une micro modif au .tpl qui se trouve dans le même répertoire "/modules/blockcategories/blockcategories.tpl" : 
 
<!-- Block categories module -->
<div id="categories_block_left" class="block">
<!-- <p class="title_block">{l s='Categories' mod='blockcategories'}</p> -->
<h4>{$blockCategTree.name}</h4>
<div class="block_content">
<ul class="tree {if $isDhtml}dhtml{/if}">
{foreach from=$blockCategTree.children item=child name=blockCategTree}
{if $smarty.foreach.blockCategTree.last}
{include file="$branche_tpl_path" node=$child last='true'}
{else}
{include file="$branche_tpl_path" node=$child}
{/if}
{/foreach}
</ul>
{* Javascript moved here to fix bug #PSCFI-151 *}
<script type="text/javascript">
// <![CDATA[
// we hide the tree only if JavaScript is activated
$('div#categories_block_left ul.dhtml').hide();
// ]]>
</script>
</div>
</div>
<!-- /Block categories module -->
 
---------
 
En espérant que cela serve ;)
 
Hideo

 

Bonjour,

 

Votre code fonctionne pour la version 1.5.6 mais cela ralentit considérablement le site jusqu'à saturation....

Sur mon site j'ai en plus le bloc navigation à facette qui tourne. Serait-ce du à cela ?

J'ai remis le bloccategories d'origine et hop tout refonctionne ....

Pouvez vous m'aider pour voir ce problème ?

 

JMA

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More