Jump to content

Problema de paginacion por orden de precio


jat

Recommended Posts

Hola a tod@s tengo un problema de con el orden de precio en la paginación de productos.


Por ejemplo cuando está ordenado por precio ascendente, en la segunda página no continua con el ultimo de la primera página.
(Es decir si el último producto de la primera página es de 1.262€, el primer producto de la segunda página es de 697€. no continua con el orden de precio)

He visto en que es necesario modificar Category.php dentro de /classes/.

Por ejemplo he añadido esto dentro de un if orderprice y no hace nada

if ($order_by == 'orderprice'){
	Tools::orderbyPrice($result, $order_way);
	//añadido para la paginación
	$result = array_slice($result, (((int)$p - 1) * (int)$n), (int)$n);
	//end
}

Version Prestashop: 1.7.6.7
Theme: StarterThme modificado https://github.com/PrestaShop/StarterTheme/

Mi configuración actual dentro de /classes/Category.php

/* Return only the number of products */ // línea 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); // línea 1058

Muchas gracias de antemano por vuestra ayuda

 

 

 

Link to comment
Share on other sites

  • 2 months later...
Il y a 1 heure, vllopico a dit :

Hola Jat, ¿has podido solucionar el problema? Estoy terminando la configuración de mi tienda, y tengo el mismo problema? Gracias.

Hola @vllopico no, sigo en ello cuando tengo algo de tiempo.

Me queda por mirar si ha cambiado algo en las versiones posteriores de la 1.7.6.7

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...