Работа с ценами в Magento
Формирование цен — один из самых сложных механизмов в Magento. Цены формируются в различных местах, начиная от метода расчета налогов и заканчивая отображением цены для продуктовых опций на странице просмотра продукта.
Перед началом работы с ценами необходимо помнить следующее:
- На изменение функционала расчета цен потребуется не менее 24 часов.
- При отлаживании формирования цен лучше всего использовать пошаговый отладчик кода для нахождения места, где формируется цена.
- Переписывать код нужно методами Magento (но ни в коем случае не менять оригинальные файлы системы). Для этого нужно расширить класс и внести соответствующую информацию в файл config.xml. Более подробно — в статье http://bandadirect.com/2012/10/29/urok-9-pereopredelenie-modeli-v-magento .
Допустим, в базе данных сохранены цены с 4 знаками после запятой и необходимо, чтобы при начислении НДС использовалась не округленная до 2 знаков цена, а эта сохраненная в БД цена с 4 знаками после запятой. К сожалению, в Magento нет одного единственного места, где можно было бы поменять логику формирования цен. Цена формируется поэтапно. Вот самые важные этапы формирования цены:
1. Методы расчета стоимости налогов
Методы расчета налогов настраиваются в панели администратора:
System > Configuration > Sales > Tax > Calculation Settings
Центральный объект, где находится вся логика по расчету цен, находится в
Mage_Tax_Model_Sales_Total_Quote_Subtotal
Каждый способ расчета цен, который настраивается в панели администратора, имеет соответственный метод в этом классе:
Tax Calculation Method Based On
- Unit Price - _unitBaseCalculation()
- Row Total - _rowBaseCalculation()
- Total - _totalBaseCalculation()
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/ .
<- назад в: Технический блог