圆形*仅限特价*在Magento

时间:2012-02-23 11:18:10

标签: php magento

我的情况是客户希望将特价四舍五入到最接近的整数(例如:1922.25 => 1922.001256.85 => 1257.00

这应仅适用于Special prices客户说,如果产品没有特殊价格,价格应该按原样显示。

请注意,这不仅适用于显示。此规则适用于任何地方,甚至是发票。那么有没有办法轻松地做到这一点,或者我们应该只修改核心文件?

修改

如果我们修改像Product.php或Price.php这样的核心框架文件,它们会被更新覆盖吗?所以这应该是一种安全的方式。

2 个答案:

答案 0 :(得分:2)

这很简单。

只需观察catalog_product_load_after事件,并用舍入值覆盖special_price。

为您的模块创建一个引导程序文件:

应用程序的/ etc /模块/ 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的/ etc / 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()));
            }
        }
    }

}

答案 1 :(得分:-2)

在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)