2014-02-25 146 views
0

因此,这里是我的问题: 如果客户下了一个新的订单,并且他/她有一个具有延期交货的现有挂单,那么这两个订单必须合并。所以我在sales_model_service_quote_submit_before事件中创建了一个观察者。这个想法是,在这位观察者中,我检查了客户的电子邮件,并检查他/她是否有现有的挂单。如果存在这样的订单,我将旧订单的项目放入新订单,并删除/取消旧订单。这里是我的功能:Magento:将商品添加到新订单

public function salesQuoteSubmitBefore($observer){ 
$customerEmail = $observer->getQuote()->getData('customer_email'); 
    $customer = Mage::getModel("customer/customer"); 
    $customer->setWebsiteId(Mage::app()->getStore()); 
    $customer->loadByEmail($customerEmail); 

    $oldOrder = Mage::getResourceModel('sales/order_collection') 
    ->addFieldToSelect('increment_id') 
    ->addFieldToFilter('customer_id', $customer->getId()) 
    ->addFieldToFilter('state', array('in' => array('new'))) 
    ->addFieldToFilter('status', array('in' => array('pending'))) 
    ->setOrder('created_at', 'desc') 
    ->setPageSize(1); 
    $oldID = $oldOrder->getData(); 

    if($oldID[0]['increment_id'] != '' && $oldID[0]['increment_id'] > 0){ 
     $mergeOrder = false; 
     $order = Mage::getModel('sales/order')->loadByIncrementId($oldID[0]['increment_id']); 
     foreach($order->getAllItems() as $item){ 
      $product = Mage::getModel('catalog/product')->load($item->getProduct()->getId()); 
      if($product->getStockItem()->getQty() < 0){ 
       $mergeOrder = true; 
      } 
     } 

     if($mergeOrder){ 
      $newOrder = $observer->getOrder(); 
      $quote = $newOrder->getQuote(); 

      $tmp = array(); 
      foreach($order->getAllItems() as $item){ 
       $tmp[] = $item->getSku(); 
       $product = Mage::getModel('catalog/product')->load($item->getProduct()->getId()); 
       $qty = array('qty'=>$item->getQty()); 
       $quote->addProduct($product, new Varien_object($qty)); 
      } 

      foreach($quote->getAllAddresses() as $a){ 
       $a->unsetData('cached_items_nonnominal'); 
       $a->unsetData('cached_items_nominal'); 
      } 

      $quote->setTotalsCollectedFlag(false)->collectTotals(); 
      $quote->save(); 

      $newOrder->setQuote($quote)->save(); 
      $order->setState(Mage_Sales_Model_Order::STATE_CANCELED, true)->save(); 
      //Mage::throwException('obs: '.json_encode($newOrder->getQuote()->getData())); 
     } 
    } 
} 

法师:throwExeption打印新的报价和所有是正确的,数量总计...如果我打印newOrder一切是正确的呢!但是当订单被使用时,旧数据被使用,所以新订单没有旧的项目。

什么或在哪里保存更改的订单/报价,以便新数据用于创建订单?感谢您的帮助!

回答

0

不要在报价中添加产品,请尝试添加购物车。像下面一样

$cart =Mage::getSingleton('checkout/cart'); 
$cart->addProduct($product, array('qty'=>$qty)); 
$cart->save(); 
+0

尝试过,但结果相同。也许我有错误的事件,因为当抛出异常时,订单没有放入,并且在购物车中存在来自先前订单的产品。 – Marko

+1

经过我店的一些研究,我发现一个模块正在覆盖正常的saveOrder函数,并且不会触发相同的事件。当找到新的saveOrder函数时,我创建了一个新事件,并对该函数进行了一些修改。不管怎样,谢谢你 :) – Marko

相关问题