请注意,这个问题是关于运费,而不是价格。有一个重要的区别,即运输方式为店主支付的费用是多少,而不是客户支付的费用。
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(使用前将#替换为@)