如何在不删除购物车中现有产品的情况下取消订单并将产品恢复到购物车中


How to Cancel an Order and Restore Products into Cart without removing existing products in Cart

我遇到这样的情况,

我试着下订单,去了支付网关,我就这样离开了交易。

在我的Magento中,订单状态为"待定付款",我在管理面板中创建了一个按钮,点击按钮后会发生以下事情。

我想将这些产品恢复到客户购物车中,而不从购物车中删除任何其他产品(如果有的话)。

请查看我的代码。

      <?php $order_id = 224;
      $_order = Mage::getModel('sales/order')->load($order_id);
      if (!$_order->isCanceled() && !$_order->hasInvoices()) {
          $_order->cancel();
          $_order->addStatusToHistory(Mage_Sales_Model_Order::STATE_CANCELED, $message);
          $_order->save();
          $quote = Mage::getModel('sales/quote')->load($_order->getQuoteId());
          $session1 = Mage::getSingleton('checkout/session');
          if ($quote->getId()) {
             $quote->setIsActive(true)->save();
             $session1->setQuoteId($_order->getQuoteId());
          }
          Mage::getSingleton('core/session')->setFailureMsg('order_failed');
          Mage::getSingleton('checkout/session')->setFirstTimeChk('0');
      } ?>

因为这个代码,如果我的购物车里有任何产品,我会从购物车里取出这些产品。

但我担心的是,在不从我的购物车中丢失任何产品的情况下,我想在客户购物车中恢复这些产品。

有什么想法吗?

我该怎么做?

您可以将其用作独立文件,也可以在任何地方调用其方法来复制现有客户报价,并将其设置为该客户的活动报价:

require_once( 'app/Mage.php' );
umask(0);
Mage::app('default');
$sCustomerId = 1;
$oCustomer   = Mage::getModel( 'customer/customer' )->load( $sCustomerId );
$sStoreId    = $oCustomer->getData( 'store_id' );
$oQuotes     = Mage::getModel( 'sales/quote' )->getCollection();
$oQuotes->addFieldToFilter( 'customer_id', $sCustomerId );
foreach( $oQuotes as $oQuote )
{
    var_dump( $oQuote->getData( 'is_active' ) );
    $oOrders = Mage::getModel( 'sales/order' )->getCollection();
    $oOrders->addFieldToFilter( 'quote_id', $oQuote->getId() );
    var_dump( $oOrders->count() );
    foreach( $oOrders as $oOrder )
    {
        // If an order is in status...
        if( $oOrder->getData( 'status' ) == 'pending' )
        {
            // Copy the quote over and make it active for your customer.
            $oRevertedQuote = Mage::getModel( 'sales/quote' );
            $oRevertedQuote->merge( $oQuote );
            $oRevertedQuote->setStoreId( $sStoreId );
            $oRevertedQuote->setData( 'is_active', 1 );
            $oRevertedQuote->assignCustomer( $oCustomer );
            $oRevertedQuote->collectTotals()->save();
            // Limit to one conversion at a time?
            break 2;
        }
    }
}