我需要更改 Magento 默认工作流程。因此,我应该在客户购买商品后立即自动创建运费。(当客户看到收据页面时)。我不确定我应该从哪里开始。我开始在谷歌上搜索一些扩展名,但现在没有运气。这就是我来这里的原因。有谁知道我可以从哪里开始解决这个问题?谢谢!
3 回答
你不应该把这种代码放在视图文件中。除了一般来说这是不好的做法,正如@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的一个示例,因此大部分功劳归于他们。
我找到了解决方案。我想这不是最好的方法,但它确实有效。
在文件 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);
}
?>
这将在收据页面上为订单添加运费。
将代码放入模板是一个非常糟糕的主意:它将运输代码添加到您的模板/视图中。此功能不属于那里。(例如:如果付款在 5 分钟后确认,则无效)。
解决方案是为 Payment-Success 事件编写一个观察者:http: //inchoo.net/ecommerce/magento/magento-orders/automatically-invoice-ship-complete-order-in-magento/