Magento – 通过 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类得到了会话通过使用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属性中,所以他们实际上并没有被清除,而是坚持下去。

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

只需在循环开始时添加以下内容:

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

干杯!;)

最新更新