【问题标题】:Magento manipulate weight on checkoutMagento 在结账时操纵重量
【发布时间】:2017-03-21 17:06:04
【问题描述】:

我在 Magento 1.9 中有简单的产品,我可以合并发货,并希望根据 sku 在结帐时更改总运费(以及在购物车视图中进行运费估算等计算)。例如,如果购买了一个或两个具有正确 sku 的小部件,它们的总重量为 1 磅。如果购买了 3 到 5 个具有正确 sku 的小部件,它们的总重量为 2 磅等。如果包含所有物品,Tablerates 可以处理这个问题。但是,我必须将其限制为由 sku 确定的某些项目。

所以目前在 Magento 中,每件商品的重量为 1 磅,总重量为 number of items * 1 lbs。我找到了显示总重量或在数据库中更新项目重量的答案,但没有一个能满足这些要求。我对 Magento 非常陌生,并且正在努力实现这一目标。如果您回复建议的代码更改,能否具体说明应该编辑的文件位置?

编辑

按照 Mladen Ilić 的建议,我提出了以下代码,用于计算事件 sales_quote_collect_totals_after 事件的总权重。 如何将调整后的新重量发送给 Magneto 以在结帐时使用?

/app/etc/modules/Weight_Extension.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Weight_Extension>
            <codePool>local</codePool>
            <active>true</active>
        </Weight_Extension>
    </modules>
</config>

/app/code/locale/Weight/Extension/etc/config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Weight_Extension>
            <version>0.0.1</version>
        </Weight_Extension>
    </modules>
    <global>
        <models>
            <weight_extension>
                <class>Weight_Extension_Model</class>
            </weight_extension>
        </models>
        <events>
            <sales_quote_collect_totals_after>
                <observers>
                    <weight_extension>
                        <class>weight_extension/observer</class>
                        <method>adjustTotalWeight</method>
                    </weight_extension>
                </observers>
            </sales_quote_collect_totals_after>
        </events>
    </global>
</config>

/app/code/locale/Weight/Extension/Model

<?php 
class Weight_Extension_Model_Observer
{
    public function adjustTotalWeight($observer) 
    {
        $items = Mage::getSingleton('checkout/session')->getQuote()->getAllItems();

        $combinedItems = 0;
        foreach($items as $item)
        {
            if($item->getSku() == 1 || $item->getSku() == 2)
            {
                 $combinedItems++;
            }
        }

        if($combinedItems > 0 && $combinedItems < 3)
            $weight = 1;
        if($combinedItems >= 3 && $combinedItems < 6)
            $weight = 2;

        //send new $weight to Magento and persist through checkout?
    } 
}

如何将调整后的新重量发送给 Magneto 以在结账时使用?

【问题讨论】:

    标签: magento magento-1.9


    【解决方案1】:

    Magento 计算用于在Mage_Sales_Model_Quote_Address_Total_Shipping::collect 中获取运费的重量。

    在收集送货地址总数时,项目被循环并累积它们的重量,然后设置为地址对象。

    话虽如此,你必须小心你将如何改变这种行为。乍一看,似乎使用sales_quote_collect_totals_after 事件可能是正确的方法。

    当触发事件时,获取所有送货地址项目,遍历它们并使用自定义逻辑来计算重量。

    祝你好运。

    【讨论】:

    • 我相信 sales_quote_collect_totals_after 事件会被添加到 config.xml 文件中?我看到一些 config.xml 文件。该文件的正确位置是哪个?其次,我认为必须添加一个新的观察者,该事件将调用。应该将自定义模型观察者添加到什么位置?
    • atwix.com/magento/overriding-observers - 随机谷歌结果。我与作者没有任何关系。只是第一部分如何设置观察者,忽略覆盖它的部分。
    • 谢谢姆拉登。我可以创建一个新的总重量。但是,我不知道如何告诉 Magneto 使用新的重量进行结帐。我已经更新了我原来帖子中的代码。
    • 您应该在送货地址对象上设置新计算的重量。您已经使用会话来获取客户的报价。现在使用该报价获取送货地址 - $quote-&gt;getShippingAddress()-&gt;setWeight($weight).
    • 是否有关于 $quote(和其他此类对象)各种属性的文档?
    【解决方案2】:

    您在 adminhtml 上下文中编写事件,您必须将其更改为 frontend

    【讨论】:

    • 嗨,灵魂。我让观察者开火并创建一个新的重量。但我不知道如何将新重量发送到 Magento,以便可以通过结帐使用。我已经在原帖中更新了我的代码。
    • 您应该观察 sales_quote_collect_totals_before 事件。在您的循环中,您可以将权重设置为 0 $item->setWeight(0); 并将计算出的权重放在最后一项上。
    • 谢谢@Soul。那行得通。 magento 中所有可用事件和各种功能的文档在哪里?我只能找到 REST 和 SOAP API 文档 here 这对于制作自定义观察者没有帮助。
    • 你可以使用这个sn-p:gist.github.com/AurelienLavorel/…
    猜你喜欢
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多