Jump to content

[RISOLTO] - price-drop.php - Rapporto numero pagine/numero prodotti dopo restrizione sulle percentuali di sconto


xhaxhi_eli

Recommended Posts

Ciao ragazzi.

Ho modificato le chiamate al database per il blocco Offerte (1 per il singolo prodotto, 1 per tutti i prodotti) e il modulo sembra funzionare bene alla limitazione.
Il problema nasce quando clicco su "Tutte le offerte". Mi dice che ci sono 12 pagine contenenti i prodotti, quando la ricerca restituisce solo 16 prodotti (2 pagine). Le altre pagine vengono visualizzate con l'errore "Nessuna offerta"
Le 12 pagine sarebbero corrette senza la limitazione che ho inserito io.

Ce qualche possibilità che ci sia della cache da qualche parte? Se si, come la posso svuotare?

Grazie

Ps: Le modifiche alle chiamate al database consistono nella sostituzione dei valori " > 0 " in quelli voluti nelle clausole WHERE 'reduction_price' e 'reduction_percent' (mi pare si chiamino cosi) ... nient'altro è stato cambiato.

Link to comment
Share on other sites

Ciao,
se non ci dici che file hai modificato e esattamente le pagine dove hai errore è difficile darti una risposta,
tieni presente che quando clicchi su tutte le offerte vai nella pagina price-drop.php la quale ha una chiamata ad una classe diversa per gli sconti....

Product::getPricesDrop

la quale fa il conto delle pagine.

Link to comment
Share on other sites

Ciao disarci.
Chiedo scusa per i non dettagli.

Cmq.
Spiego le 2 modifiche fatte:

Per il blocco offerte
Metodo Product::getRandomSpecial
riga 1043 da

WHERE (`reduction_price` > 0 OR `reduction_percent` > 0)


è diventata

WHERE (`reduction_price` > 2000 OR `reduction_percent` > 25)



Per price-drop.php (Tutte le offerte)
Metodo Product::getPricesDrop
riga 1113 la stessa identica modifica di sopra (che cmq copio)

WHERE (`reduction_price` > 0 OR `reduction_percent` > 0)


è diventata

WHERE (`reduction_price` > 2000 OR `reduction_percent` > 25)



Nessun altra modifica apportata.

EDIT:

Allora dando un occhiata al codice in price-drop.php intorno alla riga 7 c'è questa chiamata

$nbProducts = Product::getPricesDrop(intval($cookie->id_lang), NULL, NULL, true);


Facendo un echo mi restituisce il numero totale dei prodotti scontati (senza tener conto della restrizione fatta)
Tale variabile viene usata per il calcolo delle pagine.

"Problema" trovato
Quando viene fatta quella chiamata, l'argomento true è quello del count che devia la query su questo ramo

if ($count)
       {
           $sql = '
           SELECT COUNT(DISTINCT p.`id_product`) AS nb
           FROM `'._DB_PREFIX_.'product` p
           WHERE p.`active` = 1
           AND p.`id_product` IN (
               SELECT cp.`id_product`
               FROM `'._DB_PREFIX_.'category_group` cg
               LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`)
               WHERE cg.`id_group` '.(!$cookie->id_customer ?  '= 1' : 'IN (SELECT id_group FROM '._DB_PREFIX_.'customer_group WHERE id_customer = '.intval($cookie->id_customer).')').'
           )';
           $result = Db::getInstance()->getRow($sql);
           return intval($result['nb']);
       }



Appena trovo il modo di inserirci la restrizione posto la soluzione

EDIT 2: aggiungendolo proprio brutalmente alla query esterna il problema sembra risolto (almeno nel mio caso)

if ($count)
       {
           $sql = '
           SELECT COUNT(DISTINCT p.`id_product`) AS nb
           FROM `'._DB_PREFIX_.'product` p
           WHERE p.`active` = 1
           AND (`reduction_price` > 2000 OR `reduction_percent` > 25)
           AND p.`id_product` IN (
               SELECT cp.`id_product`
               FROM `'._DB_PREFIX_.'category_group` cg
               LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`)
               WHERE cg.`id_group` '.(!$cookie->id_customer ?  '= 1' : 'IN (SELECT id_group FROM '._DB_PREFIX_.'customer_group WHERE id_customer = '.intval($cookie->id_customer).')').'
           )';
           $result = Db::getInstance()->getRow($sql);
           return intval($result['nb']);
       }

Link to comment
Share on other sites

  • 3 weeks later...

Devi semplicemente modificare il metodo getPricesDrop su classes/Product.php

