请注意,这个问题是关于运费,而不是价格。有一个重要的区别,即商店所有者对运输方法产生的收费是多少,而不是客户支付的$$费用。
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
。
在这个阶段,我的想法已经不多了。任何建议都感激不尽!
谢谢, 乔纳森
答案 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');
您基本上调用与以前相同的代码,但将结果存放在某处以供以后访问。关于覆盖可以获得的安全性。