【问题标题】:Programatically create shipment for magento order with tracking - Getting error: Mage_Api_Model_Resource_Abstract->_fault('not_exists')以编程方式为带有跟踪的 magento 订单创建货件 - 出现错误:Mage_Api_Model_Resource_Abstract->_fault('not_exists')
【发布时间】:2016-03-04 11:40:45
【问题描述】:

我以编程方式创建货件并尝试设置跟踪号,如下所示:

// ... snipped; code that prepares shipment data ...

// Create Shipment
$shipment = $order->prepareShipment($item_qtys);
$shipment->register();
$shipment->sendEmail(false)
         ->setEmailSent(false)
         ->save();
$transactionSave = Mage::getModel('core/resource_transaction')
         ->addObject($shipment)
         ->addObject($shipment->getOrder())
         ->save();
$order->save();

// Add Shipment Tracking Number If Available
if (!empty($order_info->TrackingNumber)) {

    var_dump($shipment->getId());
    var_dump($order->getShippingCarrier()->getCarrierCode());
    var_dump($order->getShippingCarrier()->getConfigData('title'));
    var_dump($order_info->TrackingNumber);
    echo "\r\n";

    Mage::getModel('sales/order_shipment_api')
        ->addTrack(
            $shipment->getId(),
            $order->getShippingCarrier()->getCarrierCode(),
            $order->getShippingCarrier()->getConfigData('title'),
            $order_info->TrackingNumber
        );
}

当上述代码执行时,我得到以下输出和异常:

string(7) "1598070"
string(13) "productmatrix"
string(15) "Shipping Option"
string(14) "TEST1234567890"

not_exists - Stack Trace: #0 /var/www/public_html/app/code/core/Mage/Sales/Model/Order/Shipment/Api.php(187): Mage_Api_Model_Resource_Abstract->_fault('not_exists')
#1 /var/www/public_html/app/code/community/Mycompanyname/Mymodulename/controllers/Mymodulename/ApiController.php(1266): Mage_Sales_Model_Order_Shipment_Api->addTrack('1598070', 'productmatrix', 'Shipping Option', 'TEST1234567890')
#2 /var/www/public_html/app/code/community/Mycompanyname/Mymodulename/controllers/Mymodulename/ApiController.php(82): Mycompanyname_Mymodulename_Mymodulename_ApiController->NewOrderShipment('{"MagentoOrderI...')
#3 /var/www/public_html/app/code/community/Mycompanyname/Mymodulename/controllers/Mymodulename/ApiController.php(66): Mycompanyname_Mymodulename_Mymodulename_ApiController->Handle_Request('NewOrderShipmen...', '{"MagentoOrderI...')
#4 /var/www/public_html/app/code/local/Mage/Core/Controller/Varien/Action.php(421): Mycompanyname_Mymodulename_Mymodulename_ApiController->v2Action()
#5 /var/www/public_html/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(254): Mage_Core_Controller_Varien_Action->dispatch('v2')
#6 /var/www/public_html/app/code/core/Mage/Core/Controller/Varien/Front.php(172): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#7 /var/www/public_html/app/code/core/Mage/Core/Model/App.php(354): Mage_Core_Controller_Varien_Front->dispatch()
#8 /var/www/public_html/app/Mage.php(684): Mage_Core_Model_App->run(Array)
#9 /var/www/public_html/index.php(103): Mage::run('default', 'store')
#10 {main}

知道是什么导致了错误吗?这是添加运单号的错误方式吗?

是否可以在创建货件时设置跟踪号?


我也尝试过使用不同的方法来实现这一点:

// If order can be shipped
if ($order->canShip())
{
    // Create shipment
    $shipment = Mage::getModel('sales/service_order', $order)->prepareShipment($item_qtys);
    $shipment = new Mage_Sales_Model_Order_Shipment_Api();
    $shipmentId = $shipment->create($orderId);

    // If tracking number is available
    if (!empty($order_info->TrackingNumber))
    {
        // Add shipment tracking
        $shipment->addTrack(
            $shipmentId,
            $order->getShippingCarrier()->getCarrierCode(),
            $order->getShippingCarrier()->getConfigData('title'),
            $order_info->TrackingNumber
        );
    }
}

这也给了我以下错误:

order_not_exists - 堆栈跟踪:#0 /var/www/public_html/app/code/core/Mage/Sales/Model/Order/Shipment/Api.php(138): Mage_Api_Model_Resource_Abstract->_fault('order_not_exist...')

【问题讨论】:

    标签: php magento magento-1.9


    【解决方案1】:

    我一直在尝试通过具有如此多变化的模型来解决这个问题,但它们都不起作用。我对这种方法很厌倦,所以我使用如下直接 SQL 解决了它:

    // Add Shipment Tracking Number If Available
    if (!empty($order_info->TrackingNumber))
    {
        // Get db resources
        $resource = Mage::getSingleton('core/resource');
        $writeConnection = $resource->getConnection('core_write');
        $shipmentTrackTable = $resource->getTableName('sales_flat_shipment_track');
    
        // Insert tracking manually
        $writeConnection->query(
            "INSERT INTO `$shipmentTrackTable` (`parent_id`, `order_id`, `track_number`, `title`, `carrier_code`, `created_at`, `updated_at`) 
             VALUES (:parent_id, :order_id, :track_number, :title, 'custom', :created_at, :updated_at)",
            array(
                'parent_id'    => $shipment->getId(),
                'order_id'     => $order->getId(),
                'track_number' => $order_info->TrackingNumber,
                'title'        => 'My Module Name',
                'created_at'   => now(),
                'updated_at'   => now(),
            ));
    }
    

    这行得通。

    【讨论】:

      【解决方案2】:

      问题(如 sergio 所建议)是当您尝试调用时:$shipmentId = $shipment->create($orderId);

      在这里,您实际上并没有按照您的评论建议通过订单 ID 发送,但是,查看 Mage_Sales_Model_Order_Shipment_Api create 方法,您需要通过订单 increment_id 而不是 the entity_id,因为这是它如何加载第一行中的订单。

      /**
       * Create new shipment for order
       *
       * @param string $orderIncrementId
       * @param array $itemsQty
       * @param string $comment
       * @param booleam $email
       * @param boolean $includeComment
       * @return string
       */
      public function create($orderIncrementId, $itemsQty = array(), $comment = null, $email = false,
          $includeComment = false
      ) {
          $order = Mage::getModel('sales/order')->loadByIncrementId($orderIncrementId);
      

      如果您将代码更新为: $shipmentId = $shipment->create($order->getIncrementId()); 我希望它能找到正确的顺序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-11
        • 1970-01-01
        • 2016-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-05
        • 2016-01-12
        相关资源
        最近更新 更多