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

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

有两个问题:

  1. 您正在呼叫 Mage::getModel('adminhtml/session_quote')->clear(), 它获取会话的新实例并尝试清除它。 但是 Mage_Adminhtml_Model_Sales_Order_Create class 得到了 使用 Mage::getSingleton('adminhtml/session_quote') 的会话, 它总是从 Magento 注册表中获取相同的实例。所以 您正在尝试清除另一个会话实例。
  2. 即使您尝试从 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');

干杯! ;)