销售报价和销售报价地址之间的区别
-
12-12-2019 - |
题
我正在寻找可以使用哪个collect_totals观察者。有两个观察者,sales_quote_collect_totals_before 和 sales_quote_address_collect_totals_before.
它们可以在以下位置找到: /app/code/core/Mage/Sales/Model/Quote.php
和 /app/code/core/Mage/Sales/Model/Quote/Address.php
.
我想知道这两个文件有什么区别,因为这两个文件都有收集总计功能?
解决方案
/app/code/core/Mage/Sales/Model/Quote.php
是报价对象的 Quote 类
/app/code/core/Mage/Sales/Model/Quote/Address.php
是任何报价地址对象的报价地址类
报价对象通常包含 2 个地址对象,但如果存在多个递送地址,则可以包含更多地址对象。
关于“collecttotals”方法:让我们首先了解每个方法及其用途:
该方法在 Mage_Sales_Model_Quote
, 是初始入口点 Totals Collector
子系统,并由购物车保存启动,
(这允许您将类方法注入购物车计算中,以影响购物车总计的结果 - 例如:购物车折扣的计算)
代码流程如下:
Mage_Checkout_Model_Cart::save()
Mage_Sales_Model_Quote::collectTotals()
<---收集器子系统的入口点
Mage_Sales_Model_Quote_Address::collectTotals()
<-- 通过报价收集总计对象中的循环来调用附加到报价对象的每个地址。
现在,在地址collecttotals方法中,执行一个循环,使用所有系统定义的“收集器”,调用每个类/方法,从而允许通过额外的计算来调整订单的总计(请记住,所有总计都挂在地址上)对象,而不是实际的报价对象,它允许 magento 对多个地址执行结帐)
foreach ($this->getTotalCollector()->getCollectors() as $model) {
$model->collect($this);
}
可能的“收藏家”列表如下:
您可以通过模块配置注入自己的总计收集器,并且必须有一个 collect
方法作为入口点。
<sales>
<quote>
<totals>
<giftpromo>
<class>giftpromo/promo_gift</class>
<after>discount</after>
<before>tax,grand_total</before>
<sort_order>12410</sort_order>
</giftpromo>
</totals>
</quote>
</sales>
现在,考虑所有这些信息以及触发的事件:
sales_quote_collect_totals_before:在加载任何地址对象之前被触发,并且总计收集器被操作
sales_quote_address_collect_totals_before:在每个地址对象运行潜在收集器对象列表之前,在报价地址对象内触发。
不知道你的最终游戏,我无法确定哪个是适合你的,但是,我也建议考虑是否两者都不正确,并且你最适合为游戏添加一个新的收集器总计收集系统
我希望这些信息可以帮助您确定扩展功能的正确方法并提供稳定的解决方案。