Magento - 通过cronjob以编程方式重新排序多个订单

时间:2015-01-19 16:18:50

标签: magento-1.6

我想通过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)。当然,这也会影响订单确认电子邮件,因此它们都被发送到同一个电子邮件地址...而且,订单商品似乎在购物车中加起来,所以重新订购的最后一个订单包含所有订购以前订单的商品......我做错了什么?

我感谢我能得到的每一个帮助!谢谢!

1 个答案:

答案 0 :(得分:3)

有两个问题:

  1. 您正在呼叫Mage::getModel('adminhtml/session_quote')->clear(), 它获取会话的新实例并尝试清除它。 但是Mage_Adminhtml_Model_Sales_Order_Create类获得了 使用Mage::getSingleton('adminhtml/session_quote')进行会话, 它总是从Magento注册表中获取相同的实例。所以 您正试图清除另一个会话实例。
  2. 即使您尝试从中清除正确的会话实例 使用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属性中, 所以他们实际上并没有被清除,而是坚持下去。

  3. 我通过在每个订单之前删除Magento注册表中的Mage_Adminhtml_Model_Session_Quote实例来解决问题,因此需要为每个订单创建一个新实例。

    只需在循环开头添加:

    Mage::unregister('_singleton/adminhtml/session_quote');
    

    干杯! ;)