Prestashop : Tri des produits et catégories par Ordre alphabétique

Cet article est assez ancien, malgré toute l'attention que j' apporte à mes contenus il est possible que celui-ci ne soit plus d'actualité.
N'hésitez pas à me le signaler si nécessaire via le formulaire de contact.

Voici comment lister les produits et les catégories Prestashop par ordre alphabétique :

( Cette méthode est valide avec prestashop 1.4.x et prestashop 1.5.x , je ne l’ai pas testé avec la version 1.6 )

Les procédures à exécuter sont les suivantes :

  • Ordre des catégories dans le module blockCatégories
  • Ordre des produits dans les préférences produits
  • Override de la récupération des sousCatégories

 

Ordre des catégories dans le module blockCatégories :

Dans l’administration « modules » , rechercher le module « bloc catégories »
Block Catégories Prestashop
Dans la configuration du module ,  cocher « par nom » dans l’option Trier et sauvegarder

Ordre des produits dans les préférences produits

Dans l’administration « Préférences » puis « Produits »

Tri des produits prestashop

Dans « pagination / Tri par défaut » sélectionner l’option « Nom  du produit » et sauvegarder

Override de la récupération des sousCatégories

Afin de pouvoir trier les sous catégories d’une catégorie par ordre alphabétique il va être nécessaire d’overrider la fonction getSubCategories de la class « Category »
Créer donc un fichier Category.php dans le dossier « override/classes » avec le contenu suivant.

Version prestashop 1.4

<?php
class Category extends CategoryCore
{
 
    /**
      * Return current category childs
      *
      * @param integer $id_lang Language ID
      * @param boolean $active return only active categories
      * @return array Categories
      */
    public function getSubCategories($id_lang, $active = true)
    {
         if (!Validate::isBool($active))
             die(Tools::displayError());
 
        $groups = FrontController::getCurrentCustomerGroups();
        $sqlGroups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1');
 
        $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
        SELECT c.*, cl.id_lang, cl.name, cl.description, cl.link_rewrite, cl.meta_title, cl.meta_keywords, cl.meta_description
        FROM `'._DB_PREFIX_.'category` c
        LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category` AND `id_lang` = '.(int)($id_lang).')
        LEFT JOIN `'._DB_PREFIX_.'category_group` cg ON (cg.`id_category` = c.`id_category`)
        WHERE `id_parent` = '.(int)($this->id).'
        '.($active ? 'AND `active` = 1' : '').'
        AND cg.`id_group` '.$sqlGroups.'
        GROUP BY c.`id_category`
        ORDER BY `level_depth` ASC, cl.name ASC'); //On change le tri de c.position à cl.name
 
        foreach ($result AS &$row)
        {
            $row['id_image'] = (file_exists(_PS_CAT_IMG_DIR_.$row['id_category'].'.jpg')) ? (int)($row['id_category']) : Language::getIsoById($id_lang).'-default';
            $row['legend'] = 'no picture';
        }
        return $result;
    }
 
}

 

Version prestashop 1.5

<?php
class Category extends CategoryCore
{
 
    /**
      * Return current category childs
      *
      * @param integer $id_lang Language ID
      * @param boolean $active return only active categories
      * @return array Categories
      */
    public function getSubCategories($id_lang, $active = true)
    {
         if (!Validate::isBool($active))
             die(Tools::displayError());
 
        $groups = FrontController::getCurrentCustomerGroups();
        $sql_groups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1');
 
        $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
            SELECT c.*, cl.id_lang, cl.name, cl.description, cl.link_rewrite, cl.meta_title, cl.meta_keywords, cl.meta_description
            FROM `'._DB_PREFIX_.'category` c
            '.Shop::addSqlAssociation('category', 'c').'
            LEFT JOIN `'._DB_PREFIX_.'category_lang` cl
                ON (c.`id_category` = cl.`id_category`
                AND `id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').')
            LEFT JOIN `'._DB_PREFIX_.'category_group` cg
                ON (cg.`id_category` = c.`id_category`)
            WHERE `id_parent` = '.(int)$this->id.'
                '.($active ? 'AND `active` = 1' : '').'
                AND cg.`id_group` '.$sql_groups.'
            GROUP BY c.`id_category`
            ORDER BY `level_depth` ASC, cl.name ASC 
        '); //Changement du tri de position à name
 
        foreach ($result as &$row)
        {
            $row['id_image'] = file_exists(_PS_CAT_IMG_DIR_.$row['id_category'].'.jpg') ? (int)$row['id_category'] : Language::getIsoById($id_lang).'-default';
            $row['legend'] = 'no picture';
        }
        return $result;
    }
 
}

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *