5

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

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该模型中不存在。

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

谢谢,乔纳森

4

1 回答 1

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');

您基本上调用了与以前相同的代码,但将结果存放在某个地方以供以后访问。与覆盖一样安全。

于 2010-10-03T19:13:17.393 回答