我想通过 cronjob 以编程方式重新排序特定订单,并通过邮件发送订单确认。我的根目录中有一个简单的 php 文件,它每隔一段时间就会由 cronjob 触发:
<?php
include_once 'app/Mage.php';
Mage::app();
//some existing order ids
$orderIds= array('911', '1106', '926');
foreach($orderIds as $orderId){
Mage::unregister('rule_data');
Mage::getModel('adminhtml/session_quote')
->clear();
/* @var Mage_Sales_Model_Order $order */
$order = Mage::getModel('sales/order')->load($orderId)
->setReordered(true);
/* @var Mage_Sales_Model_Quote $quote */
$quote = Mage::getModel('sales/quote')
->setStoreId($order->getStoreId())
->assignCustomer(Mage::getModel('customer/customer')->load($order->getCustomerId()))
->setUseOldShippingMethod(true);
/* @var Mage_Adminhtml_Model_Sales_Order_Create $model */
$model = Mage::getModel('adminhtml/sales_order_create')
->initFromOrder($order)
->setQuote($quote);
/* @var Mage_Sales_Model_Order $newOrder */
$newOrder = $model->createOrder();
$newOrder->setQuoteId($quote->getId())
->sendNewOrderEmail();
$model->getSession()
->clear();
}
到目前为止,它似乎有效,下了新订单并发送电子邮件。但我遇到的问题是,新订单中的客户始终是第一个旧订单中的客户(在本例中为 ID 为 911 的订单)。当然,这也会影响订单确认电子邮件,因此它们都发送到同一个电子邮件地址......此外,订单项似乎在购物车中加起来,因此重新订购的最后一个订单包含以前订单的所有订单项目......我做错了什么?
我感谢我能得到的每一个帮助!谢谢!
有两个问题:
- 你在打电话给
Mage::getModel('adminhtml/session_quote')->clear()
,获取会话的新实例并尝试清除该实例。但是Mage_Adminhtml_Model_Sales_Order_Create
类得到了会话通过使用Mage::getSingleton('adminhtml/session_quote')
,它总是从Magento注册表中获取相同的实例。所以您正在尝试清除另一个会话实例。 -
即使您尝试从Magento注册表使用:
Mage::getSingleton('adminhtml/session_quote')->clear()
,会有仍然是一个问题。作为Mage_Adminhtml_Model_Session_Quote
类不定义此方法,它最终调用Varien_Object->unsetData()
,它只这样做:$this->_data = array();
但是
Mage_Adminhtml_Model_Session_Quote
类中的信息存储在$_quote
、$_customer
、$_store
和$_order
属性中,所以他们实际上并没有被清除,而是坚持下去。
我通过在 Magento 注册表中每个订单之前删除Mage_Adminhtml_Model_Session_Quote
实例来解决问题,以便它需要为每个订单创建一个新实例。
只需在循环开始时添加以下内容:
Mage::unregister('_singleton/adminhtml/session_quote');
干杯!;)