Формирование цен — один из самых сложных механизмов в Magento. Цены формируются в различных местах, начиная от метода расчета налогов и заканчивая отображением цены для продуктовых опций на странице просмотра продукта.
Перед началом работы с ценами необходимо помнить следующее:
Допустим, в базе данных сохранены цены с 4 знаками после запятой и необходимо, чтобы при начислении НДС использовалась не округленная до 2 знаков цена, а эта сохраненная в БД цена с 4 знаками после запятой. К сожалению, в Magento нет одного единственного места, где можно было бы поменять логику формирования цен. Цена формируется поэтапно. Вот самые важные этапы формирования цены:
Методы расчета налогов настраиваются в панели администратора:
System > Configuration > Sales > Tax > Calculation Settings
Центральный объект, где находится вся логика по расчету цен, находится в
Mage_Tax_Model_Sales_Total_Quote_Subtotal
Каждый способ расчета цен, который настраивается в панели администратора, имеет соответственный метод в этом классе:
Tax Calculation Method Based On
Величину налогов можно переписать в другом объекте Mage_Tax_Model_Calculation с помощью метода calcTaxAmount().
Расчет общей суммы корзины заказа происходит в объекте Mage_Sales_Model_Quote_Address_Total_Grand в методе collect(). Как раз тут и можно внести все изменения в соответствии с новой логикой.
Отображение цены формируется в объекте Mage_Core_Model_Store и методе roundPrice().
Для задачи с 4 знаками нужно выполнить следующее:
public function roundPrice($price)
{
return round($price, 4);
}
На странице просмотра продукта, когда у продукта есть опции, цена меняется с помощью Javascript-методов. То есть при выборе опции итоговая цена товара меняется в соответствии с выбранной опцией. В коде Javascript дублируется подсчет цен, который прописан на стороне PHP. Поэтому, если что-то меняется в логике формирования цен в файлах PHP, нужно проверить, все ли правильно считает Javascript.
Для этого нужно переписать метод Product.OptionsPrice в файле js/varien/product.js.
Весь Javascript в Magento построен на библиотеке prototype. Для расширения методов в prototype следует пользоваться методом wrap(). Детальнее на сайте по prototype API
http://prototypejs.org/doc/latest/language/Function/prototype/wrap/ .