访问 Magento 购物车和/或结帐中的运费

2024-05-15

请注意,这个问题是关于运费,而不是价格。有一个重要的区别,即运输方式为店主支付的费用是多少,而不是客户支付的费用。

The shipping_tablerate数据库表包括一个cost字段,该字段填充在Mage_Shipping_Model_Carrier_Tablerate期间的对象collectRates方法。但是,该字段无法在堆栈中的其他任何地方访问,例如来自报价的地址。

我需要在购物车页面上访问该值,但除了实例化一个之外,我找不到任何方法来实现它Mage_Shipping_Model_Rate_Request要传入的对象collectRates()。鉴于数据已经从表中加载并且应该可以访问,这似乎效率低下。

我尝试过观察<shipping_carrier_tablerate_load/>事件,但似乎_load该模型不会引发事件。

我还尝试从报价中获取费率:

$quote = Mage::getSingleton('checkout/cart')->getQuote();
$address = $quote->getShippingAddress();
$rate = $address->getShippingRateByCode($code ='tablerate_bestway');

我可以看到计算出来的price, 然而cost不存在于该模型中。

在这个阶段,我已经没有想法了。如有任何建议,不胜感激!

谢谢, 乔纳森


首先,在您在某个地方看到实际的瓶颈之前,尽量不要太担心性能。对众多的缓存系统有信心。更讽刺的是,Magento 已经有点像 SQL 野兽了,所以如果你有一个调优好的商店,一些额外的查询不会有什么坏处。

其次,数据库命中甚至可能不是问题。这shipping/rate_request模型似乎不受数据库支持。如果你看一下核心代码中使用的两次

Mage_Shipping_Model_Shipping::collectRatesByAddress
Mage_Sales_Model_Quote_Address::requestShippingRates

你可以看到shipping/rate_request模型正在被实例化,然后从已加载的字段中填充。此外,所有模型中使用的Mage_Shipping_Model_Carrier_Tablerate::collectRates不从数据库加载任何内容,它们只是进行计算。

令人钦佩的是,您希望构建在第一次运行时就尽可能高性能的东西,但是现代面向对象系统中有太多复杂的交互,无法神奇地知道执行某些操作的最高性能方式。做你需要做的事情来获取你需要的信息,并在维护版本期间处理性能调整(如果需要)(或者如果你不够幸运有维护版本,当你组织中有权势的人抱怨某处的速度时) )

第三,当系统不提供对您需要的东西的访问时,这就是类覆盖系统的用途。就像是

class Package_Module_Model_Carriertablerate extends
Mage_Shipping_Model_Carrier_Tablerate
{
    public function getRate(Mage_Shipping_Model_Rate_Request $request)
    {
        $rate = parent::getRate($request);  
        Mage::register('package_module_carriertablerates', $rate);
        return $rate;
    }

}

...
//later, retrieve the rate
$rates = Mage::registry('package_module_carriertablerates');

您基本上调用了与以前相同的代码,但将结果存放在某处以供以后访问。与覆盖所能达到的安全程度差不多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

访问 Magento 购物车和/或结帐中的运费 的相关文章