【问题标题】:Magento – Programmatically reorder multiple orders by cronjobMagento – 通过 cronjob 以编程方式重新排序多个订单
【发布时间】:2015-01-19 16:18:50
【问题描述】:

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

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

【问题讨论】:

  • 说清楚:我想要的是通过他们的 id 从现有订单创建新订单。新订单需要包含旧订单的所有信息(商品、客户、运输信息等)。不幸的是,Magento 在遍历订单 ID 时保留了客户信息,因此电子邮件都发送给了第一个订单的客户。

标签: magento-1.6


【解决方案1】:

有两个问题:

  1. 你打电话给Mage::getModel('adminhtml/session_quote')-&gt;clear(), 它获取会话的新实例并尝试清除它。 但是Mage_Adminhtml_Model_Sales_Order_Create 类得到了 使用Mage::getSingleton('adminhtml/session_quote') 进行会话, 它总是从 Magento 注册表中获取相同的实例。所以 您正在尝试清除另一个会话实例。
  2. 即使您尝试从 Magento 注册表使用: Mage::getSingleton('adminhtml/session_quote')-&gt;clear(),会有 仍然是个问题。作为Mage_Adminhtml_Model_Session_Quote 类 没有定义这个方法,它最终调用 Varien_Object-&gt;unsetData(),只做这个:$this-&gt;_data = array();

    但是Mage_Adminhtml_Model_Session_Quote类中的信息 存储在$_quote$_customer$_store$_order 属性中, 所以它们实际上并没有被清除,而是持续存在。

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

只需在循环的开头添加这个:

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

干杯! ;)

【讨论】:

  • 谢谢,这对我帮助很大!!!一旦我获得一些声誉,您就会获得支持;)
猜你喜欢
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
  • 2013-03-19
相关资源
最近更新 更多