Module blocktopmenu sur 2 niveaux – Prestashop 1.6

J’ai du effectuer cette modification pour l’un de mes clients, j’ai remarqué en cherchant rapidement une solution a ce problème qu’un grand nombre d’utilisateur optait pour la solution la plus simple, c’est à dire celle en css qui consiste a simplement cacher les liens a l’aide d’un display:none.

Oui cette solution est rapide et simple à mettre en place mais elle peut-être mal vu par Google pour votre référencement, car les robots sont capables d’interpréter le code de votre site et se rendre compte que vous essayez de cacher des liens a vos visiteurs.

De puis la version 1.6 de prestashop on peut override des fonctions php, donc pourquoi se priver ?

Vous devez créer un fichier nomé « blocktopmenu.php » dans :

votre_site/override/modules/blocktopmenu/

Dans ce fameux fichier blocktopmenu copier/coller le code ci-dessous:


<?php
if (!defined('PS_VERSION')) {
exit;
}
class BlocktopmenuOverride extends Blocktopmenu
{
protected function generateCategoriesMenu($categories, $is_children = 0)
{
$html = ''; 
foreach ($categories as $key => $category) {
        if ($category['level_depth'] >4) return false;
        if ($category['level_depth'] > 1) {
            $cat = new Category($category['id_category']);
            $link = Tools::HtmlEntitiesUTF8($cat->getLink());
        } else {
            $link = $this->context->link->getPageLink('index');
        }
        /* Whenever a category is not active we shouldnt display it to customer */
        if ((bool)$category['active'] === false) {
            continue;
        }
        $html .= '<li'.(($this->page_name == 'category'
            && (int)Tools::getValue('id_category') == (int)$category['id_category']) ? ' class="sfHoverForce"' : '').'>';
        $html .= '<a href="'.$link.'" title="'.$category['name'].'">'.$category['name'].'</a>';
        if (isset($category['children']) && !empty($category['children'])) {
            $html .= '<ul>';
            $html .= $this->generateCategoriesMenu($category['children'], 1);
            if ((int)$category['level_depth'] > 1 && !$is_children) {
                $files = scandir(_PS_CAT_IMG_DIR_);
                if (count(preg_grep('/^'.$category['id_category'].'-([0-9])?_thumb.jpg/i', $files)) > 0) {
                    $html .= '<li class="category-thumbnail">';
                    foreach ($files as $file) {
                        if (preg_match('/^'.$category['id_category'].'-([0-9])?_thumb.jpg/i', $file) === 1) {
                            $html .= '<div><img src="'.$this->context->link->getMediaLink(_THEME_CAT_DIR_.$file)
                            .'" alt="'.Tools::SafeOutput($category['name']).'" title="'
                            .Tools::SafeOutput($category['name']).'" class="imgm" /></div>';
                        }
                    }
                    $html .= '</li>';
                }
            }
            $html .= '</ul>';
        }
        $html .= '</li>';
    }
    return $html;
}
}

Cette modification est valable pour la version V2.2.4 du module natif blocktopmenu de prestashop 1.6.1 (testé sous 1.6.1.24).

Retour en haut