我使用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()函数时,我发现那里的层级价格不是我使用第一个事件更新的那个。所以我想我需要在保存报价之前更新价格。请任何人帮助我并显示正确的方向。
请帮助我,我错过了一些重要的步骤。非常感谢任何帮助。
提前致谢。
答案 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.
?>