fifidj75 Posted April 17, 2013 Share Posted April 17, 2013 Bonjour, J'ai une boutique sous PS 1.4.9 et une boutique sous PS 1.5.4. J'ai le même produit avec des déclinaisons sur lequel j'ai appliqué un prix spécifique dépendant de la quantité. Sur la boutique PS 1.4.9, le prix spécifique s'applique sur le nombre total de produits mis dans le panier quel que soit la déclinaison. Sur la boutique PS 1.5.4, le prix spécifique s'applique de façon indépendante sur chaque déclinaison de produit. Je souhaiterais que ma boutique PS 1.5.4 fonctionne sur ce point de la même façon que la 1.4.9. J'ai bien vu dans Préférences Produits qu'on pouvait spécifier : Remises des quantités basées sur : Produits ou Déclinaisons mais le résultat est le même. Est-ce un bug , est-ce qu'il y a quelque chose qui m'échappe ? Si ce n'est pas clair, je peux donner un exemple si besoin. Merci d'avance. Link to comment Share on other sites More sharing options...
fifidj75 Posted April 17, 2013 Author Share Posted April 17, 2013 C'est très très embêtant pour ma boutique donc très simplement si quelqu'un peut faire le test suivant sous 1.5.4 : Dans le back office : 1) créer un produit à 100€ avec 2 déclinaisons A et B qui ne jouent pas sur le prix 2) créer un prix spécifique 50€ à partir de 10 produits achetés En front office : Mettre dans le panier 5 produits avec déclinaison A et 5 produits avec déclinaison B Dans mon cas, le produit reste à 100€ alors que je souhaiterais bien entendu qu'il passe à 50€. Merci si vous avez une idée sinon je passe ça en bug car ça fonctionnait très bien en 1.4.9. Link to comment Share on other sites More sharing options...
Frédéric D. Posted April 22, 2013 Share Posted April 22, 2013 Bonjour FIFIDJ75, Avez-vous réussi à vous sortir de ce bug? Je rencontre exactement le même sans trouver de piste pour le résoudre.... Merci à la bonne âme qui passera par ici ! Fred Link to comment Share on other sites More sharing options...
fifidj75 Posted April 23, 2013 Author Share Posted April 23, 2013 Non, à ma grande surprise personne n'a répondu sur le forum alors que le bug est reproductible et que le souci est partiellement identifié. Je ne suis pas du tout développeur donc impossible de corriger le bug qui n'est peut être pas quelque chose de très complexe mais à vrai dire je n'en sais rien. Je ne suis pas très doué en anglais mais je vais tâcher d'ajouter le problème dans le bug tracker. Pour contourner le problème, même si ce n'est pas satisfaisant j'ai utilisé l'onglet règles panier qui permet de générer des codes promo que l'on peut directement intégrer dans le panier. Au passage, même si je suis déçu de ne pas avoir eu de réponse de la team prestashop, je les félicite tout de même pour cette version 1.5.4 qui présente des avancées très intéressantes par rapport à la 1.4.9. Link to comment Share on other sites More sharing options...
Myjazz Posted April 29, 2013 Share Posted April 29, 2013 Bonjour, Je suis en 1.5.4.0 et je pense faire face au même souci : je dois mettre en vente des gels douche de 3 parfums différents, avec un prix unitaire + un prix pour un lot de 3, quelle que soit la combinaison de parfums. J'avais repéré la fonction "déclinaisons" pour arriver à mes fins mais au final, si on commande 3 parfums (déclinisons) différentes, le prix unitaire est appliqué 3 fois. On n'obtient le prix du lot de 3 que si on met en panier 3 fois la même déclinaison. Personne n'aurait une piste pour résoudre ce problème ? Link to comment Share on other sites More sharing options...
Bondaty and Co Posted April 29, 2013 Share Posted April 29, 2013 Topic déplacé section configuration Link to comment Share on other sites More sharing options...
olea Posted April 29, 2013 Share Posted April 29, 2013 Oui, c'est un bug que j'ai ouvert ici :http://forge.prestashop.com/browse/PSCFV-8186 Pour la correction, fichier /classes/SpecificPrice.php, dans la methode getPricePrice(), remplacer $quantity par $real_quantity dans la requete AND IF(`from_quantity` > 1, `from_quantity`, 0) <= IF(id_product_attribute=0,'.(int)$quantity.' ,'.(int)$real_quantity.')' : 'AND `from_quantity` <= ' Pour obtenir AND IF(`from_quantity` > 1, `from_quantity`, 0) <= IF(id_product_attribute=0,'.(int)$real_quantity.' ,'.(int)$real_quantity.')' : 'AND `from_quantity` <= ' Link to comment Share on other sites More sharing options...
Myjazz Posted April 29, 2013 Share Posted April 29, 2013 bon, ben j'ai pas de bol, ça marche toujours pas... j'ai eu un espoir en lisant votre post sur forge : j'avais laissé "remises des quantités basées sur" à "produits", mais même en mettant "déclinaisons", ça ne fonctionne toujours pas correctement :-( Link to comment Share on other sites More sharing options...
olea Posted April 29, 2013 Share Posted April 29, 2013 Le report de bug a été fait sur la 1.5.3. En 1.5.4.1, une modification du coeur fait que les quantités par produit ne fonctionnent pas, même avec la modification suggérée ci dessus. Donc jusqu'à 1.5.4.0, appliquer la modification ci-dessus. Pour 1.5.4.1, modif à faire dans le fichier /classes/Product.php, methode getPriceStatic(), il faut supprimer une ligne dans le block suivant : $cart_quantity = 0; if ((int)$id_cart) { $condition = ''; $cache_name = (int)$id_cart.'_'.(int)$id_product.'_'.(int)$id_product_attribute; if (!isset(self::$_cart_quantity[$cache_name]) || self::$_cart_quantity[$cache_name] != (int)$quantity) self::$_cart_quantity[$cache_name] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' SELECT SUM(`quantity`) FROM `'._DB_PREFIX_.'cart_product` WHERE `id_product` = '.(int)$id_product.' [color=#ff0000]AND `id_product_attribute` = '.(int)$id_product_attribute.'[/color] AND `id_cart` = '.(int)$id_cart); $cart_quantity = self::$_cart_quantity[$cache_name]; } pour obtenir : $cart_quantity = 0; if ((int)$id_cart) { $condition = ''; $cache_name = (int)$id_cart.'_'.(int)$id_product.'_'.(int)$id_product_attribute; if (!isset(self::$_cart_quantity[$cache_name]) || self::$_cart_quantity[$cache_name] != (int)$quantity) self::$_cart_quantity[$cache_name] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' SELECT SUM(`quantity`) FROM `'._DB_PREFIX_.'cart_product` WHERE `id_product` = '.(int)$id_product.' AND `id_cart` = '.(int)$id_cart); $cart_quantity = self::$_cart_quantity[$cache_name]; } Link to comment Share on other sites More sharing options...
Myjazz Posted April 29, 2013 Share Posted April 29, 2013 je suis pourtant en 1.5.4.0... je vais tenter la maj en 1.5.4.1 puis le patch. merci. Link to comment Share on other sites More sharing options...
olea Posted April 29, 2013 Share Posted April 29, 2013 Bug corrigé par la Team sur la Forge, merci Rémi http://forge.prestashop.com/browse/PSCFV-8186 Link to comment Share on other sites More sharing options...
vins Posted May 6, 2013 Share Posted May 6, 2013 (edited) BOnjour, Je suis en 1.5.4.1 et je rencontre encore le problème même en ayant appliquer le patch de la Forge (http://forge.prestas...owse/PSCFV-8186) Ce qui est curieux, c'est qu'il semble y avoir un pb de cache qq part, ça marche... puis on remplit un panier... ça marche plus... c bizare.. ça fait 4 heures que je suis la dessus... Ce code me renvoit toujours le prix en qté 1 ! : $idProduct=82; $product=new Product($idProduct,2); $idProductAttribute=$product->getDefaultAttribute($idProduct); $qty=1000; $unitWithoutTaxesPrice=Product::getPriceStatic( $idProduct, false, $idProductAttribute, 2, null, false, true, $qty, false, null, null, null, $specific_price, true, true, Context::getContext() ); echo $unitWithoutTaxesPrice; Help ? VIns; Edited May 6, 2013 by vins (see edit history) Link to comment Share on other sites More sharing options...
vins Posted May 7, 2013 Share Posted May 7, 2013 Suite à mon dernier message je viens de réussir à reproduire le bug... Le code précédemment cité : $idProduct=82; $product=new Product($idProduct,2); $idProductAttribute=$product->getDefaultAttribute($idProduct); $qty=1000; $unitWithoutTaxesPrice=Product::getPriceStatic( $idProduct, false, $idProductAttribute, 2, null, false, true, $qty, false, null, null, null, $specific_price, true, true, Context::getContext() ); echo $unitWithoutTaxesPrice; fonctionne si et seulement si on est logué sur le site ! A noter que j'ai corrigé la fonction getPriceStatic() dans Product.php suivant le bugTracker. Quelqu'un a t-il une idée ? Link to comment Share on other sites More sharing options...
fifidj75 Posted May 10, 2013 Author Share Posted May 10, 2013 Pas d'idée. Je suis sous 1.5.4 et la correction proposée dans la forge semble avoir fonctionné avec moi... Link to comment Share on other sites More sharing options...
mephistom Posted May 14, 2013 Share Posted May 14, 2013 En effet... si on applique l'une ou l'autre des solutions, ça ne fonctionne pas. Il faut appliquer les deux. Je suis en 1.5.4 et voici ce que j'ai modifié : -> Dans classes/SpecificPrice.php > function getSpecificPrice() Remplacer l'avant dernière ligne de la requète SQL par : (($real_quantity != 0 && !Configuration::get('PS_QTY_DISCOUNT_ON_COMBINATION')) ? ' AND IF(`from_quantity` > 1, `from_quantity`, 0) <= IF(id_product_attribute=0,'.(int)$quantity.' ,'.(int)$real_quantity.')' : 'AND `from_quantity` <= '.(int)$quantity).' -> Dans classes/Product.php > function getPriceStatic() Dans la première requête SQL que vous voyez (vers lignes 2460/2470 environ) supprimez la condition "AND `id_product_attribute` = '.(int)$id_product_attribute.'" de la clause WHERE pour avoir donc : self::$_cart_quantity[$cache_name] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' SELECT SUM(`quantity`) FROM `'._DB_PREFIX_.'cart_product` WHERE `id_product` = '.(int)$id_product.' AND `id_cart` = '.(int)$id_cart); Et chez moi ça fonctionne nickel maintenant, connecté ou pas connecté ! 1 Link to comment Share on other sites More sharing options...
vins Posted May 16, 2013 Share Posted May 16, 2013 MErci Mephistom, Pour mon cas le problème était ailleurs. En fait, notre Presta a été upadaté récemment d'une version 1.3 à la 1.5.4.1 et dans la table SQL des prix dégressifs (ps_specific_price) les champs id_group étaient tous réglés à 1. Résultat, si tu n'étais pas logué, le prix dégressifs ne s'appliquait pas. Si qq rencontre le même soucis, il faut donc aller dans la table ps_specific_price et passer tous les 1 à 0 dans le colonne id_group. Vins. Link to comment Share on other sites More sharing options...
Squadra Unica Posted May 16, 2013 Share Posted May 16, 2013 Bonour, Je suis sous la version 1.5.4.1 et j'ai modifié les deux fichiers que Mephisto explique très bien et cela fonctionne Nickel. Merci Mephisto. 1 Link to comment Share on other sites More sharing options...
karopresta Posted May 29, 2013 Share Posted May 29, 2013 Un peu dans le même style mais différent : dans le back office "aucun" prix spécifique de déclaré et pourtant s'affichent dans certains produits. Je suis allée dans la table ps_specific_price et j'ai supprimé les 10 lignes de prix spécifiques. Petite info au passage, les prix "spécifiques" s'affichent en prix "dégressifs" dans le front. Link to comment Share on other sites More sharing options...
Auriga Posted August 24, 2013 Share Posted August 24, 2013 (edited) Bonjour je reviens sur ce post, apres avoir installer le module a jour FO Quantity price d'Olea pour mon PS 1.5.4.1 je vois dans les parametres du modules les modifications a faire en cas de prix identique Suivant version de Prestashop, il se peut que les prix par quantité dans les tables de déclinaisons du Front-Office soient tous identiques.Il est reporté ici : http://www.prestasho...ost__p__1204700 Pour le corriger : - Ouvrez le fichier /classes/SpecificPrice.php - Cherchez la ligne suivant dans la méthode getSpecificPrices() : (($real_quantity != 0 && !Configuration::get('PS_QTY_DISCOUNT_ON_COMBINATION')) ? ' AND IF(`from_quantity` > 1, `from_quantity`, 0) <= IF(id_product_attribute=0,'.(int)$quantity.' ,'.(int)$real_quantity.')' : 'AND `from_quantity` <= '.(int)$real_quantity).' - Modifiez-la en remplaçant le $quantity par $real_quantity (($real_quantity != 0 && !Configuration::get('PS_QTY_DISCOUNT_ON_COMBINATION')) ? ' AND IF(`from_quantity` > 1, `from_quantity`, 0) <= IF(id_product_attribute=0,'.(int)/*$quantity*/ ((int)$id_cart ? (int)$quantity : (int)$real_quantity ).' ,'.(int)$real_quantity.')' : 'AND `from_quantity` <= '.(int)$real_quantity).' j'applique les 2 modifications et j'obtiens une belle erreur 500 bien sur en bon bourrin, je n'est pas fais de sauvegarde du fichier original, donc pas de retour en arriere je decide d'appliquer les modifications de Mephistom (15) et celle de rGaillard mais sans succés comment puis je retrouver les fichiers d'origines classes/SpecificPrice.php classes/Product.php le probleme n'est pas de resoudre le bug, mais de remettre mon site en ligne Merci a tous Edited August 24, 2013 by Auriga (see edit history) Link to comment Share on other sites More sharing options...
karopresta Posted August 24, 2013 Share Posted August 24, 2013 Bonsoir, Je pense qu'en installant un prestashop en local comme un tout nouveau site, vous pourrez récupérer ces deux fichiers d'origine. (mais faites une sauvegarde avant de vos deux fichiers, même s'ils ne marchent pas). Link to comment Share on other sites More sharing options...
Auriga Posted August 26, 2013 Share Posted August 26, 2013 oui j'ai re-installer un PS en local et recuperer les 2 fichiers Olea ma donner un coup de main pour finir de parametrer son module Link to comment Share on other sites More sharing options...
akhawat Posted December 18, 2013 Share Posted December 18, 2013 En effet... si on applique l'une ou l'autre des solutions, ça ne fonctionne pas. Il faut appliquer les deux. Je suis en 1.5.4 et voici ce que j'ai modifié : -> Dans classes/SpecificPrice.php > function getSpecificPrice() Remplacer l'avant dernière ligne de la requète SQL par : (($real_quantity != 0 && !Configuration::get('PS_QTY_DISCOUNT_ON_COMBINATION')) ? ' AND IF(`from_quantity` > 1, `from_quantity`, 0) <= IF(id_product_attribute=0,'.(int)$quantity.' ,'.(int)$real_quantity.')' : 'AND `from_quantity` <= '.(int)$quantity).' -> Dans classes/Product.php > function getPriceStatic() Dans la première requête SQL que vous voyez (vers lignes 2460/2470 environ) supprimez la condition "AND `id_product_attribute` = '.(int)$id_product_attribute.'" de la clause WHERE pour avoir donc : self::$_cart_quantity[$cache_name] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' SELECT SUM(`quantity`) FROM `'._DB_PREFIX_.'cart_product` WHERE `id_product` = '.(int)$id_product.' AND `id_cart` = '.(int)$id_cart); Et chez moi ça fonctionne nickel maintenant, connecté ou pas connecté ! Bonjour je suis en 1.5.6.1 et j'ais également le problème de remise quantité qui n'est pas prix en compte. j'ais bien lu le post mais n'étant pas très qualifié je ne sais pas comment déterminer l'avant dernière ligne de la requête sql. pourriez vous m'aider à la déterminer. j'aimerais essayer cette solution en éspèrant que cela résolve mon problème et que je puisse enfin appliqué des tarifs degressifs merci par avance cdlt Link to comment Share on other sites More sharing options...
akhawat Posted December 28, 2013 Share Posted December 28, 2013 up personne pour m'aiguiller ? please Link to comment Share on other sites More sharing options...
karopresta Posted December 31, 2013 Share Posted December 31, 2013 Bonjour je suis en 1.5.6.1 et j'ais également le problème de remise quantité qui n'est pas prix en compte. j'ais bien lu le post mais n'étant pas très qualifié je ne sais pas comment déterminer l'avant dernière ligne de la requête sql. pourriez vous m'aider à la déterminer. j'aimerais essayer cette solution en éspèrant que cela résolve mon problème et que je puisse enfin appliqué des tarifs degressifs merci par avance cdlt Bonjour, Peux-tu mettre ici ta requête complète pour voir ce qu'il faut modifier ? Link to comment Share on other sites More sharing options...
akhawat Posted December 31, 2013 Share Posted December 31, 2013 classe/specific price <?php/** 2007-2013 PrestaShop** NOTICE OF LICENSE** This source file is subject to the Open Software License (OSL 3.0)* that is bundled with this package in the file LICENSE.txt.* It is also available through the world-wide-web at this URL:* http://opensource.org/licenses/osl-3.0.php* If you did not receive a copy of the license and are unable to* obtain it through the world-wide-web, please send an email* to [email protected] so we can send you a copy immediately.** DISCLAIMER** Do not edit or add to this file if you wish to upgrade PrestaShop to newer* versions in the future. If you wish to customize PrestaShop for your* needs please refer to http://www.prestashop.com for more information.** @author PrestaShop SA <[email protected]>* @copyright 2007-2013 PrestaShop SA* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)* International Registered Trademark & Property of PrestaShop SA*/class SpecificPriceCore extends ObjectModel{ public $id_product; public $id_specific_price_rule = 0; public $id_cart = 0; public $id_product_attribute; public $id_shop; public $id_shop_group; public $id_currency; public $id_country; public $id_group; public $id_customer; public $price; public $from_quantity; public $reduction; public $reduction_type; public $from; public $to; /** * @see ObjectModel::$definition */ public static $definition = array( 'table' => 'specific_price', 'primary' => 'id_specific_price', 'fields' => array( 'id_shop_group' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'id_shop' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), 'id_cart' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), 'id_product' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), 'id_product_attribute' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'id_currency' => array('type' => self::TYPE_INT, 'required' => true), 'id_specific_price_rule' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'id_country' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), 'id_group' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), 'id_customer' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), 'price' => array('type' => self::TYPE_FLOAT, 'validate' => 'isNegativePrice', 'required' => true), 'from_quantity' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt', 'required' => true), 'reduction' => array('type' => self::TYPE_FLOAT, 'validate' => 'isPrice', 'required' => true), 'reduction_type' => array('type' => self::TYPE_STRING, 'validate' => 'isReductionType', 'required' => true), 'from' => array('type' => self::TYPE_DATE, 'validate' => 'isDateFormat', 'required' => true), 'to' => array('type' => self::TYPE_DATE, 'validate' => 'isDateFormat', 'required' => true), ), ); protected $webserviceParameters = array( 'objectsNodeName' => 'specific_prices', 'objectNodeName' => 'specific_price', 'fields' => array( 'id_shop_group' => array('xlink_resource' => 'shop_groups'), 'id_shop' => array('xlink_resource' => 'shops', 'required' => true), 'id_cart' => array('xlink_resource' => 'carts', 'required' => true), 'id_product' => array('xlink_resource' => 'products', 'required' => true), 'id_product_attribute' => array('xlink_resource' => 'product_attributes'), 'id_currency' => array('xlink_resource' => 'currencies', 'required' => true), 'id_country' => array('xlink_resource' => 'countries', 'required' => true), 'id_group' => array('xlink_resource' => 'groups', 'required' => true), 'id_customer' => array('xlink_resource' => 'customers', 'required' => true), ), ); protected static $_specificPriceCache = array(); protected static $_cache_priorities = array(); public function add($autodate = true, $nullValues = false) { if (parent::add($autodate, $nullValues)) { // Flush cache when we adding a new specific price SpecificPrice::$_specificPriceCache = array(); Product::flushPriceCache(); // Set cache of feature detachable to true Configuration::updateGlobalValue('PS_SPECIFIC_PRICE_FEATURE_ACTIVE', '1'); return true; } return false; } public function update($null_values = false) { if (parent::update($null_values)) { // Flush cache when we updating a new specific price SpecificPrice::$_specificPriceCache = array(); Product::flushPriceCache(); return true; } return false; } public function delete() { if (parent::delete()) { // Flush cache when we deletind a new specific price SpecificPrice::$_specificPriceCache = array(); Product::flushPriceCache(); // Refresh cache of feature detachable Configuration::updateGlobalValue('PS_SPECIFIC_PRICE_FEATURE_ACTIVE', SpecificPrice::isCurrentlyUsed($this->def['table'])); return true; } return false; } public static function getByProductId($id_product, $id_product_attribute = false, $id_cart = false) { return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' SELECT * FROM `'._DB_PREFIX_.'specific_price` WHERE `id_product` = '.(int)$id_product. ($id_product_attribute ? ' AND id_product_attribute = '.(int)$id_product_attribute : '').' AND id_cart = '.(int)$id_cart); } public static function deleteByIdCart($id_cart, $id_product = false, $id_product_attribute = false) { return Db::getInstance()->execute(' DELETE FROM `'._DB_PREFIX_.'specific_price` WHERE id_cart='.(int)$id_cart. ($id_product ? ' AND id_product='.(int)$id_product.' AND id_product_attribute='.(int)$id_product_attribute : '')); } public static function getIdsByProductId($id_product, $id_product_attribute = false, $id_cart = 0) { return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' SELECT `id_specific_price` FROM `'._DB_PREFIX_.'specific_price` WHERE `id_product` = '.(int)$id_product.' AND id_product_attribute='.(int)$id_product_attribute.' AND id_cart='.(int)$id_cart); } /** * score generation for quantity discount */ protected static function _getScoreQuery($id_product, $id_shop, $id_currency, $id_country, $id_group, $id_customer) { $select = '('; $now = date('Y-m-d H:i:s'); $select .= ' IF (\''.$now.'\' >= `from` AND \''.$now.'\' <= `to`, '.pow(2, 0).', 0) + '; $priority = SpecificPrice::getPriority($id_product); foreach (array_reverse($priority) as $k => $field) if (!empty($field)) $select .= ' IF (`'.bqSQL($field).'` = '.(int)$$field.', '.pow(2, $k + 1).', 0) + '; return rtrim($select, ' +').') AS `score`'; } public static function getPriority($id_product) { if (!SpecificPrice::isFeatureActive()) return explode(';', Configuration::get('PS_SPECIFIC_PRICE_PRIORITIES')); if (!isset(SpecificPrice::$_cache_priorities[(int)$id_product])) { SpecificPrice::$_cache_priorities[(int)$id_product] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(' SELECT `priority`, `id_specific_price_priority` FROM `'._DB_PREFIX_.'specific_price_priority` WHERE `id_product` = '.(int)$id_product.' ORDER BY `id_specific_price_priority` DESC '); } $priority = SpecificPrice::$_cache_priorities[(int)$id_product]; if (!$priority) $priority = Configuration::get('PS_SPECIFIC_PRICE_PRIORITIES'); $priority = 'id_customer;'.$priority; return preg_split('/;/', $priority); } public static function getSpecificPrice($id_product, $id_shop, $id_currency, $id_country, $id_group, $quantity, $id_product_attribute = null, $id_customer = 0, $id_cart = 0, $real_quantity = 0) { if (!SpecificPrice::isFeatureActive()) return array(); /* ** The date is not taken into account for the cache, but this is for the better because it keeps the consistency for the whole script. ** The price must not change between the top and the bottom of the page */ $key = ((int)$id_product.'-'.(int)$id_shop.'-'.(int)$id_currency.'-'.(int)$id_country.'-'.(int)$id_group.'-'.(int)$quantity.'-'.(int)$id_product_attribute.'-'.(int)$id_cart.'-'.(int)$id_customer.'-'.(int)$real_quantity); if (!array_key_exists($key, SpecificPrice::$_specificPriceCache)) { $now = date('Y-m-d H:i:s'); $query = ' SELECT *, '.SpecificPrice::_getScoreQuery($id_product, $id_shop, $id_currency, $id_country, $id_group, $id_customer).' FROM `'._DB_PREFIX_.'specific_price` WHERE `id_product` IN (0, '.(int)$id_product.') AND `id_product_attribute` IN (0, '.(int)$id_product_attribute.') AND `id_shop` IN (0, '.(int)$id_shop.') AND `id_currency` IN (0, '.(int)$id_currency.') AND `id_country` IN (0, '.(int)$id_country.') AND `id_group` IN (0, '.(int)$id_group.') AND `id_customer` IN (0, '.(int)$id_customer.') AND ( (`from` = \'0000-00-00 00:00:00\' OR \''.$now.'\' >= `from`) AND (`to` = \'0000-00-00 00:00:00\' OR \''.$now.'\' <= `to`) ) AND id_cart IN (0, '.(int)$id_cart.') '; if ($real_quantity != 0 && !Configuration::get('PS_QTY_DISCOUNT_ON_COMBINATION')) $query .= ' AND IF(`from_quantity` > 1, `from_quantity`, 0) <= IF(id_product_attribute=0,'.(int)$quantity.' ,'.(int)$real_quantity.')'; else { $qty_to_use = $id_cart ? (int)$quantity : (int)$real_quantity; $query .= 'AND `from_quantity` <= '.max(1, $qty_to_use); } $query .= ' ORDER BY `id_product_attribute` DESC, `from_quantity` DESC, `id_specific_price_rule` ASC, `score` DESC'; SpecificPrice::$_specificPriceCache[$key] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($query); } return SpecificPrice::$_specificPriceCache[$key]; } public static function setPriorities($priorities) { $value = ''; if (is_array($priorities)) foreach ($priorities as $priority) $value .= pSQL($priority).';'; SpecificPrice::deletePriorities(); return Configuration::updateValue('PS_SPECIFIC_PRICE_PRIORITIES', rtrim($value, ';')); } public static function deletePriorities() { return Db::getInstance()->execute(' TRUNCATE `'._DB_PREFIX_.'specific_price_priority` '); } public static function setSpecificPriority($id_product, $priorities) { $value = ''; foreach ($priorities as $priority) $value .= pSQL($priority).';'; return Db::getInstance()->execute(' INSERT INTO `'._DB_PREFIX_.'specific_price_priority` (`id_product`, `priority`) VALUES ('.(int)$id_product.',\''.pSQL(rtrim($value, ';')).'\') ON DUPLICATE KEY UPDATE `priority` = \''.pSQL(rtrim($value, ';')).'\' '); } public static function getQuantityDiscounts($id_product, $id_shop, $id_currency, $id_country, $id_group, $id_product_attribute = null, $all_combinations = false, $id_customer = 0) { if (!SpecificPrice::isFeatureActive()) return array(); $now = date('Y-m-d H:i:s'); $res = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' SELECT *, '.SpecificPrice::_getScoreQuery($id_product, $id_shop, $id_currency, $id_country, $id_group, $id_customer).' FROM `'._DB_PREFIX_.'specific_price` WHERE `id_product` IN(0, '.(int)$id_product.') AND '.(!$all_combinations ? '`id_product_attribute` IN(0, '.(int)$id_product_attribute.') AND ' : '').' `id_shop` IN(0, '.(int)$id_shop.') AND `id_currency` IN(0, '.(int)$id_currency.') AND `id_country` IN(0, '.(int)$id_country.') AND `id_group` IN(0, '.(int)$id_group.') AND `id_customer` IN(0, '.(int)$id_customer.') AND ( (`from` = \'0000-00-00 00:00:00\' OR \''.$now.'\' >= `from`) AND (`to` = \'0000-00-00 00:00:00\' OR \''.$now.'\' <= `to`) ) ORDER BY `id_product_attribute` DESC, `from_quantity` DESC, `id_specific_price_rule` ASC, `score` DESC '); $targeted_prices = array(); $last_quantity = array(); foreach ($res as $specific_price) { if (!isset($last_quantity[(int)$specific_price['id_product_attribute']])) $last_quantity[(int)$specific_price['id_product_attribute']] = $specific_price['from_quantity']; elseif ($last_quantity[(int)$specific_price['id_product_attribute']] == $specific_price['from_quantity']) continue; $last_quantity[(int)$specific_price['id_product_attribute']] = $specific_price['from_quantity']; if ($specific_price['from_quantity'] > 1) $targeted_prices[] = $specific_price; } return $targeted_prices; } public static function getQuantityDiscount($id_product, $id_shop, $id_currency, $id_country, $id_group, $quantity, $id_product_attribute = null, $id_customer = 0) { if (!SpecificPrice::isFeatureActive()) return array(); $now = date('Y-m-d H:i:s'); return Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' SELECT *, '.SpecificPrice::_getScoreQuery($id_product, $id_shop, $id_currency, $id_country, $id_group, $id_customer).' FROM `'._DB_PREFIX_.'specific_price` WHERE `id_product` IN(0, '.(int)$id_product.') AND `id_product_attribute` IN(0, '.(int)$id_product_attribute.') AND `id_shop` IN(0, '.(int)$id_shop.') AND `id_currency` IN(0, '.(int)$id_currency.') AND `id_country` IN(0, '.(int)$id_country.') AND `id_group` IN(0, '.(int)$id_group.') AND `id_customer` IN(0, '.(int)$id_customer.') AND `from_quantity` >= '.(int)$quantity.' AND ( (`from` = \'0000-00-00 00:00:00\' OR \''.$now.'\' >= `from`) AND (`to` = \'0000-00-00 00:00:00\' OR \''.$now.'\' <= `to`) ) ORDER BY `from_quantity` DESC, `score` DESC '); } public static function getProductIdByDate($id_shop, $id_currency, $id_country, $id_group, $beginning, $ending, $id_customer = 0, $with_combination_id = false) { if (!SpecificPrice::isFeatureActive()) return array(); $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(' SELECT `id_product`, `id_product_attribute` FROM `'._DB_PREFIX_.'specific_price` WHERE `id_shop` IN(0, '.(int)$id_shop.') AND `id_currency` IN(0, '.(int)$id_currency.') AND `id_country` IN(0, '.(int)$id_country.') AND `id_group` IN(0, '.(int)$id_group.') AND `id_customer` IN(0, '.(int)$id_customer.') AND `from_quantity` = 1 AND ( (`from` = \'0000-00-00 00:00:00\' OR \''.pSQL($beginning).'\' >= `from`) AND (`to` = \'0000-00-00 00:00:00\' OR \''.pSQL($ending).'\' <= `to`) ) AND `reduction` > 0 ', false); $ids_product = array(); while ($row = Db::getInstance()->nextRow($result)) $ids_product[] = $with_combination_id ? array('id_product' => (int)$row['id_product'], 'id_product_attribute' => (int)$row['id_product_attribute']) : (int)$row['id_product']; return $ids_product; } public static function deleteByProductId($id_product) { if (Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'specific_price` WHERE `id_product` = '.(int)$id_product)) { // Refresh cache of feature detachable Configuration::updateGlobalValue('PS_SPECIFIC_PRICE_FEATURE_ACTIVE', SpecificPrice::isCurrentlyUsed('specific_price')); return true; } return false; } public function duplicate($id_product = false) { if ($id_product) $this->id_product = (int)$id_product; unset($this->id); return $this->add(); } /** * This method is allow to know if a feature is used or active * @since 1.5.0.1 * @return bool */ public static function isFeatureActive() { static $feature_active = null; if ($feature_active === null) $feature_active = Configuration::get('PS_SPECIFIC_PRICE_FEATURE_ACTIVE'); return $feature_active; } public static function exists($id_product, $id_product_attribute, $id_shop, $id_group, $id_country, $id_currency, $id_customer, $from_quantity, $from, $to, $rule = false) { $rule = ' AND `id_specific_price_rule`'.(!$rule ? '=0' : '!=0'); return (int)Db::getInstance()->getValue('SELECT `id_specific_price` FROM '._DB_PREFIX_.'specific_price WHERE `id_product`='.(int)$id_product.' AND `id_product_attribute`='.(int)$id_product_attribute.' AND `id_shop`='.(int)$id_shop.' AND `id_group`='.(int)$id_group.' AND `id_country`='.(int)$id_country.' AND `id_currency`='.(int)$id_currency.' AND `id_customer`='.(int)$id_customer.' AND `from_quantity`='.(int)$from_quantity.' AND `from` >= \''.pSQL($from).'\' AND `to` <= \''.pSQL($to).'\''.$rule); }} Link to comment Share on other sites More sharing options...
akhawat Posted December 31, 2013 Share Posted December 31, 2013 bonjour désolé je ne savais pas quelle partie je devais mettre j'ais donc mis le fichier complet. par contre as tu besoin aussi du fichier product.php ? merci Link to comment Share on other sites More sharing options...
karopresta Posted December 31, 2013 Share Posted December 31, 2013 (edited) bonjour désolé je ne savais pas quelle partie je devais mettre j'ais donc mis le fichier complet. par contre as tu besoin aussi du fichier product.php ? merci Non, pas besoin. C'est ici qu'il faut changer (fait une copie de ce fichier avant toute modif bien sur) public static function getSpecificPrice($id_product, $id_shop, $id_currency, $id_country, $id_group, $quantity, $id_product_attribute = null, $id_customer = 0, $id_cart = 0, $real_quantity = 0) { if (!SpecificPrice::isFeatureActive()) return array(); /* ** The date is not taken into account for the cache, but this is for the better because it keeps the consistency for the whole script. ** The price must not change between the top and the bottom of the page */ $key = ((int)$id_product.'-'.(int)$id_shop.'-'.(int)$id_currency.'-'.(int)$id_country.'-'.(int)$id_group.'-'.(int)$quantity.'-'.(int)$id_product_attribute.'-'.(int)$id_cart.'-'.(int)$id_customer.'-'.(int)$real_quantity); if (!array_key_exists($key, SpecificPrice::$_specificPriceCache)) { $now = date('Y-m-d H:i:s'); $query = ' SELECT *, '.SpecificPrice::_getScoreQuery($id_product, $id_shop, $id_currency, $id_country, $id_group, $id_customer).' FROM `'._DB_PREFIX_.'specific_price` WHERE `id_product` IN (0, '.(int)$id_product.') AND `id_product_attribute` IN (0, '.(int)$id_product_attribute.') AND `id_shop` IN (0, '.(int)$id_shop.') AND `id_currency` IN (0, '.(int)$id_currency.') AND `id_country` IN (0, '.(int)$id_country.') AND `id_group` IN (0, '.(int)$id_group.') AND `id_customer` IN (0, '.(int)$id_customer.') AND ( (`from` = \'0000-00-00 00:00:00\' OR \''.$now.'\' >= `from`) AND (`to` = \'0000-00-00 00:00:00\' OR \''.$now.'\' <= `to`) ) AND id_cart IN (0, '.(int)$id_cart.') '; if ($real_quantity != 0 && !Configuration::get('PS_QTY_DISCOUNT_ON_COMBINATION')) $query .= ' AND IF(`from_quantity` > 1, `from_quantity`, 0) <= IF(id_product_attribute=0,'.(int)$quantity.' ,'.(int)$real_quantity.')'; else { $qty_to_use = $id_cart ? (int)$quantity : (int)$real_quantity; $query .= 'AND `from_quantity` <= '.max(1, $qty_to_use); } $query .= ' ORDER BY `id_product_attribute` DESC, `from_quantity` DESC, `id_specific_price_rule` ASC, `score` DESC'; SpecificPrice::$_specificPriceCache[$key] = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($query); } Edited December 31, 2013 by karopresta (see edit history) Link to comment Share on other sites More sharing options...
akhawat Posted December 31, 2013 Share Posted December 31, 2013 je remplace la phrase en rouge par : (($real_quantity != 0 && !Configuration::get('PS_QTY_DISCOUNT_ON_COMBINATION')) ? ' AND IF(`from_quantity` > 1, `from_quantity`, 0) <= IF(id_product_attribute=0,'.(int)$quantity.' ,'.(int)$real_quantity.')' : 'AND `from_quantity` <= '.(int)$quantity).' c'est bien ca ? Link to comment Share on other sites More sharing options...
akhawat Posted December 31, 2013 Share Posted December 31, 2013 j'ais remplacé les lignes, résultat c'est la page blanche sur le site. tout est bloqué Link to comment Share on other sites More sharing options...
karopresta Posted December 31, 2013 Share Posted December 31, 2013 j'ais remplacé les lignes, résultat c'est la page blanche sur le site. tout est bloqué Remet le fichier que tu as sauvegardé avant et tu n'auras plus de page blanche. Si ce code ne fonctionne pas, alors il faut voir avec la personne (Mephistom) qui a suggéré ce code... Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now