2015-01-19 3 views
0

Я хотел бы программно переупорядочить определенные заказы cronjob и отправить подтверждение заказа по почте. У меня есть простой файл PHP в моем корневом каталоге, который запускаемый cronjob каждый раз в то время:Magento - Программно переупорядочивать несколько заказов 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(); 
} 

Это, кажется, работает до сих пор, новые заказы размещаются и электронные письма отправляются. Но проблема, которую я испытал, заключается в том, что заказчик в новых заказах всегда является одним из первого старого порядка (в этом случае заказ с идентификатором 911). Конечно, это также влияет на электронные письма с подтверждением заказа, поэтому все они отправляются на тот же адрес электронной почты ... Кроме того, элементы заказа, похоже, складываются в корзину, поэтому последний порядок, который переупорядочен, содержит все элементы заказа из предыдущих заказов ... Что я делаю неправильно?

Я ценю каждую помощь, которую я могу получить! Спасибо!

+0

Чтобы было ясно: я хочу создать новые заказы из существующих заказов по их идентификатору. Новые заказы должны содержать всю информацию, имевшуюся у старых (предметы, клиент, информация о доставке и т. Д.). К сожалению, Magento хранит информацию Клиента во время цикла по идентификаторам заказов, поэтому все электронные письма отправляются клиенту первого заказа. – biedert

ответ

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, поэтому они фактически не очищаются, но сохраняются.

Я решил проблему, удалив Mage_Adminhtml_Model_Session_Quote экземпляр в Magento реестра перед каждым из заказов, так что необходимо создать новый для каждого заказа.

Просто добавьте это в начале цикла:

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

Ура! ;)

+0

Спасибо, человек, который мне очень помог !!! Как только я получу какую-то репутацию, вы получите upvote;) – biedert

+0

Рад, что я мог бы помочь :) – cris