自定义级别价格在结帐页面magento中不起作用

时间:2012-12-20 17:57:18

标签: magento

我使用Alan Storms教程开发了一个自定义模块来满足我的项目要求,用于在magento中创建模块。

我要求根据livefeed在前端动态更改price属性。每次更新Feed时,每次页面刷新时,必须为网站上的每个产品显示新价格。

为此,我已经覆盖了产品模块和价格模块。问题在于层级定价。当层级定价到位时,我需要根据实时价格计算层级价格。

为此,我还设法使用price_type类覆盖进行更改。

现在每当项目被添加到购物车时,层级定价都不起作用,我写了event_trigger,即更新事件“checkout_cart_save_before”的tier_pricing的Observer,这里是我的代码

class My_Custom_Model_Observer extends Varien_Event_Observer
{
   public function __construct()
   {
   }
   public function updateCartBasedOnLiveFeed($observer)
   {

          foreach ($observer->getCart()->getQuote()->getAllVisibleItems() as $item /* @var $item Mage_Sales_Model_Quote_Item */) 
          {
                        $tierPrices =   array();
                        $tierPrices =   $item->getProduct()->getTierPrice();
                        $itemPrice  =   $item->getProduct()->getPrice();
                        $i=0;
                        foreach($tierPrices as $key => $tierPrice)
                        {

                            if(!is_numeric($key))
                            {

                                    $updatedTierPrice                   =   $itemPrice - ($itemPrice * ($tierPrice['price']/100));
                                    $tierPrices[$key]['price']          =   $updatedTierPrice;
                                    $tierPrices[$key]['website_price']  =   $updatedTierPrice;  
                            }   
                            else 
                            {
                                if($tierPrice['price'] > 0)
                                {
                                    $updatedTierPrice                   =   $itemPrice - ($itemPrice * ($tierPrice['price']/100));
                                    $tierPrice['price']                 =   $updatedTierPrice;
                                    $tierPrice['website_price']         =   $updatedTierPrice;
                                    $tierPrices[$i]                     =   $tierPrice;
                                    $i++;   
                                }

                            }

                        }

                        $item->getProduct()->setData('tier_price',$tierPrices);

          }

   }
}

以上代码在购物车页面中效果很好。但是当涉及到结帐页面。它适用于单个项目,当层级定价发挥作用时,它确实应用了购物车价格。

请帮助我。

我也尝试过使用其他事件以及上述事件。

事件:sales_quote_save_before

public function updateQuoteLive($observer)
   {
        $tierPrices =   array();

        $quote_item = $observer->getEvent()->getQuote;

    $itemPrice  =   $quote_item->getProduct()->getPrice();
        $tierPrices =   $quote_item->getProduct()->getTierPrice();

        $tierPricesSize =   sizeof($tierPrices);
        for($i=0;$i<$tierPricesSize;$i++)
        {
            $updatedTierPrice                   =   $itemPrice - ($itemPrice * ($tierPrices[$i]['price']/100));
            $tierPrices[$i]['price']            =   $updatedTierPrice;
            $tierPrices[$i]['website_price']    =   $updatedTierPrice;
        }

        $quote_item->getProduct()->setData('tier_price',$tierPrices);



   }

当我尝试打印Quote.php中提供的getQuote()函数时,我发现那里的层级价格不是我使用第一个事件更新的那个。所以我想我需要在保存报价之前更新价格。请任何人帮助我并显示正确的方向。

请帮助我,我错过了一些重要的步骤。非常感谢任何帮助。

提前致谢。

3 个答案:

答案 0 :(得分:0)

更新时,将新价格“保存”到数据库可能会更好。

尝试以下方面的内容:

$product = $observer->getProduct();
$procuct->setPrice($updatedPrice);

这样一来,结账时它会从数据库中提取正确的价格(避免在“飞行途中”纠正它的头痛

答案 1 :(得分:0)

我实现了像你这样的项目。我没有sales_quote_save_before Observer。我只使用checkout_cart_save_before。根据会话,将设置价格。

我意识到这样:

public function updatePrice( $observer )
{   
try {
       $cart = $observer->getCart();
       $items = $cart->getItems();
       foreach($items as $item)
       {
       $item->setCustomPrice($price);
       $item->setOriginalCustomPrice($price);
       }
     } catch ( Exception $e )
     {
       Mage::log( "checkout_cart_save_before: " . $e->getMessage() );
     }
}

我在飞行中和这个观察者计算了等级。所有价格都将在qoute中正确设置。

也许你应该这样试试。

关心boti

答案 2 :(得分:0)

最后想出了问题并得到了解决方案。

问题是在调用getTierPrice() function时的购物车页面或结帐页面中,/app/code/core/Mage/Catalog/Product.php中存在此问题。它需要一个名为$ qty的参数,默认情况下为null。此函数依次调用function getTierPrice文件中存在的/app/code/core/Mage/Type/Price.php,它带有两个参数$qty and $productObject.默认情况下,$ qty为null,当它为null时,该函数返回一个tier_prices数组。但是当传递$ qty值时,函数会返回该特定数量的单个值。

所以,我编写了自己的自定义函数,根据我的要求计算层级价格,如

在Alan Storm的教程之后,我用我的自定义模块覆盖了两个核心文件。

我使用My_CustomModule_Model_Product类和

扩展了Mage_Catalog_Model_Product

然后

Mage_Catalog_Model_Product_Type_Price with My_CustomModule_Model_Price

然后在/app/code/local/My/Custommodule/Model/Product.php

我添加了自定义代码,如

public function getTierPrice($qty=null)
    {
        if($qty)
        {
            return  $this->getPriceModel()->getCustomTierPrice($qty, $this); 
        }
        return $this->getPriceModel()->getTierPrice($qty, $this);
    }

然后在/app/code/local/My/Custommodule/Model/Price.php

<?php 

public function getCustomTierPrice($qty = null, $product)
    {
        $allGroups = Mage_Customer_Model_Group::CUST_GROUP_ALL;
        $prices = $product->getData('tier_price');


        if (is_null($prices)) {
            $attribute = $product->getResource()->getAttribute('tier_price');
            if ($attribute) {
                $attribute->getBackend()->afterLoad($product);
                $prices = $product->getData('tier_price');
            }
        }


 foreach($prices as $key => $customPrices)
        {
            if($prices[$key]['price'] < 1)
            {
                    $prices[$key]['price']          =   abs($product->getPrice() - ($productPrice * ($customPrices['price']/100)));
                    $prices[$key]['website_price']  =   $prices[$key]['price'];
            }

        }
}

which retured a customized value when $qty is passed and voila it worked.

I just posed this answer so that any one else who has similar requirement may get benefited with this.

?>