09.01.2015

Работа с ценами в Magento

Формирование цен — один из самых сложных механизмов в Magento. Цены формируются в различных местах, начиная от метода расчета налогов и заканчивая отображением цены для продуктовых опций на странице просмотра продукта.

Перед началом работы с ценами необходимо помнить следующее:

Допустим, в базе данных сохранены цены с 4 знаками после запятой и необходимо, чтобы при начислении НДС использовалась не округленная до 2 знаков цена, а эта сохраненная в БД цена с 4 знаками после запятой. К сожалению, в Magento нет одного единственного места, где можно было бы поменять логику формирования цен. Цена формируется поэтапно. Вот самые важные этапы формирования цены:

1. Методы расчета стоимости налогов

Методы расчета налогов настраиваются в панели администратора:

System > Configuration > Sales > Tax > Calculation Settings

Центральный объект, где находится вся логика по расчету цен, находится в

Mage_Tax_Model_Sales_Total_Quote_Subtotal

Каждый способ расчета цен, который настраивается в панели администратора, имеет соответственный метод в этом классе:

Tax Calculation Method Based On

2. Конечный подсчет налогов

Величину налогов можно переписать в другом объекте Mage_Tax_Model_Calculation с помощью метода calcTaxAmount().

3. Расчет цен корзины товаров

Расчет общей суммы корзины заказа происходит в объекте Mage_Sales_Model_Quote_Address_Total_Grand в методе collect(). Как раз тут и можно внести все изменения в соответствии с новой логикой.

4. Отображение цены

Отображение цены формируется в объекте Mage_Core_Model_Store и методе roundPrice().

Для задачи с 4 знаками нужно выполнить следующее:

public function roundPrice($price)

{

return round($price, 4);

}

5. Динамический расчет цен

На странице просмотра продукта, когда у продукта есть опции, цена меняется с помощью 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/ .