Во-первых, позвольте мне попытаться перефразировать ваш вопрос:
На каждом шаге пользовательского параметра, как вы рассчитываете процент на основе цен из предыдущих шагов, а не на основе базовой цены продукта?Другими словами, как заставить Magento накапливать цены пользовательских опционов, а не суммировать их?
Пример продукта:
- Базовая цена: $ 0
- Размер A: +$ 20
- Цвет X: + 10%
Расчет Magento: 10% базовой цены 0 = 0. Общая стоимость 20.
Требуемый расчет: 10% отбазовая цена и размер цены = 10% от 20. Общая цена 22.
Решение
Для этого вам необходимо переопределить логику ценообразования пользовательских опционов Magento.Необходимо внести изменения в модель цены (для расчетов на стороне сервера), а также в блок и код шаблона (для расчетов Javascript на стороне клиента).
В модели цены Mage_Catalog_Model_Product_Type_Price
измените расчет вфункция _applyOptionsPrice
:
//$finalPrice += $group->getOptionPrice($quoteItemOption->getValue(), $basePrice);
$finalPrice += $group->getOptionPrice($quoteItemOption->getValue(), $finalPrice);
В Mage_Catalog_Block_Product_View_Options
функция getJsonConfig
вычисляет процент от базовой цены перед возвратом ее в шаблон.Измените это, чтобы получить фактическое процентное значение, возвращаемое в шаблон:
//$_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');
Теперь измените Javascript в template/catalog/product/view/options.phtml
, чтобы накапливать процент на лету, накопительно.В классе Javascript Product.Options
добавьте функцию для расчета:
getPriceToAdd : function(optionvalue, oldprice) {
var value = parseFloat(optionvalue['pricing_value']);
if (optionvalue['is_percentage']) {
return Math.round(value*oldprice)/100;
} else {
return value;
}
}
и измените функцию reloadPrice
, чтобы использовать новые вычисления:
//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);
Как обычно, донаредактировать основные файлы напрямую.Используйте местные переписывает.Обратите внимание, что ваша новая ценовая модель должна быть указана в конфигурации для каждого соответствующего типа продукта:
<config>
<global>
<catalog>
<product>
<type>
<simple>
<price_model>mymodule/product_type_simple_price</price_model>
</simple>
...
</type>
</product>
</catalog>
</global>
</config>