D'abord, laissez-moi essayer de reformuler votre question:
Dans chaque option personnalisée p, comment calculez-vous le pourcentage basé sur les prix des étapes précédentes plutôt que sur le prix de base du produit? En d'autres termes, comment Magento accumule-t-il les prix des options personnalisées plutôt que de les additionner?
Exemple produit:
- Prix de base: $ 0
- Taille A: + 20 $
- Couleur X: + 10%
calcul de Magento: 10% du prix de base 0 = 0. Prix total 20.
Calcul souhaité: 10% du prix de base ET du prix de la taille = 10% de 20. Prix total 22.
Solution
Pour ce faire, vous devez remplacer la logique de tarification de l'option personnalisée Magento. Les modifications doivent être effectuées dans le modèle de prix (pour les calculs côté serveur) ainsi que dans le code de bloc et de modèle (pour les calculs Javascript côté client).
Dans le modèle de prix Mage_Catalog_Model_Product_Type_Price
, modifiez le calcul dans la fonction _applyOptionsPrice
:
//$finalPrice += $group->getOptionPrice($quoteItemOption->getValue(), $basePrice);
$finalPrice += $group->getOptionPrice($quoteItemOption->getValue(), $finalPrice);
En Mage_Catalog_Block_Product_View_Options
, la fonction getJsonConfig
calcule le pourcentage du prix de base avant de le retourner au modèle. Modifier pour obtenir la valeur de pourcentage réel retour au modèle:
//$_tmpPriceValues[$value->getId()] = Mage::helper('core')->currency($value->getPrice(true), false, false);
// Add fixed price or percentage (don't calculate percentage yet, done by JS live instead)
$_tmpPriceValues[$value->getId()]['pricing_value'] = ($value->getPriceType() != 'percent') ? Mage::helper('core')->currency($value->getPrice(true), false, false) : $value->getPrice();
$_tmpPriceValues[$value->getId()]['is_percentage'] = ($value->getPriceType() == 'percent');
maintenant modifier le Javascript dans template/catalog/product/view/options.phtml
pour calculer le pourcentage de la volée, cumulativement.Dans la classe Javascript Product.Options
, ajouter une fonction pour le calcul:
getPriceToAdd : function(optionvalue, oldprice) {
var value = parseFloat(optionvalue['pricing_value']);
if (optionvalue['is_percentage']) {
return Math.round(value*oldprice)/100;
} else {
return value;
}
}
et changer la fonction reloadPrice
d'utiliser le nouveau calcul:
//price += parseFloat(config[optionId][element.getValue()]);
price += opConfig.getPriceToAdd(config[optionId][element.getValue()], price);
...
//price += parseFloat(this.config[optionId]);
price += opConfig.getPriceToAdd(this.config[optionId], price);
...
//price += parseFloat(this.config[optionId][selectOption.value]);
price += opConfig.getPriceToAdd(this.config[optionId][selectOption.value], price);
...
//price += parseFloat(this.config[optionId]);
price += opConfig.getPriceToAdd(this.config[optionId], price);
Comme d'habitude, ne modifiez pas les fichiers core directement. Utilisez des réécritures locales. S'il vous plaît noter votre nouveau modèle de prix doit être déclaré dans la configuration pour chaque type de produit concerné:
<config>
<global>
<catalog>
<product>
<type>
<simple>
<price_model>mymodule/product_type_simple_price</price_model>
</simple>
...
</type>
</product>
</catalog>
</global>
</config>