Jump to content

Erreur de pagination dans l'ordre de prix des produits


jat

Recommended Posts

Bonjour à tous, j'ai un problème avec l'ordre des prix, dans la pagination des produits.


Par exemple, lorsqu'il est par prix croissant, à la deuxième page, il ne continue pas avec la dernière de la première page.
(Si le dernier produit sur la première page est 1 262, le premier produit sur la deuxième page est 697.)

J'ai vu qu'il est nécessaire de modifier Category.php dans /classes/.

Par exemple, j'ai ajouté ceci dans un if orderprice et n'a rien fait

if ($order_by == 'orderprice'){
	Tools::orderbyPrice($result, $order_way);
	// ajouté pour la pagination
	$result = array_slice($result, (((int)$p - 1) * (int)$n), (int)$n);
	//end
}

Version de prestashop: 1.7.6.7
Theme: StarterThme modifié https://github.com/PrestaShop/StarterTheme/

Ma configuration actuelle dans /classes/Category.php

/* Return only the number of products */ // line 965
if ($getTotal) {
    $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' : '') .
        ($idSupplier ? ' AND p.id_supplier = ' . (int) $idSupplier : '');

    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 */
$orderyBy = Validate::isOrderBy($orderyBy) ? Tools::strtolower($orderyBy) : 'position';
$orderWay = Validate::isOrderWay($orderWay) ? Tools::strtoupper($orderWay) : 'ASC';

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

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

$nbDaysNewProduct = Configuration::get('PS_NB_DAYS_NEW_PRODUCT');
if (!Validate::isUnsignedInt($nbDaysNewProduct)) {
    $nbDaysNewProduct = 20;
}

$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) $nbDaysNewProduct . ' 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) $idLang . Shop::addSqlRestrictionOnLang('cl') . ')
		LEFT JOIN `' . _DB_PREFIX_ . 'product_lang` pl
			ON (p.`id_product` = pl.`id_product`
			AND pl.`id_lang` = ' . (int) $idLang . 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) $idLang . ')
		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")' : '')
            . ($idSupplier ? ' AND p.id_supplier = ' . (int) $idSupplier : '');

if ($random === true) {
    $sql .= ' ORDER BY RAND() LIMIT ' . (int) $randomNumberProducts;
} else {
    $sql .= ' ORDER BY ' . (!empty($orderByPrefix) ? $orderByPrefix . '.' : '') . '`' . bqSQL($orderyBy) . '` ' . pSQL($orderWay) . '
	LIMIT ' . (((int) $p - 1) * (int) $n) . ',' . (int) $n;
}

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

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

if ($orderyBy == 'orderprice') {
    Tools::orderbyPrice($result, $orderWay);
}

// Modify SQL result
return Product::getProductsProperties($idLang, $result); // line 1058

Merci beaucoup de votre aide.

 

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