拆解Magento’s 搜集Totals: Orders and Caveats
拆解Magento’s 搜集Totals: Orders and Caveats

拆解Magento’s 搜集Totals: Orders and Caveats

2013年5月8日发布 in 发展历程
拆解Magento’s 搜集Totals: The Core Process
2013年5月1日
拆解Magento’s 搜集Totals: An Example
2013年5月15日

以前的条目

本系列的重点是Magento ’用于计算和显示购物车总额的过程。我们已经对核心流程中涉及的代码进行了详尽的研究,但是还有一些重要的要点。

将总计转移到订单

我们做什么’到目前为止,我所看到的都与什么有关’当购物车仍在行驶时发生,这很有意义’完成真正的艰苦工作的地方。但是在某个时候(我们希望),购物车将成为订单。那会发生什么呢?有几个相关的点:

  • 通常,相同的数据库字段’在报价表中看到(例如“gift_cards_amount” and “base_gift_cards_amount”)也将显示在订单表中。
  • 在sales_flat_quote_item中存在这些字段的位置,您’很有可能还会在sales_flat_order_item上看到它们重复。
  • 和我们一样’我们已经看到,最常见的模式是将累计总数存储在sales_flat_quote_address上。但是观察订单表将发现大多数此类字段已直接移至sales_flat_order。这很有道理。在购物车过程中’对于在地址级别进行计算非常重要,因为地址信息会影响税收和运输等内容。下订单后,所有这些’相关的是实际上已应用的最终总数。
  • 通过在订单表上显示适当的字段,确保实际上可以非常简单地在模块中完成从报价到订单的数据’s config.xml(请参见下文)。
  • 订单确认电子邮件中和管理员订单屏幕中总计的显示与购物车中显示总计的过程几乎没有相似之处。涉及块Mage_Sales_Block_Order_Totals及其子代。

快速查看Mage_Sales中的config.xml,您将’ll see the node “fieldset”定义了一系列有关应从报价单到订单或反之亦然的字段信息。下面显示了与复制折扣数据有关的信息:

那’就是全部。只需要做更多的工作,就可以将总计数据从报价复制到订单。请注意直接从quote_address复制到订单(而不是order_address)的字段。

最后,关于显示订单总数的主题:不幸的是,该过程并不像我们这样优雅’在购物车中可以看到(在admin中显示顺序的设置,整个模型的获取方法以及设置自定义渲染器的能力为我们提供了很大的灵活性)。 Mage_Sales_Block_Order_Totals(用于订单确认电子邮件中的总计)定义了_initTotals方法,其中直接从订单中检索总计值并将其累积在数组中。要包括的总数的选择完全是硬编码的。 Mage_Adminhtml_Block_Sales_Totals及其后代(Mage_Adminhtml_Block_Sales_Order_Totals,Mage_Adminhtml_Block_Sales_Order_Creditmemo_Totals和Mage_Adminhtml_Block_Sales_Order_Invoice_Totals)都对此方法进行了自己的修改。为了在此领域进行定制,我们’我不得不求助于块重写。

更新: 感谢Vinai Kopp在最后一部分中对我进行了纠正。他指出了我错过的内容:Mage_Sales_Block_Order_Totals在其任何具有这种方法的子块上调用initTotals,后者可以依次获取其父代并调用addTotal或addTotalBefore来修改totals数组,从而消除了块重写的需要。

An unexpected caveat of 搜集Totals: Quote item caching

显然,我们’ve taken a fairly high level view of the code 在 volved with 搜集Totals. You’强烈建议您自己深入研究代码并发现精美的细节。但是,有一个这样的细节,我觉得在这里值得介绍,以防止它绊倒您。

Now that you understand what occurs during the totals 搜集ion process, you may find it convenient or necessary to call it directly yourself. Before you start feeling too confident with using 搜集Totals for your own purposes, though, keep the following rule 在 mind:

Products cannot be added to the quote after 搜集Totals is run!

。 。 。除非报价地址’项目缓存已清除。

几乎所有模型’s “collect” method relies 上 fetching the quote items from the address and looping through them. The first time getAllItems is run 上 a quote address, the item 搜集ion is actually cached with a unique key, and it’s this cached 搜集ion that is returned 上 subsequent calls.

对于已经存在的报价项目,这没有问题。它们的总数将照常进行处理和修改。但是新添加的报价项目不是’t缓存的集合的一部分。结果:新报价项将被保存正确,因为它们已成功添加到报价中’s 真实 item 搜集ion, but you’会在您希望看到计算出的总数的每个字段中找到$ 0,并且您’我会把头发拉出来,找出原因!

那 concludes our exploration of the details of 搜集Totals. However, we’re not done yet! Since doing can be much more 在 structive than observing, the final part 在 this series will contain a complete walkthrough for adding a total 搜集or of your own to your site.

下一页条目

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.

最近的帖子查看全部
2020年10月22日

Covid世界中的假日销售:应对挑战

毫无疑问,2020年是历史性的一年。火灾,全球大流行,暴动,老虎王等’只是冰山一角。如 […]
2020年8月7日

涡轮增压ZZPerformance的付费搜索

2020年7月30日

Intermix Beats M1 End of Life with 优雅的骆马Accelerator