Récemment
-
Solutions de paiement...
Discussion générale5 -
Petit code pour les descriptions de produits
Discussion générale3 -
Problèmes de prix avec plusieurs devises et PayPal
PhenixSuite5 -
Feuilles de styles non chargées si smart cache activé [RÉSOLU]
PhenixSuite5 -
PayPal Module Error
Bugs & Améliorations2 -
Transient Bug after 1.6.2.31 Upgrade
Bugs & Améliorations2 -
blockcategory et left_column
BUG connus1 -
[REGLÉ] override - je n'y arrive pas.
Modules10 -
les routes sur mesures
Discussion générale6 -
Nouvelle attaque ?
Discussion générale11 -
Problème calcul HT
Bugs & Améliorations42 -
Erreur sur facture générée depuis le FO
PhenixSuite3 -
Factures ne se génèrent plus depuis 06/12 [RÉSOLU]
Bugs & Améliorations20 -
Edition en masse des déclinaisons
Nouvelles fonctionnalités4 -
Mise à niveau de Prestashop 1.6.24 vers PhenixSuite 1.6.30
Discussion générale2 -
PaypalAPI erreur
PhenixSuite50 -
Thème possible
Questions relatives à l'installation/upgrade2 -
erreurs cleaner
Discussion générale3 -
multiples déclinaisons sur produit [RÉSOLU]
Bugs & Améliorations22 -
Thème enfant
PhenixSuite3
À partir de (from_price) [RÉSOLU]
-
Bonjour,
J'ai remarqué que la classe Combination retournait $min_attribute sans faire la distinction d'un changement de prix (si toutes les valeurs price sont à 0 ou qu'elles sont les mêmes, il y a quand même un retour). Du fait, des produits déclinés ayants les mêmes prix (couleurs...) ont "à partir de" avant le prix.
-
Ok,
Pour le correctif (qui sera effectif dans la 1.6.2.21)
Modifier la classe Product.php lignes 5410 et suivantes par:$row['from_price'] = false; if(Configuration::get('PS_ATTRIBUTE_CATEGORY_FROM') && $id_product_attribute) { $info_attribute = Combination::getMinProductAttributePrice($row['id_product'], true); if($info_attribute['min'] != $info_attribute['max']) { $row['from_price'] = Tools::ps_round( Product::getPriceStatic( (int)$row['id_product'], true, (int)$info_attribute['id_product_attribute'], 6 ), (int)Configuration::get('PS_PRICE_DISPLAY_PRECISION') ); } }
Et la classe Combination.php, fonction getMinProductAttributePrice() par:
public static function getMinProductAttributePrice($id_product, $with_price = true) { $min_attribute = Db::getInstance()->getRow(' SELECT pa.`id_product_attribute`, pa.`price`, MIN(pa.`price`) as `min`, MAX(pa.`price`) as `max` FROM `'._DB_PREFIX_.'product_attribute` pa '.Shop::addSqlAssociation('product_attribute', 'pa').' WHERE pa.`id_product` = '.(int)$id_product.' order by pa.`price` ASC '); if($min_attribute) { if($with_price) { return $min_attribute; } else { return (int)$min_attribute['id_product_attribute']; } } return 0; }
-
Merci ! Ça fonctionne ! (enfin, l'affichage si prix différents). Par contre ça affiche le prix max, pas le min.
-
Précision : dans les déclinaisons, il se peut (ici c'est le cas) que l'incidence sur le prix soit négative (soustraction). Se peut-il que le calcul soit fait sur la valeur absolue ?
-
Alors on va plutôt se baser sur une autre table.
Essayez ceci:public static function getMinProductAttributePrice($id_product, $with_price = true) { $min_attribute = Db::getInstance()->getRow(' SELECT ai.`id_attribute`, ai.`price`, MIN(ai.`price`) as `min`, MAX(ai.`price`) as `max` FROM `'._DB_PREFIX_.'attribute_impact` ai '.Shop::addSqlAssociation('attribute', 'ai').' WHERE ai.`id_product` = '.(int)$id_product.' order by ai.`price` ASC '); if($min_attribute) { if($with_price) { return $min_attribute; } else { return (int)$min_attribute['id_product_attribute']; } } return 0; }
-
J'ai le bon prix, mais je n'ai plus la mention "À partir de" (la table attribute_impact est vide)
-
les 8.40 d'impact négatif sur le prix sont bien dans la table product_attribute initialement invoquée dans la classe Combination
-
Ok, donc c'était bien la première table qui était la bonne (Attribute_impact n'est utilisée que dans des cas particuliers)
MySQL ne pouvant gérer correctement la combinaison de max/min avec le order by, voici la fonction à utiliser:public static function getMinProductAttributePrice($id_product, $with_price = true) { $attributes = Db::getInstance()->executeS(' SELECT pa.`id_product_attribute`, pa.`price` FROM `'._DB_PREFIX_.'product_attribute` pa '.Shop::addSqlAssociation('product_attribute', 'pa').' WHERE pa.`id_product` = '.(int)$id_product.' ORDER BY pa.`price` ASC '); if($attributes) { $min_attribute = reset($attributes); $max = end($attributes); if($with_price) { $min_attribute['min'] = $min_attribute['price']; $min_attribute['max'] = $max['price']; return $min_attribute; } else { return (int)$min_attribute['id_product_attribute']; } } return 0; }
-
On y est presque, le prix est toutefois affiché TTC sur ces produits-là, alors qu'il est bien HT sur les autres (lorsqu'affiché HT pour ce groupe client).
-
$row['from_price'] = false; if(Configuration::get('PS_ATTRIBUTE_CATEGORY_FROM') && $id_product_attribute) { $info_attribute = Combination::getMinProductAttributePrice($row['id_product'], true); if($info_attribute['min'] != $info_attribute['max']) { $row['from_price'] = Tools::ps_round( Product::getPriceStatic( (int)$row['id_product'], (self::$_taxCalculationMethod == PS_TAX_EXC ? false : true), (int)$info_attribute['id_product_attribute'], 6 ), (int)Configuration::get('PS_PRICE_DISPLAY_PRECISION') ); } }
-
Merci, tout est bon