Jump to content
Aude5

Tri Chaotique dans catégorie

Recommended Posts

Bonjour,

Malgré avoir écumé plusieurs fois le forum je ne trouve par de solution, je vous lance donc une bouteille à la mer en espérant que quelqu'un la récupère.

Mon problème se situe la liste des produits dans la page catégorie.

  • Prestashop 1.6.1.11 (mais c'est un Prestashop qui à "subit" de nombreuses mise à jour :) un vieux de la vieille )
  • Pas d’utilisation du module de tri à facette. Mon ordre de tri par défaut est prix croissant avec une pagination de 40.
  • Mes produits sont souvent associés à plusieurs catégories.

 

Mais sur toutes mes pages catégories, les premiers prix affichés de ma page N+1 sont inférieurs aux derniers de la page N

il semble que cela soit "un bug" comme évoqué ici http://forge.prestashop.com/browse/PSCFV-6820?jql=text ~ "sort specific prices"

j'ai tenté de modifier comme conseille dans ce post 

mais rien n'y fait.. d’ailleurs j'ai même l'impression que la  function du fichier Category.php (classes)

function getProducts($id_lang, $p, $n, $order_by = null, $order_way = null, $get_total = false, $active = true, $random = false, $random_number_products = 1, $check_access = true, Context $context = null)

n'a aucun impact sur ce tri.

 

NB : Le tri fonctionne parfaitement si j'affiche la totalité des articles sur 1 page.

 

Please hellpppp  :( (c) Lilou Fifth Element

Merci à vous

 

 

Share this post


Link to post
Share on other sites

Bonjour.

Tu as des override sur Category.php (méthode getProduct) et / ou CategoryController.php (méthode assignProductList) ? 

Bon courage!

Share this post


Link to post
Share on other sites

Bonjour,

Ce n'est pas géré par Prestashop histoire de pouvoir le faire tourner sur des petits hébergement.

De base prestashop dit : 

Je prends X articles dans la catégorie et je trie par prix.

Alors qu'il faut prendre tous les articles et trier par prix 

Si tu as beaucoup d'articles attention ça demande de la ressource car tu charges tous les produits de la catégorie.

Regarde ici ça fonctionne avec l'override :

https://www.esprit-equitation.com/184-boots-equitation

3pom

  

 

Edited by okom3pom (see edit history)

Share this post


Link to post
Share on other sites

Merci Matt K.

 

Mais je n'ai pas d'override dans les 2 cas.

Share this post


Link to post
Share on other sites

Merci okom3pom

 

J'ai appliqué ton override mais cela ne fonctionne pas. Ceci dit ce qui est étrange c'est que j'ai modifié 

            $nb_days_new_product = 20;

pour le passer  à

            $nb_days_new_product = 9000;

Et aucun effet, alors que normalement je devrais avoir tous mes produits en "nouveau" ?

j'ai bien vider les caches (serveurs et navigateur)

 

Share this post


Link to post
Share on other sites

Oui le cache navigateur,

le cache presta et le class_index.php  (malgré que dans performance je suis en  Forcer la compilation à chaque appel )

Je me suis même demandé si il interprétait le code (niveau de la classe ou de son override) , et dès que j’écris n'importe quoi j'ai bien une erreur

Etrange non ?

 

j'ai tenté par l'override racine\override\classes\Category.php

et meme directement dans \classes\Category.php

il y a  d'autres endroits ?

 

 

Encore plus etrange si je renomme classes\Category.php en classes\Categorybidon.php j'ai une erreur

Si je supprime de ce même fichier  "public function getProducts($id_"  ça fonctionne

 

C'est fou non ?

Edited by Aude5 (see edit history)

Share this post


Link to post
Share on other sites

Il est comment votre fichier override\classes\Category.php

Faite un copier coller dans la balise code

Share this post


Link to post
Share on other sites

voila :) rien de spécial juste forcé à nb_days_new_product = 90000 (pour essai) 

 

<?php
class Category extends CategoryCore
{
  /**
     * Version Prestashop de la méthode 1.6.1.9 
     *  - Pas de vente privée
     *  - Trie par prix sur le total des articles
     *
     * Returns category products
     *
     * @param int         $id_lang                Language ID
     * @param int         $p                      Page number
     * @param int         $n                      Number of products per page
     * @param string|null $order_by               ORDER BY column
     * @param string|null $order_way              Order way
     * @param bool        $get_total              If set to true, returns the total number of results only
     * @param bool        $active                 If set to true, finds only active products
     * @param bool        $random                 If true, sets a random filter for returned products
     * @param int         $random_number_products Number of products to return if random is activated
     * @param bool        $check_access           If set tot rue, check if the current customer
     *                                            can see products from this category
     * @param Context|null $context
     *
     * @return array|int|false Products, number of products or false (no access)
     * @throws PrestaShopDatabaseException
     */
    public function getProducts($id_lang, $p, $n, $order_by = null, $order_way = null, $get_total = false, $active = true, $random = false, $random_number_products = 1, $check_access = true, Context $context = null)
    {
        if (!$context) {
            $context = Context::getContext();
        }

        if ($check_access && !$this->checkAccess($context->customer->id)) {
            return false;
        }

        $front = in_array($context->controller->controller_type, array('front', 'modulefront'));
        $id_supplier = (int)Tools::getValue('id_supplier');

        /** Return only the number of products */
        // Okom3pom AND p.`vente_privee` != 1
        if ($get_total) {
            $sql = 'SELECT COUNT(cp.`id_product`) AS total
                    FROM `'._DB_PREFIX_.'product` p
                    '.Shop::addSqlAssociation('product', 'p').'
                    LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON p.`id_product` = cp.`id_product`
                    WHERE cp.`id_category` = '.(int)$this->id.' AND p.`vente_privee` < 1   
                '.($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '').
                ($active ? ' AND product_shop.`active` = 1' : '').
                ($id_supplier ? 'AND p.id_supplier = '.(int)$id_supplier : '');

            return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
        }

        if ($p < 1) {
            $p = 1;
        }

        /** Tools::strtolower is a fix for all modules which are now using lowercase values for 'orderBy' parameter */
        $order_by  = Validate::isOrderBy($order_by)   ? Tools::strtolower($order_by)  : 'position';
        $order_way = Validate::isOrderWay($order_way) ? Tools::strtoupper($order_way) : 'ASC';

        $order_by_prefix = false;
        if ($order_by == 'id_product' || $order_by == 'date_add' || $order_by == 'date_upd') {
            $order_by_prefix = 'p';
        } elseif ($order_by == 'name') {
            $order_by_prefix = 'pl';
        } elseif ($order_by == 'manufacturer' || $order_by == 'manufacturer_name') {
            $order_by_prefix = 'm';
            $order_by = 'name';
        } elseif ($order_by == 'position') {
            $order_by_prefix = 'cp';
        }

        if ($order_by == 'price') {
            $order_by = 'orderprice';
        }

        $nb_days_new_product = Configuration::get('PS_NB_DAYS_NEW_PRODUCT');
        if (!Validate::isUnsignedInt($nb_days_new_product)) {
            $nb_days_new_product = 90000;
        }
        
        // Okom3pom AND p.`vente_privee` != 1
        $sql = 'SELECT p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) AS quantity'.(Combination::isFeatureActive() ? ', IFNULL(product_attribute_shop.id_product_attribute, 0) AS id_product_attribute,
                    product_attribute_shop.minimal_quantity AS product_attribute_minimal_quantity' : '').', pl.`description`, pl.`description_short`, pl.`available_now`,
                    pl.`available_later`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, image_shop.`id_image` id_image,
                    il.`legend` as legend, m.`name` AS manufacturer_name, cl.`name` AS category_default,
                    DATEDIFF(product_shop.`date_add`, DATE_SUB("'.date('Y-m-d').' 00:00:00",
                    INTERVAL '.(int)$nb_days_new_product.' DAY)) > 0 AS new, product_shop.price AS orderprice
                FROM `'._DB_PREFIX_.'category_product` cp
                LEFT JOIN `'._DB_PREFIX_.'product` p
                    ON p.`id_product` = cp.`id_product`
                '.Shop::addSqlAssociation('product', 'p').
                (Combination::isFeatureActive() ? ' LEFT JOIN `'._DB_PREFIX_.'product_attribute_shop` product_attribute_shop
                ON (p.`id_product` = product_attribute_shop.`id_product` AND product_attribute_shop.`default_on` = 1 AND product_attribute_shop.id_shop='.(int)$context->shop->id.')':'').'
                '.Product::sqlStock('p', 0).'
                LEFT JOIN `'._DB_PREFIX_.'category_lang` cl
                    ON (product_shop.`id_category_default` = cl.`id_category`
                    AND cl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').')
                LEFT JOIN `'._DB_PREFIX_.'product_lang` pl
                    ON (p.`id_product` = pl.`id_product`
                    AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').')
                LEFT JOIN `'._DB_PREFIX_.'image_shop` image_shop
                    ON (image_shop.`id_product` = p.`id_product` AND image_shop.cover=1 AND image_shop.id_shop='.(int)$context->shop->id.')
                LEFT JOIN `'._DB_PREFIX_.'image_lang` il
                    ON (image_shop.`id_image` = il.`id_image`
                    AND il.`id_lang` = '.(int)$id_lang.')
                LEFT JOIN `'._DB_PREFIX_.'manufacturer` m
                    ON m.`id_manufacturer` = p.`id_manufacturer`
                WHERE product_shop.`id_shop` = '.(int)$context->shop->id.' 
                    AND p.`vente_privee` < 1
                    AND cp.`id_category` = '.(int)$this->id
                    .($active ? ' AND product_shop.`active` = 1' : '')
                    .($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '')
                    .($id_supplier ? ' AND p.id_supplier = '.(int)$id_supplier : '');

        if ($random === true) {
            $sql .= ' ORDER BY RAND() LIMIT '.(int)$random_number_products;
        } else {
            $sql .= ' ORDER BY '.(!empty($order_by_prefix) ? $order_by_prefix.'.' : '').'`'.bqSQL($order_by).'` '.pSQL($order_way);
            // Okom3pom
            // LIMIT '.(((int)$p - 1) * (int)$n).','.(int)$n;
            // End Okom3pom
        }

        $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql, true, false);

        if (!$result) {
            return array();
        }

        if ($order_by == 'orderprice') {
            Tools::orderbyPrice($result, $order_way);
        }
        
        // Okom3pom
        $result = array_slice($result, (((int)$p - 1) * (int)$n), (int)$n);     
        // End Okom3pom

        /** Modify SQL result */
        return Product::getProductsProperties($id_lang, $result);
    }

}

 

Share this post


Link to post
Share on other sites

Si ton override fonctionnait ça devrait planter car tu as laissé des conditions propres à mon site.

Les p.`vente_privee` != 1

Par contre ça n'explique pourquoi ça ne fonctionne pas ...

C'est mieux sans :

class Category extends CategoryCore
{
  /**
     * Version Prestashop de la méthode 1.6.1.9 
     *  - Pas de vente privée
     *  - Trie par prix sur le total des articles
     *
     * Returns category products
     *
     * @param int         $id_lang                Language ID
     * @param int         $p                      Page number
     * @param int         $n                      Number of products per page
     * @param string|null $order_by               ORDER BY column
     * @param string|null $order_way              Order way
     * @param bool        $get_total              If set to true, returns the total number of results only
     * @param bool        $active                 If set to true, finds only active products
     * @param bool        $random                 If true, sets a random filter for returned products
     * @param int         $random_number_products Number of products to return if random is activated
     * @param bool        $check_access           If set tot rue, check if the current customer
     *                                            can see products from this category
     * @param Context|null $context
     *
     * @return array|int|false Products, number of products or false (no access)
     * @throws PrestaShopDatabaseException
     */
    public function getProducts($id_lang, $p, $n, $order_by = null, $order_way = null, $get_total = false, $active = true, $random = false, $random_number_products = 1, $check_access = true, Context $context = null)
    {
        if (!$context) {
            $context = Context::getContext();
        }

        if ($check_access && !$this->checkAccess($context->customer->id)) {
            return false;
        }

        $front = in_array($context->controller->controller_type, array('front', 'modulefront'));
        $id_supplier = (int)Tools::getValue('id_supplier');

        /** Return only the number of products */
        if ($get_total) {
            $sql = 'SELECT COUNT(cp.`id_product`) AS total
                    FROM `'._DB_PREFIX_.'product` p
                    '.Shop::addSqlAssociation('product', 'p').'
                    LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON p.`id_product` = cp.`id_product`
                    WHERE cp.`id_category` = '.(int)$this->id.' 
                '.($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '').
                ($active ? ' AND product_shop.`active` = 1' : '').
                ($id_supplier ? 'AND p.id_supplier = '.(int)$id_supplier : '');

            return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
        }

        if ($p < 1) {
            $p = 1;
        }

        /** Tools::strtolower is a fix for all modules which are now using lowercase values for 'orderBy' parameter */
        $order_by  = Validate::isOrderBy($order_by)   ? Tools::strtolower($order_by)  : 'position';
        $order_way = Validate::isOrderWay($order_way) ? Tools::strtoupper($order_way) : 'ASC';

        $order_by_prefix = false;
        if ($order_by == 'id_product' || $order_by == 'date_add' || $order_by == 'date_upd') {
            $order_by_prefix = 'p';
        } elseif ($order_by == 'name') {
            $order_by_prefix = 'pl';
        } elseif ($order_by == 'manufacturer' || $order_by == 'manufacturer_name') {
            $order_by_prefix = 'm';
            $order_by = 'name';
        } elseif ($order_by == 'position') {
            $order_by_prefix = 'cp';
        }

        if ($order_by == 'price') {
            $order_by = 'orderprice';
        }

        $nb_days_new_product = Configuration::get('PS_NB_DAYS_NEW_PRODUCT');
        if (!Validate::isUnsignedInt($nb_days_new_product)) {
            $nb_days_new_product = 90000;
        }
        
        
        $sql = 'SELECT p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) AS quantity'.(Combination::isFeatureActive() ? ', IFNULL(product_attribute_shop.id_product_attribute, 0) AS id_product_attribute,
                    product_attribute_shop.minimal_quantity AS product_attribute_minimal_quantity' : '').', pl.`description`, pl.`description_short`, pl.`available_now`,
                    pl.`available_later`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, image_shop.`id_image` id_image,
                    il.`legend` as legend, m.`name` AS manufacturer_name, cl.`name` AS category_default,
                    DATEDIFF(product_shop.`date_add`, DATE_SUB("'.date('Y-m-d').' 00:00:00",
                    INTERVAL '.(int)$nb_days_new_product.' DAY)) > 0 AS new, product_shop.price AS orderprice
                FROM `'._DB_PREFIX_.'category_product` cp
                LEFT JOIN `'._DB_PREFIX_.'product` p
                    ON p.`id_product` = cp.`id_product`
                '.Shop::addSqlAssociation('product', 'p').
                (Combination::isFeatureActive() ? ' LEFT JOIN `'._DB_PREFIX_.'product_attribute_shop` product_attribute_shop
                ON (p.`id_product` = product_attribute_shop.`id_product` AND product_attribute_shop.`default_on` = 1 AND product_attribute_shop.id_shop='.(int)$context->shop->id.')':'').'
                '.Product::sqlStock('p', 0).'
                LEFT JOIN `'._DB_PREFIX_.'category_lang` cl
                    ON (product_shop.`id_category_default` = cl.`id_category`
                    AND cl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').')
                LEFT JOIN `'._DB_PREFIX_.'product_lang` pl
                    ON (p.`id_product` = pl.`id_product`
                    AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').')
                LEFT JOIN `'._DB_PREFIX_.'image_shop` image_shop
                    ON (image_shop.`id_product` = p.`id_product` AND image_shop.cover=1 AND image_shop.id_shop='.(int)$context->shop->id.')
                LEFT JOIN `'._DB_PREFIX_.'image_lang` il
                    ON (image_shop.`id_image` = il.`id_image`
                    AND il.`id_lang` = '.(int)$id_lang.')
                LEFT JOIN `'._DB_PREFIX_.'manufacturer` m
                    ON m.`id_manufacturer` = p.`id_manufacturer`
                WHERE product_shop.`id_shop` = '.(int)$context->shop->id.' 
                    
                    AND cp.`id_category` = '.(int)$this->id
                    .($active ? ' AND product_shop.`active` = 1' : '')
                    .($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '')
                    .($id_supplier ? ' AND p.id_supplier = '.(int)$id_supplier : '');

        if ($random === true) {
            $sql .= ' ORDER BY RAND() LIMIT '.(int)$random_number_products;
        } else {
            $sql .= ' ORDER BY '.(!empty($order_by_prefix) ? $order_by_prefix.'.' : '').'`'.bqSQL($order_by).'` '.pSQL($order_way);
            // Okom3pom
            // LIMIT '.(((int)$p - 1) * (int)$n).','.(int)$n;
            // End Okom3pom
        }

        $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql, true, false);

        if (!$result) {
            return array();
        }

        if ($order_by == 'orderprice') {
            Tools::orderbyPrice($result, $order_way);
        }
        
        // Okom3pom
        $result = array_slice($result, (((int)$p - 1) * (int)$n), (int)$n);     
        // End Okom3pom

        /** Modify SQL result */
        return Product::getProductsProperties($id_lang, $result);
    }

}

 

Citation

Encore plus etrange si je renomme classes\Category.php en classes\Categorybidon.php j'ai une erreur

 

Ca c'est normal :) 

Share this post


Link to post
Share on other sites

 

Merci okom3pom pour tes retours

Clairement,  j'attendais aussi que cela plante avec "ventre privée".

 

Mais la je sèche je pense que de vais repartir sur une base plus fraîche  wamp, sources fichiers, etc.... mais la je cale.

 

 

Share this post


Link to post
Share on other sites

Tu supprimes bien le class_index.php ?

Supprime le encore une fois ouvre une page de ton site pour qu'il se génère à nouveau et colle le dans la balise code.

Share this post


Link to post
Share on other sites

Hihi j'ai pas pensé à ça dans : Paramètres avancés -> Performances

Tu as pas désactiver toutes les surcharges sur ON ?

Share this post


Link to post
Share on other sites

et bien non, j'avais suspecté cela aussi mais il est bien sur NON ;)

Je viens d'appliquer ton code sur une installation toutes fraîche de PS est ça marche, il me reste à trouver pourquoi ça fonctionne pas sur mon projet

Edited by Aude5 (see edit history)

Share this post


Link to post
Share on other sites

Tu devrais passer ce sujet en résolu et en créer un nouveau avec un titre plus adéquate.

 

Share this post


Link to post
Share on other sites

Bonjour je me permets de déterrer ce topic car j'ai le même problème sur un ps 1.6.1.24 avec la pagination par prix croissant sur les pages category.

J'ai tenté passer la valeur de $nb_days_new_product à 90000 en vidant tous les caches mais ça ne résout pas mon problème.

Share this post


Link to post
Share on other sites

Oui. Tout lu et ai fait l'override avec $nb_days_new_product = 9999. J'ai même modifié directement cette valeur du fichier ../category.php, vidé les caches, supprimé class_index, désactivé le filtre à facettes (au cas où)... mais rien y fait le tri par prix croissant ne fonctionne pas....

 

Share this post


Link to post
Share on other sites

Ok sinon vous avez lu le sujet à quel moment je parle de passer le  $nb_days_new_product = 9999 ?

Mon override supprime la limit dans la requete SQL et limite le tableau par la suite.

Regardez les commentaites // okom3pom dans la requête
 

 

 

Share this post


Link to post
Share on other sites

Bonjour @okom3pom,

Comme Aude5 j'avais voulu tester l'affichage de mes produits en nouveau avec $nb_days_new_product = 9999....

J'ai sinon compris pourquoi je n'avais pas de résultat, je faisais les tests sur ma page "promotions" (car elle a un listing de produit important) mais je n'ai tilté qu'après que ce n'était pas une catégorie... Je confirme donc que l'override fonctionne sur ces dernières.

Saurais-tu comment je pourrais en faire de même pour mes pages nouveautés, promotions et meilleurs ventes ?

Je te remercie pour ta disponibilité et ces solutions ;)

Share this post


Link to post
Share on other sites

Il faut que tu fasses un override de la class product en modifiant les méthode getnewproduct par exemple

Share this post


Link to post
Share on other sites

Ok merci pour l'info. Par contre pour l'override précédent, en réactivant le module de navigation à facette le problème réapparaît...

Share this post


Link to post
Share on other sites

Je n'utilise pas ce module mais il doit y avoir une requete dans ce module qu'il faut modifier aussi

Share this post


Link to post
Share on other sites

dans blocklayered.php et la function getProductByFilters il y a ces ' LIMIT ' à la fin de la fonction :

if (version_compare(_PS_VERSION_, '1.6.1', '>=') === true) {
                $this->products = Db::getInstance()->executeS('
				SELECT
					p.*,
					' . ($alias_where == 'p' ? '' : 'product_shop.*,' ) . '
					' . $alias_where . '.id_category_default,
					pl.*,
					image_shop.`id_image` id_image,
					il.legend,
					m.name manufacturer_name,
					' . (Combination::isFeatureActive() ? 'product_attribute_shop.id_product_attribute id_product_attribute,' : '') . '
					DATEDIFF(' . $alias_where . '.`date_add`, DATE_SUB("' . date('Y-m-d') . ' 00:00:00", INTERVAL ' . (int) $nb_day_new_product . ' DAY)) > 0 AS new,
					stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity' . (Combination::isFeatureActive() ? ', product_attribute_shop.minimal_quantity AS product_attribute_minimal_quantity' : '') . '
				FROM ' . _DB_PREFIX_ . 'cat_filter_restriction cp
				LEFT JOIN `' . _DB_PREFIX_ . 'product` p ON p.`id_product` = cp.`id_product`
				' . Shop::addSqlAssociation('product', 'p') .
                        (Combination::isFeatureActive() ?
                        ' LEFT JOIN `' . _DB_PREFIX_ . 'product_attribute_shop` product_attribute_shop
					ON (p.`id_product` = product_attribute_shop.`id_product` AND product_attribute_shop.`default_on` = 1 AND product_attribute_shop.id_shop=' . (int) $context->shop->id . ')' : '') . '
				LEFT JOIN ' . _DB_PREFIX_ . 'product_lang pl ON (pl.id_product = p.id_product' . Shop::addSqlRestrictionOnLang('pl') . ' AND pl.id_lang = ' . (int) $cookie->id_lang . ')
				LEFT JOIN `' . _DB_PREFIX_ . 'image_shop` image_shop
					ON (image_shop.`id_product` = p.`id_product` AND image_shop.cover=1 AND image_shop.id_shop=' . (int) $context->shop->id . ')
				LEFT JOIN `' . _DB_PREFIX_ . 'image_lang` il ON (image_shop.`id_image` = il.`id_image` AND il.`id_lang` = ' . (int) $cookie->id_lang . ')
				LEFT JOIN ' . _DB_PREFIX_ . 'manufacturer m ON (m.id_manufacturer = p.id_manufacturer)
				' . Product::sqlStock('p', 0) . '
				WHERE ' . $alias_where . '.`active` = 1 AND ' . $alias_where . '.`visibility` IN ("both", "catalog")
				ORDER BY ' . Tools::getProductsOrder('by', Tools::getValue('orderby'), true) . ' ' . Tools::getProductsOrder('way', Tools::getValue('orderway')) . ' , cp.id_product' .
                        ' LIMIT ' . (((int) $this->page - 1) * $n . ',' . $n), true, false);
            } else {
                $this->products = Db::getInstance()->executeS('
				SELECT
					p.*,
					' . ($alias_where == 'p' ? '' : 'product_shop.*,' ) . '
					' . $alias_where . '.id_category_default,
					pl.*,
					MAX(image_shop.`id_image`) id_image,
					il.legend,
					m.name manufacturer_name,
					' . (Combination::isFeatureActive() ? 'MAX(product_attribute_shop.id_product_attribute) id_product_attribute,' : '') . '
					DATEDIFF(' . $alias_where . '.`date_add`, DATE_SUB("' . date('Y-m-d') . ' 00:00:00", INTERVAL ' . (int) $nb_day_new_product . ' DAY)) > 0 AS new,
					stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity' . (Combination::isFeatureActive() ? ', MAX(product_attribute_shop.minimal_quantity) AS product_attribute_minimal_quantity' : '') . '
				FROM ' . _DB_PREFIX_ . 'cat_filter_restriction cp
				LEFT JOIN `' . _DB_PREFIX_ . 'product` p ON p.`id_product` = cp.`id_product`
				' . Shop::addSqlAssociation('product', 'p') .
                        (Combination::isFeatureActive() ?
                        'LEFT JOIN `' . _DB_PREFIX_ . 'product_attribute` pa ON (p.`id_product` = pa.`id_product`)
				' . Shop::addSqlAssociation('product_attribute', 'pa', false, 'product_attribute_shop.`default_on` = 1 AND product_attribute_shop.id_shop=' . (int) $context->shop->id) : '') . '
				LEFT JOIN ' . _DB_PREFIX_ . 'product_lang pl ON (pl.id_product = p.id_product' . Shop::addSqlRestrictionOnLang('pl') . ' AND pl.id_lang = ' . (int) $cookie->id_lang . ')
				LEFT JOIN `' . _DB_PREFIX_ . 'image` i  ON (i.`id_product` = p.`id_product`)' .
                        Shop::addSqlAssociation('image', 'i', false, 'image_shop.cover=1') . '
				LEFT JOIN `' . _DB_PREFIX_ . 'image_lang` il ON (image_shop.`id_image` = il.`id_image` AND il.`id_lang` = ' . (int) $cookie->id_lang . ')
				LEFT JOIN ' . _DB_PREFIX_ . 'manufacturer m ON (m.id_manufacturer = p.id_manufacturer)
				' . Product::sqlStock('p', 0) . '
				WHERE ' . $alias_where . '.`active` = 1 AND ' . $alias_where . '.`visibility` IN ("both", "catalog")
				GROUP BY product_shop.id_product
				ORDER BY ' . Tools::getProductsOrder('by', Tools::getValue('orderby'), true) . ' ' . Tools::getProductsOrder('way', Tools::getValue('orderway')) . ' , cp.id_product' .
                        ' LIMIT ' . (((int) $this->page - 1) * $n . ',' . $n), true, false);
            }
        }

        if (Tools::getProductsOrder('by', Tools::getValue('orderby'), true) == 'p.price')
            Tools::orderbyPrice($this->products, Tools::getProductsOrder('way', Tools::getValue('orderway')));

        return $this->products;
    }

Est-ce que la modif ne serait pas à faire ici ?

Share this post


Link to post
Share on other sites

J'ai vu ça :)

Je sêche sinon un peu. J'ai essayé enlever ces ' LIMIT ' en essayant retourner les résultats en array_slice (me suis inspiré de ta modif précédente) mais je ne dois pas faire ça correctement...

Share this post


Link to post
Share on other sites

J'ai je crois réussi :); J'ai supprimé les ' LIMIT ' et retourné le tout en array_slice...

Je ne sais pas si c'est super propre, voici mes modif :

if (version_compare(_PS_VERSION_, '1.6.1', '>=') === true) {
                $this->products = Db::getInstance()->executeS('
				SELECT
					p.*,
					' . ($alias_where == 'p' ? '' : 'product_shop.*,' ) . '
					' . $alias_where . '.id_category_default,
					pl.*,
					image_shop.`id_image` id_image,
					il.legend,
					m.name manufacturer_name,
					' . (Combination::isFeatureActive() ? 'product_attribute_shop.id_product_attribute id_product_attribute,' : '') . '
					DATEDIFF(' . $alias_where . '.`date_add`, DATE_SUB("' . date('Y-m-d') . ' 00:00:00", INTERVAL ' . (int) $nb_day_new_product . ' DAY)) > 0 AS new,
					stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity' . (Combination::isFeatureActive() ? ', product_attribute_shop.minimal_quantity AS product_attribute_minimal_quantity' : '') . '
				FROM ' . _DB_PREFIX_ . 'cat_filter_restriction cp
				LEFT JOIN `' . _DB_PREFIX_ . 'product` p ON p.`id_product` = cp.`id_product`
				' . Shop::addSqlAssociation('product', 'p') .
                        (Combination::isFeatureActive() ?
                        ' LEFT JOIN `' . _DB_PREFIX_ . 'product_attribute_shop` product_attribute_shop
					ON (p.`id_product` = product_attribute_shop.`id_product` AND product_attribute_shop.`default_on` = 1 AND product_attribute_shop.id_shop=' . (int) $context->shop->id . ')' : '') . '
				LEFT JOIN ' . _DB_PREFIX_ . 'product_lang pl ON (pl.id_product = p.id_product' . Shop::addSqlRestrictionOnLang('pl') . ' AND pl.id_lang = ' . (int) $cookie->id_lang . ')
				LEFT JOIN `' . _DB_PREFIX_ . 'image_shop` image_shop
					ON (image_shop.`id_product` = p.`id_product` AND image_shop.cover=1 AND image_shop.id_shop=' . (int) $context->shop->id . ')
				LEFT JOIN `' . _DB_PREFIX_ . 'image_lang` il ON (image_shop.`id_image` = il.`id_image` AND il.`id_lang` = ' . (int) $cookie->id_lang . ')
				LEFT JOIN ' . _DB_PREFIX_ . 'manufacturer m ON (m.id_manufacturer = p.id_manufacturer)
				' . Product::sqlStock('p', 0) . '
				WHERE ' . $alias_where . '.`active` = 1 AND ' . $alias_where . '.`visibility` IN ("both", "catalog")
				ORDER BY ' . Tools::getProductsOrder('by', Tools::getValue('orderby'), true) . ' ' . Tools::getProductsOrder('way', Tools::getValue('orderway')) . ' , cp.id_product', true, false);
            } else {
                $this->products = Db::getInstance()->executeS('
				SELECT
					p.*,
					' . ($alias_where == 'p' ? '' : 'product_shop.*,' ) . '
					' . $alias_where . '.id_category_default,
					pl.*,
					MAX(image_shop.`id_image`) id_image,
					il.legend,
					m.name manufacturer_name,
					' . (Combination::isFeatureActive() ? 'MAX(product_attribute_shop.id_product_attribute) id_product_attribute,' : '') . '
					DATEDIFF(' . $alias_where . '.`date_add`, DATE_SUB("' . date('Y-m-d') . ' 00:00:00", INTERVAL ' . (int) $nb_day_new_product . ' DAY)) > 0 AS new,
					stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity' . (Combination::isFeatureActive() ? ', MAX(product_attribute_shop.minimal_quantity) AS product_attribute_minimal_quantity' : '') . '
				FROM ' . _DB_PREFIX_ . 'cat_filter_restriction cp
				LEFT JOIN `' . _DB_PREFIX_ . 'product` p ON p.`id_product` = cp.`id_product`
				' . Shop::addSqlAssociation('product', 'p') .
                        (Combination::isFeatureActive() ?
                        'LEFT JOIN `' . _DB_PREFIX_ . 'product_attribute` pa ON (p.`id_product` = pa.`id_product`)
				' . Shop::addSqlAssociation('product_attribute', 'pa', false, 'product_attribute_shop.`default_on` = 1 AND product_attribute_shop.id_shop=' . (int) $context->shop->id) : '') . '
				LEFT JOIN ' . _DB_PREFIX_ . 'product_lang pl ON (pl.id_product = p.id_product' . Shop::addSqlRestrictionOnLang('pl') . ' AND pl.id_lang = ' . (int) $cookie->id_lang . ')
				LEFT JOIN `' . _DB_PREFIX_ . 'image` i  ON (i.`id_product` = p.`id_product`)' .
                        Shop::addSqlAssociation('image', 'i', false, 'image_shop.cover=1') . '
				LEFT JOIN `' . _DB_PREFIX_ . 'image_lang` il ON (image_shop.`id_image` = il.`id_image` AND il.`id_lang` = ' . (int) $cookie->id_lang . ')
				LEFT JOIN ' . _DB_PREFIX_ . 'manufacturer m ON (m.id_manufacturer = p.id_manufacturer)
				' . Product::sqlStock('p', 0) . '
				WHERE ' . $alias_where . '.`active` = 1 AND ' . $alias_where . '.`visibility` IN ("both", "catalog")
				GROUP BY product_shop.id_product
				ORDER BY ' . Tools::getProductsOrder('by', Tools::getValue('orderby'), true) . ' ' . Tools::getProductsOrder('way', Tools::getValue('orderway')) . ' , cp.id_product', true, false);
            }
        }

        if (Tools::getProductsOrder('by', Tools::getValue('orderby'), true) == 'p.price')
            Tools::orderbyPrice($this->products, Tools::getProductsOrder('way', Tools::getValue('orderway')));

        $result = array_slice($this->products, (((int) $this->page - 1) * $n), $n);

        return $result;
    }

 

Share this post


Link to post
Share on other sites

Par contre je n'arrive pas à mettre la modification en override, j'ai ce warning : "Undefined property: BlockLayeredOverride::$page in .local\override\modules\blocklayered\blocklayered.php pour la ligne :

$result = array_slice($this->products, (((int) $this->page - 1) * $n), $n);

Une idée ?

Share this post


Link to post
Share on other sites

Par contre je n'arrive pas à mettre la modification en override, j'ai ce warning : "Undefined property: BlockLayeredOverride::$page in .local\override\modules\blocklayered\blocklayered.php pour la ligne :

$result = array_slice($this->products, (((int) $this->page - 1) * $n), $n);

Une idée ?

 

À priori ça viendrait des variables 

private $products;
    private $nbr_products;
    private $page = 1;

En les passant en public l'override fonctionne... Quand je les déclare dans mon override ça ne marche plus...

Est-ce qu'il y a une solution afin d'utiliser ces variables dans mon override ?

Merci

Share this post


Link to post
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...

Important Information

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