1

我需要更改 Magento 默认工作流程。因此,我应该在客户购买商品后立即自动创建运费。(当客户看到收据页面时)。我不确定我应该从哪里开始。我开始在谷歌上搜索一些扩展名,但现在没有运气。这就是我来这里的原因。有谁知道我可以从哪里开始解决这个问题?谢谢!

4

3 回答 3

1

你不应该把这种代码放在视图文件中。除了一般来说这是不好的做法,正如@user2729065 提到的:如果客户在付款后没有返回感谢页面,代码将不会运行。更好的是创建一个带有观察者的自定义模块。为此,请将以下代码添加到您的模块 etc/config.xml 文件中:

<global>
    <events>
        <sales_order_invoice_pay>
            <observers>
                <[my]_[module]_automatically_complete_order>
                    <class>[module]/observer</class>
                    <method>automaticallyShipCompleteOrder</method>
                </[my]_[module]_automatically_complete_order>
            </observers>
        </sales_order_invoice_pay>
    </events>
</global>

将 my_module 更改为您的模块名称。这将在支付发票时触发。

然后在 My/Module/Model/Observer.php 中创建 Observer

<?php

class My_Module_Model_Observer
{
/**
 * Mage::dispatchEvent($this->_eventPrefix.'_save_after', $this->_getEventData());
 * protected $_eventPrefix = 'sales_order';
 * protected $_eventObject = 'order';
 * event: sales_order_invoice_pay
 */
public function automaticallyShipCompleteOrder($observer)
{
    $order = $observer->getEvent()->getInvoice()->getOrder();

    if ($order->getState() == Mage_Sales_Model_Order::STATE_PROCESSING) {

        try {
            $shipment = $order->prepareShipment();
            $shipment->register();

            $order->setIsInProcess(true);
            $order->addStatusHistoryComment('Shippment automatically created.', false);

             Mage::getModel('core/resource_transaction')
                ->addObject($shipment)
                ->addObject($shipment->getOrder())
                ->save();
        } catch (Exception $e) {
            $order->addStatusHistoryComment('Could not automaticly create shipment. Exception message: '.$e->getMessage(), false);
            $order->save();
        }
    }

    return $this;
}

}

这将检查订单是否仍在处理中(付款后的状态。)。如果是这样,请尝试创建货件。创建货件后,订单将自动将其状态更改为已完成。

如果您希望在下订单后(在创建发票并付款之前)直接创建货件,请更改

<sales_order_invoice_pay> 

<sales_order_place_after> 

在 config.xml 中。因为这个观察者返回的是订单而不是发票,所以也要改变:

$order = $observer->getEvent()->getInvoice()->getOrder();

$order = $observer->getEvent()->getOrder();

代码基于Incho的一个示例,因此大部分功劳归于他们。

于 2017-01-12T15:02:51.687 回答
0

我找到了解决方案。我想这不是最好的方法,但它确实有效。

在文件 your_theme_name/template/checkout/success.phtml

添加此代码

<?php
$orderId = Mage::getSingleton('checkout/session')->getLastRealOrderId();
$order = Mage::getModel('sales/order') -> loadByIncrementId($orderId);

if ($order -> canShip()) {
    $itemQty = $order -> getItemsCollection() -> count();
    $shipment = Mage::getModel('sales/service_order', $order) -> prepareShipment($itemQty);
    $shipment = new Mage_Sales_Model_Order_Shipment_Api();
    $shipmentId = $shipment -> create($orderId);
}
?>

这将在收据页面上为订单添加运费。

于 2012-11-16T10:17:08.817 回答
0

将代码放入模板是一个非常糟糕的主意:它将运输代码添加到您的模板/视图中。此功能不属于那里。(例如:如果付款在 5 分钟后确认,则无效)。

解决方案是为 Payment-Success 事件编写一个观察者:http: //inchoo.net/ecommerce/magento/magento-orders/automatically-invoice-ship-complete-order-in-magento/

于 2013-08-29T11:29:22.040 回答