À 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)
    Capture.JPG



  • 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


Se connecter pour répondre