Magento – 通过 cronjob 以编程方式重新排序多个订单
Magento – Programmatically reorder multiple orders by cronjob
我想通过 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
class 得到了
使用 Mage::getSingleton('adminhtml/session_quote')
的会话,
它总是从 Magento 注册表中获取相同的实例。所以
您正在尝试清除另一个会话实例。
即使您尝试从
Magento 注册表使用:
Mage::getSingleton('adminhtml/session_quote')->clear()
, 会有
仍然是一个问题。作为 Mage_Adminhtml_Model_Session_Quote
class
没有定义这个方法,它最终会调用
Varien_Object->unsetData()
,仅执行此操作:$this->_data = array();
但是Mage_Adminhtml_Model_Session_Quote
中的信息class
存储在 $_quote
、$_customer
、$_store
和 $_order
属性中,
所以它们实际上并没有被清除,而是持续存在。
我通过在每个订单之前删除 Magento 注册表中的 Mage_Adminhtml_Model_Session_Quote
实例解决了这个问题,因此它需要为每个订单创建一个新实例。
只需在循环开头添加:
Mage::unregister('_singleton/adminhtml/session_quote');
干杯! ;)
我想通过 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
class 得到了 使用Mage::getSingleton('adminhtml/session_quote')
的会话, 它总是从 Magento 注册表中获取相同的实例。所以 您正在尝试清除另一个会话实例。 即使您尝试从 Magento 注册表使用:
Mage::getSingleton('adminhtml/session_quote')->clear()
, 会有 仍然是一个问题。作为Mage_Adminhtml_Model_Session_Quote
class 没有定义这个方法,它最终会调用Varien_Object->unsetData()
,仅执行此操作:$this->_data = array();
但是
Mage_Adminhtml_Model_Session_Quote
中的信息class 存储在$_quote
、$_customer
、$_store
和$_order
属性中, 所以它们实际上并没有被清除,而是持续存在。
我通过在每个订单之前删除 Magento 注册表中的 Mage_Adminhtml_Model_Session_Quote
实例解决了这个问题,因此它需要为每个订单创建一个新实例。
只需在循环开头添加:
Mage::unregister('_singleton/adminhtml/session_quote');
干杯! ;)