Круглый * специальная цена только * в Magento

У меня есть ситуация, когда клиент хочет, чтобы специальная цена была округлена до ближайшего целого числа (пример: 1922.25 => 1922.00 , 1256.85 => 1257.00 )

Это должно быть только для Special prices говорит клиент, что означает, если нет специальной цены для продукта, цена должна быть такой, какой она есть.

Обратите внимание, что это не только отображение. Это правило применяется везде, даже счета-фактуры. Итак, есть ли способ сделать это легко или мы должны только изменить основные файлы?

РЕДАКТИРОВАТЬ

Если мы изменим основные файлы фреймов, такие как Product.php или Price.php, они будут перезаписаны с правом обновления? Поэтому это должно быть безопасным способом.

Это довольно легко.

Просто обратите внимание на событие catalog_product_load_after и перезапишите special_price с округленным значением.

Создайте загрузочный файл для вашего модуля:

приложение / и т.д. / модули / Danslo_RoundSpecialPrice.xml:

 <?xml version="1.0" encoding="UTF-8"?> <config> <modules> <Danslo_RoundSpecialPrice> <active>true</active> <codePool>local</codePool> <depends> <Mage_Catalog /> </depends> </Danslo_RoundSpecialPrice> </modules> </config> 

Укажите, что мы хотим наблюдать за событием загрузки продукта:

Приложение / код / ​​местные / Danslo / RoundSpecialPrice / и т.д. / config.xml:

 <?xml version="1.0" encoding="UTF-8"?> <config> <global> <models> <roundspecialprice> <class>Danslo_RoundSpecialPrice_Model</class> </roundspecialprice> </models> <events> <catalog_product_load_after> <observers> <round_special_price> <class>roundspecialprice/observer</class> <type>singleton</type> <method>roundSpecialPrice</method> </round_special_price> </observers> </catalog_product_load_after> <catalog_product_collection_load_after> <observers> <round_special_price> <class>roundspecialprice/observer</class> <type>singleton</type> <method>roundSpecialPriceInCollection</method> </round_special_price> </observers> </catalog_product_collection_load_after> </events> </global> </config> 

Затем просто напишите свою реализацию наблюдателя:

Приложение / код / ​​местные / Danslo / RoundSpecialPrice / Модель / Observer.php:

 class Danslo_RoundSpecialPrice_Model_Observer { public function roundSpecialPrice($observer) { $product = $observer->getProduct(); if ($product->getSpecialPrice()) { $product->setSpecialPrice(round($product->getSpecialPrice())); } } public function roundSpecialPriceInCollection($observer) { foreach ($observer->getCollection() as $product) { if ($product->getSpecialPrice()) { $product->setSpecialPrice(round($product->getSpecialPrice())); } } } } 

В PHP:

 if (special price) price = round(price); 

Какую базу данных вы используете? Возможно, вы могли бы сделать это на уровне базы данных и оставить приложение неповрежденным. Например, если вы используете Firebird, вы можете использовать вычисленное поле, определенное следующим образом:

 alter table prices add customer_price computed by ( case when special_price then round(price,0) else price end)