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

Jon*_*Day 5 php shipping magento cart

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

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');
Run Code Online (Sandbox Code Playgroud)

我可以看到计算结果price,但是cost在该模型中不存在.

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

谢谢,乔纳森

Ala*_*orm 7

首先,在你看到某个地方存在实际瓶颈之前,不要过分担心性能问题.相信众多的缓存系统.更为愤世嫉俗的是,Magento已经有点像SQL野兽了,所以如果你有一个好的商店,一些额外的查询也不会受到影响.

其次,数据库命中甚至可能不是问题.该shipping/rate_request模型似乎并没有被数据库进行备份.如果你看两次在核心代码中使用它

Mage_Shipping_Model_Shipping::collectRatesByAddress
Mage_Sales_Model_Quote_Address::requestShippingRates
Run Code Online (Sandbox Code Playgroud)

您可以看到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');
Run Code Online (Sandbox Code Playgroud)

你基本上调用了和以前一样的代码,但是将结果存放在某个地方以便以后访问.关于覆盖可以获得的安全性.

  • 啊,我误解了这个问题.我以为你想在相同的请求中抓住它使用它.我很确定Mage :: register是每个请求的东西..全局变量而不违反全局范围.另外,FWIW,我刚搜索了我的本地1.4和1.4.1代码库,并没有在任何地方找到shipping_carrier_tablerate_load事件. (2认同)