【问题标题】:Magento - Cron job stops working while adding a function for order status changeMagento - Cron 作业在添加订单状态更改功能时停止工作
【发布时间】:2016-07-19 22:30:22
【问题描述】:

我正在使用 Magento 1.9.2,并且正在开发自定义扩展。

这是我的扩展配置文件:

<?xml version="1.0"?>
<config>
<frontend>
    <layout>
        <updates>
            <automatedstatus>
                <file>automatedstatus.xml</file>
            </automatedstatus>
        </updates>
    </layout>
</frontend>
  <modules>
    <VivasIndustries_AutomatedStatus>
      <version>1.0.0</version>
    </VivasIndustries_AutomatedStatus>
  </modules>
  <global>
    <models>
        <automatedstatus>
            <class>VivasIndustries_AutomatedStatus_Model</class>
            <resourceModel>vivasindustries_automatedstatus_resource</resourceModel>
        </automatedstatus>
        <vivasindustries_automatedstatus_resource>
        <class>VivasIndustries_AutomatedStatus_Model_Resource</class>
        <entities>
            <automatedstatus>
            <table>VivasIndustries_AutomatedStatus</table>
            </automatedstatus>
        </entities>
        </vivasindustries_automatedstatus_resource>
    </models>
    <resources>
        <automatedstatus_setup>
            <setup>
                <module>VivasIndustries_AutomatedStatus</module>
            </setup>
            <connection>
                 <use>core_setup</use>
             </connection>
        </automatedstatus_setup>
        <automatedstatus_read>
            <connection>
                <use>core_read</use>
            </connection>
        </automatedstatus_read>
        <automatedstatus_write>
            <connection>
                <use>core_write</use>
            </connection>
        </automatedstatus_write>
    </resources>    
    <helpers>
        <automatedstatus>
            <class>VivasIndustries_AutomatedStatus_Helper</class>
        </automatedstatus>
    </helpers>
    <blocks>
        <automatedstatus>
             <class>VivasIndustries_AutomatedStatus_Block</class>
        </automatedstatus>
    </blocks>
  </global>
    <crontab>
        <jobs>
            <automatedstatus>
                <schedule>
                    <cron_expr>*/1 * * * *</cron_expr>
                </schedule>
                <run>
                    <model>automatedstatus/observer::setStatus</model>
                </run>
            </automatedstatus>
        </jobs>
    </crontab>  
  <adminhtml>
    <acl>
        <resources>
            <all>
                <title>Allow Everything</title>
            </all>
            <admin>
                <children>
                    <system>
                        <children>
                            <config>
                                <children>
                                    <automatedstatusadmin>
                                        <title>Vivas - All</title>
                                    </automatedstatusadmin>
                                </children>
                            </config>
                        </children>
                    </system>
                </children>
            </admin>
        </resources>
    </acl>  
    </adminhtml>
    <admin>
        <routers>
            <adminhtml>
                <args>
                    <modules>
                        <VivasIndustries_AutomatedStatus before="Mage_Adminhtml">VivasIndustries_AutomatedStatus_Adminhtml</VivasIndustries_AutomatedStatus>
                    </modules>
                </args>
            </adminhtml>
        </routers>
    </admin>
</config> 

出于开发目的,我已将 cron 作业设置为每分钟运行一次。
这是我的observer.php

class VivasIndustries_AutomatedStatus_Model_Observer
{
   public function setStatus() {
        Mage::log("The order status was changed!");
    }
}

像这样每分钟我都可以通过看到 The order status was changed! 消息添加到我的 system.log 文件中来看到 cron 作业完成

但是当我把它改成这样时:

<?php

class VivasIndustries_AutomatedStatus_Model_Observer
{
   public function setStatus() {
        $orderId = "100005082";
        $order = Mage::getModel('sales/order')->load($orderId);
        $order->setState(Mage_Sales_Model_Order::STATE_COMPLETE, true);
        $order->save();
        Mage::log("The order status was changed!");
    }
}

system.log 文件中不再添加The order status was changed! 消息,订单状态也没有改变。

我很确定问题来自订单状态更改的代码。

我的错误在哪里,我该如何解决?

提前致谢!

【问题讨论】:

    标签: php magento cron


    【解决方案1】:

    当你使用 $order->setState(Mage_Sales_Model_Order::STATE_COMPLETE, true); Magento 抛出异常“不能手动设置订单状态“完成”。

    因此您需要更改手动设置状态的方式。请试试这个

    $orderId = "100005082";
    $order = Mage::getModel('sales/order')->loadByIncrementId($orderId);
    $order->setData('state',Mage_Sales_Model_Order::STATE_COMPLETE);
    $order->addStatusToHistory(Mage_Sales_Model_Order::STATE_COMPLETE);
    $order->save();

    【讨论】:

      【解决方案2】:

      您必须使用 loadByIncrementId() 而不是 load()。

      $order = Mage::getModel('sales/order')->loadByIncrementId($orderId);
      

      实际上,在 Magento 中,订单状态“完成”不能手动设置。它要求订单首先创建发票和发货。如果你真的想把它标记为完成,你可以这样做:

      public function setStatus() {
          $orderId = "100005082";
          $order = Mage::getModel('sales/order')->loadByIncrementId($orderId);
          if (!$order->getId()) {
              return false;
          }
      
          if (!$order->canInvoice()) {
              return false;
          }
      
          $savedQtys = array();
          $invoice = Mage::getModel('sales/service_order', $order)->prepareInvoice($savedQtys);
          if (!$invoice->getTotalQty()) {
              return false;
          }
          $invoice->setRequestedCaptureCase(Mage_Sales_Model_Order_Invoice::CAPTURE_OFFLINE);
          //create invoice
          $invoice->register();
      
          $invoice->getOrder()->setCustomerNoteNotify(false);
          $invoice->getOrder()->setIsInProcess(true);
      
          $transactionSave = Mage::getModel('core/resource_transaction')
                  ->addObject($invoice)
                  ->addObject($invoice->getOrder());
      
          $transactionSave->save();
      
          //create shipment
          $shipment = $order->prepareShipment();
          if ($shipment) {
              $shipment->register();
              $order->setIsInProcess(true);
      
              $transaction_save = Mage::getModel('core/resource_transaction')
                      ->addObject($shipment)
                      ->addObject($shipment->getOrder())
                      ->save();
          }
      }
      

      然后订单状态会自动设置为COMPLETE。

      【讨论】:

      • 我仍然看不到日志文件中的消息,订单状态也没有改变。
      • 这是因为订单状态“完成”不应该手动设置。使订单状态 COMPLETE 是首先创建发票和发货,然后订单状态自动获取 COMPLETE 状态。尝试将其更改为 PROCESSING,而不是 COMPLETE:$order-&gt;setState(Mage_Sales_Model_Order::STATE_PROCESSING, true);
      猜你喜欢
      • 2011-05-28
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-15
      • 2016-10-31
      相关资源
      最近更新 更多