Joffrey91 Posted November 10, 2015 Share Posted November 10, 2015 (edited) Bonjour, Depuis la mise à jour, je n'ai plus accès aux prix spécifiques dans les templates. Je n'ai pas de problèmes pour enregistrer mes prix dans le Back Office. Mais la variable Smarty $product.specific_prices reste désespérément vide. J'ai essayé de vider les caches, sans succès. Avez-vous des idées pour corriger ce problème ? Merci d'avance Edited November 10, 2015 by Joffrey91 (see edit history) Link to comment Share on other sites More sharing options...
thierryAD Posted November 10, 2015 Share Posted November 10, 2015 Salut , J'ai rencontré ce soucis aussi Dans le dossier /Classes j'ai remis le fichier SpecificPrice.php de l'ancienne version et j'ai retrouvé mes tarifs pro. Je suis pas encore assez calé pour trouvé la ligne de code qui merdouille Link to comment Share on other sites More sharing options...
Joffrey91 Posted November 10, 2015 Author Share Posted November 10, 2015 Arf, ça aurait pu marcher mais non. J'ai pris le fichier SpecificPrice.php de la version 1.6.1.0 mais ça ne fonctionne toujours pas. Quelle version as tu utilisée pour résoudre ton problème ? Link to comment Share on other sites More sharing options...
thierryAD Posted November 11, 2015 Share Posted November 11, 2015 Celui de la V1.6.1.0 avec ce contenu : <?php /* * 2007-2015 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-2015 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_tax = 1; 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, 'validate' => 'isUnsignedId', '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_tax' => array('type' => self::TYPE_INT, 'validate' => 'isBool', '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 = '('; $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:00'); $query = ' SELECT *, '.SpecificPrice::_getScoreQuery($id_product, $id_shop, $id_currency, $id_country, $id_group, $id_customer).' FROM `'._DB_PREFIX_.'specific_price` USE INDEX (id_product_2) 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.') AND IF(`from_quantity` > 1, `from_quantity`, 0) <= '; $query .= (Configuration::get('PS_QTY_DISCOUNT_ON_COMBINATION') || !$id_cart || !$real_quantity) ? (int)$quantity : max(1, (int)$real_quantity); $query .= ' ORDER BY `id_product_attribute` DESC, `from_quantity` DESC, `id_specific_price_rule` ASC, `score` DESC, `to` DESC, `from` 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:00'); $result = 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` USE INDEX (id_product_2) 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 `from_quantity` ASC, `id_specific_price_rule` ASC, `score` DESC, `to` DESC, `from` DESC ', false, false); $targeted_prices = array(); $last_quantity = array(); while ($specific_price = Db::getInstance()->nextRow($result)) { 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:00'); 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` USE INDEX (id_product_2) 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, `to` DESC, `from` 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 SQL_NO_CACHE `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, 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...
Joffrey91 Posted November 12, 2015 Author Share Posted November 12, 2015 Merci, mais malheureusement, même avec cette version de fichier, je n'ai toujours pas les prix spécifiques dans mes produits. (J'ai pourtant bien essayé de vider les caches) Quelqu'un aurait-il une idée ? Link to comment Share on other sites More sharing options...
Joffrey91 Posted November 16, 2015 Author Share Posted November 16, 2015 Bonjour, je suis vraiment bloqué avec cette histoire, est-ce que quelqu'un s'aurait quoi faire pour réparer ce problème ? Merci d'avance Link to comment Share on other sites More sharing options...
guyzmoz Posted November 17, 2015 Share Posted November 17, 2015 Idem même problème... Les prix spécifique ne fonctionnent plus Link to comment Share on other sites More sharing options...
Oexo France Posted November 17, 2015 Share Posted November 17, 2015 (edited) exactement le même soucis ici, je suis en train de chercher la solution, j'ai cependant remarqué que chaques produit avec un règle spécifiques (mis à la main), s'appliquaient bien. EDIT: dans mon cas un seul produit se retrouve en règle spécifique avec un id totalement aléatoire mais faisant bien partit de mes conditions de prix, je regarde... Edited November 17, 2015 by Oexo France (see edit history) Link to comment Share on other sites More sharing options...
Joffrey91 Posted November 18, 2015 Author Share Posted November 18, 2015 Effectivement, dans le panier pas de problème, les prix spécifiques sont pris en compte. Mais dans les templates catégory et produit, l'information est manquante. Link to comment Share on other sites More sharing options...
Joffrey91 Posted November 24, 2015 Author Share Posted November 24, 2015 Bonjour, Avez-vous trouvé une solution pour faire fonctionner les prix spécifiques depuis la mise à jour 1.6.1.2 ? Est-ce que les mises à jours suivantes prévoient de corriger ce bug ? Merci d'avance pour vos réponses Link to comment Share on other sites More sharing options...
polaije Posted November 24, 2015 Share Posted November 24, 2015 Bonjour, J'ai le même problème avec la mise à jour vers 1.6.1.2 J'ai essayé de mettre l'ancien SpecificPrice.php mais sans résultat. Attention après la mise à jour j'avais le switch 'désactiver les surcharges' à OUI et j'avais d'autres problèmes. Pour les prix dans la classe Product.php le $specificprice n'est pas a true et le calcul ne se fait pas mais si je le force a true je n'obtiens toujours pas les ristournes. Je cherche encore... Jean-Marie Link to comment Share on other sites More sharing options...
Sylvain CM Posted November 25, 2015 Share Posted November 25, 2015 Bonjour, Je suis en train de me renseigner à ce sujet ; un ticket sur la forge a été ouvert à ce propos. Link to comment Share on other sites More sharing options...
Joffrey91 Posted November 25, 2015 Author Share Posted November 25, 2015 Bonjour, Merci, peut-on avoir un lien vers le ticket pour suivre l'avancement ou est-ce privé ? Link to comment Share on other sites More sharing options...
Sylvain CM Posted November 25, 2015 Share Posted November 25, 2015 Pas de soucis : http://forge.prestashop.com/browse/PSCSX-7162 Link to comment Share on other sites More sharing options...
polaije Posted November 25, 2015 Share Posted November 25, 2015 Bonjour, J'ai beaucoup galéré avec ce problème et le remplacement de la classe SpecificPrice avec le code de TherryAD a réglé mon problème. Merci, Jean-Marie Link to comment Share on other sites More sharing options...
Joffrey91 Posted November 25, 2015 Author Share Posted November 25, 2015 Bonjour polaije, Qu'avez-vous fait une fois la classe SpecificPrice remplacée ? De mon coté, j'ai beau changer la classe, vider le cache, je n'ai toujours pas de prix spécifiques dans mon template product-list.tpl. Link to comment Share on other sites More sharing options...
polaije Posted November 25, 2015 Share Posted November 25, 2015 Bonjour, J'ai bien auparavant ajouter un index (id_product_2) a la table specificprice. Cela n'a rien donné alors j'ai remplacé le contenu de la classe Specificprice.php avec le code de thierryAD plus haut. Vider le cache recompliler les fichiers et j'avais de nouveau les prix spécifiques. Bonne chance Link to comment Share on other sites More sharing options...
Joffrey91 Posted November 26, 2015 Author Share Posted November 26, 2015 Bonjour, Merci pour la méthode, malheureusement je confirme que ça ne fonctionne pas chez moi. Link to comment Share on other sites More sharing options...
Kiweez Posted January 4, 2016 Share Posted January 4, 2016 Bonjour, Même problème : dès que l'import de prix spécifiques dépasse un nombre de lignes (environ plus de 1000) les prix spécifiques ne s'affichent plus en Front Office alors qu'ils sont bien présent en BO. Une idée ? Merci Link to comment Share on other sites More sharing options...
Kiweez Posted January 4, 2016 Share Posted January 4, 2016 J'ai appliqué le code de thierryAD pour /classes/SpecificPrice.php et les prix spécifiques s'affichent à nouveau dans la fiche produit. Mais ils ne sont pas pris en compte dans le panier... Auriez-vous une solution ? Merci 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