访问Magento购物车和/或结账时的运费

时间:2010-10-03 05:26:49

标签: php magento cart shipping

请注意,这个问题是关于运费,而不是价格。有一个重要的区别,即商店所有者对运输方法产生的收费是多少,而不是客户支付的$$费用。

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

在这个阶段,我的想法已经不多了。任何建议都感激不尽!

谢谢, 乔纳森

1 个答案:

答案 0 :(得分:7)

首先,在你看到某个地方的实际瓶颈之前,尽量不要过分担心性能。相信众多的缓存系统。更为愤世嫉俗的是,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中使用的所有模型都不会从数据库加载任何内容,它们只是进行计算。

令人钦佩的是,您希望在第一次出现时尽可能地构建高效的东西,但在现代OO系统中有太多复杂的交互,以神奇地知道最有效的方式来做某事。做你需要的东西来获得你需要的信息,并在维护版本期间处理性能调整(如果需要)(或者如果你没有幸运地发布维护版本,当你组织中有权力的人抱怨某个地方的速度时) )

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

这样的东西
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');

您基本上调用与以前相同的代码,但将结果存放在某处以供以后访问。关于覆盖可以获得的安全性。