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();
}

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

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

1 ответ

Решение

Есть две проблемы:

  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');

Ура!;)

Другие вопросы по тегам