代码之家  ›  专栏  ›  技术社区  ›  Jonathan Day

访问Magento购物车中的运输成本和/或结帐

  •  5
  • Jonathan Day  · 技术社区  · 15 年前

    请注意,这个问题是关于运输成本,而不是价格。这有一个重要的区别,即,与顾客支付的$$费用相比,送货方式给店主带来了多少$$费用。

    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 但是

    在这个阶段,我已经没什么主意了。如有任何建议,不胜感激!

    谢谢,

    1 回复  |  直到 15 年前
        1
  •  7
  •   Alana Storm    15 年前

    首先,不要太担心性能,直到您看到某个地方出现实际的瓶颈。相信众多的缓存系统。更愤世嫉俗地说,Magento已经有点像SQL野兽了,所以如果你有一个经过良好调优的存储,那么额外的几个查询就不会有什么影响。

    shipping/rate_request 模型似乎没有数据库支持。如果你看一下它在核心代码中使用的两次

    Mage_Shipping_Model_Shipping::collectRatesByAddress
    Mage_Sales_Model_Quote_Address::requestShippingRates
    

    你可以看到 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');
    

    推荐文章