Тур * только по специальной цене * в Magento - PullRequest
0 голосов
/ 23 февраля 2012

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

Это довольно просто.

Просто наблюдайте событие 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()));
            }
        }
    }

}
0 голосов
/ 23 февраля 2012

В 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...