Il codice ho cercato di spiegarlo su (ci sono solo un paio di modifiche non di piu. Ti allego cmq il metodo modificato.
Prova a vedere cosa c'è di diverso da quello originale

   static public function getPricesDrop($id_lang, $pageNumber = 0, $nbProducts = 10, $count = false, $orderBy = NULL, $orderWay = NULL, $beginning = false, $ending = false)
   {
       global $link, $cookie;
       if (!Validate::isBool($count))
           die(Tools::displayError());

       if ($pageNumber < 0) $pageNumber = 0;
       if ($nbProducts < 1) $nbProducts = 10;
       if (empty($orderBy) || $orderBy == 'position') $orderBy = 'myprice';
       if (empty($orderWay)) $orderWay = 'DESC';
       if ($orderBy == 'id_product' OR $orderBy == 'price' OR $orderBy == 'date_add')
           $orderByPrefix = 'p';
       elseif ($orderBy == 'name')
           $orderByPrefix = 'pl';
       if (!Validate::isOrderBy($orderBy) OR !Validate::isOrderWay($orderWay))
           die (Tools::displayError());

       if ($count)
       {
           $sql = '
           SELECT COUNT(DISTINCT p.`id_product`) AS nb
           FROM `'._DB_PREFIX_.'product` p
           WHERE p.`active` = 1
           AND (`reduction_price` > '.intval(2000).' OR `reduction_percent` > '.intval(25).')
           AND p.`id_product` IN (
               SELECT cp.`id_product`
               FROM `'._DB_PREFIX_.'category_group` cg
               LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`)
               WHERE cg.`id_group` '.(!$cookie->id_customer ?  '= 1' : 'IN (SELECT id_group FROM '._DB_PREFIX_.'customer_group WHERE id_customer = '.intval($cookie->id_customer).')').'
           )';
           $result = Db::getInstance()->getRow($sql);
           return intval($result['nb']);
       }
       $currentDate = date('Y-m-d');
       $sql = '
       SELECT p.*, pl.`description`, pl.`description_short`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, p.`ean13`, i.`id_image`, il.`legend`, t.`rate`, (p.`reduction_price` + (p.`reduction_percent` * p.`price`)) AS myprice, m.`name` AS manufacturer_name
       FROM `'._DB_PREFIX_.'product` p
       LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.intval($id_lang).')
       LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1)
       LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.intval($id_lang).')
       LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = p.`id_tax`)
       LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON (m.`id_manufacturer` = p.`id_manufacturer`)
       WHERE (`reduction_price` > '.intval(2000).' OR `reduction_percent` > '.intval(25).')
       '.((!$beginning AND !$ending) ?
           'AND (`reduction_from` = `reduction_to` OR (`reduction_from` <= \''.pSQL($currentDate).'\' AND `reduction_to` >= \''.pSQL($currentDate).'\'))'
       :
           ($beginning ? 'AND `reduction_from` <= \''.pSQL($beginning).'\'' : '').($ending ? 'AND `reduction_to` >= \''.pSQL($ending).'\'' : '')).'
       AND p.`active` = 1
       AND p.`id_product` IN (
           SELECT cp.`id_product`
           FROM `'._DB_PREFIX_.'category_group` cg
           LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`)
           WHERE cg.`id_group` '.(!$cookie->id_customer ?  '= 1' : 'IN (SELECT id_group FROM '._DB_PREFIX_.'customer_group WHERE id_customer = '.intval($cookie->id_customer).')').'
       )
       ORDER BY '.(isset($orderByPrefix) ? pSQL($orderByPrefix).'.' : '').'`'.pSQL($orderBy).'`'.' '.pSQL($orderWay).'
       LIMIT '.intval($pageNumber * $nbProducts).', '.intval($nbProducts);
       $result = Db::getInstance()->ExecuteS($sql);
       if($orderBy == 'price')
       {
           Tools::orderbyPrice($result,$orderWay);
       }
       if (!$result)
           return false;
       return Product::getProductsProperties($id_lang, $result);
   }

Link to comment
Share on other sites

Il codice modificato, è specifico per il mio caso.
Mi sono completamento scordato del dettaglio :)

Allora, se conti le righe del metodo

riga 24:
           AND (`reduction_price` > '.intval(2000).' OR `reduction_percent` > '.intval(25).')
riga 43:
       WHERE (`reduction_price` > '.intval(2000).' OR `reduction_percent` > '.intval(25).')


modifica i due valori. 2000 sta per 2000 euro di sconto
il 25 sta per 25% di sconto

Link to comment
Share on other sites

  • 1 year later...

Le modifiche segnalate non sembrano più valide con la version 1.4...

Ho risolto aggiungendo la seguente condizione:

AND p.`id_product` IN (
           SELECT sp.`id_product`
           FROM `'._DB_PREFIX_.'specific_price` sp
           WHERE sp.`reduction` > '.floatval(0.25).'
       )



per avere, ad esempio, la sezione speciali filtrata per gli sconti superiori al 25%...

  • Like 1
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...