请注意,此问题是关于运费,而不是价格。有一个重要的区别,即运输方式对店主产生的 $$ 费用,而不是客户支付的 $$ 费用。
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
中使用的所有模型都不会从数据库加载任何内容,它们只是进行计算。
令人钦佩的是,您希望在第一次运行时构建尽可能高性能的东西,但现代 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');
您基本上是在调用与以前相同的代码,但将结果存放在某个地方以供以后访问。与覆盖一样安全。
关于php - 在 Magento 的购物车和/或结帐处访问运费,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3848705/