2012-02-21 49 views
1

我需要为Magento中的每个产品单元创建一个新的order_item项目。我的意思是,如果某人购买了同一产品的两个单元,那么我需要在sales_flat_order_item表中创建两行,每行的数量为1。在Magento中为每个产品单元创建新订单项目

这可能吗?

谢谢!

+0

你将不得不重新编写核心来实现这一目标。您也许可能会创建“Item_1,Item_2,Item_3,...”的产品副本。然后在保存到目录之前,通过迭代器循环,使用qty作为计数器,并用“Item_n”产品替换每个产品,并将原来的数量改为1? – ShaunOReilly 2012-02-22 00:05:46

+0

谢谢你的回答,ShaunOReilly,但我想避免重写核心模块...无论如何,谢谢! – PauGNU 2012-02-22 21:28:28

+0

我的意思是重写,就像在扩展核心模块一样,使用你自己的新模块,这样你就不会在物理上改变核心代码。 – ShaunOReilly 2012-02-22 22:09:31

回答

1

这是一个解决方法。这是有限的,它应该纠正,因为我不知道它是否考虑到促销和其他特殊规则。它用qty> 1展开订单商品,并用qty = 1创建新行;

  1. 与检查sales_order_place_after观察者创建模块:

    <events> 
    <sales_order_place_after> 
         <observers> 
          <explodeitems> 
           <type>singleton</type> 
           <class>Company_OrderObservers_Model_ExplodeOrderItem</class> 
           <method>explodeOrderItems</method> 
          </explodeitems> 
         </observers> 
        </sales_order_place_after> 
        <events> 
    
  2. 观察者得到IDS /数量和删除当前订单项目。然后,它创建我们得到的参数新:

    function explodeOrderItems($observer) 
    { 
    
    $order= $observer->getEvent()->getOrder(); 
    
    
    $items = $order->getAllVisibleItems(); 
    $products = array(); 
    
    foreach ($items as $k => $item) 
    { 
        if ($item->getProductType() == Mage_Catalog_Model_Product_Type::TYPE_SIMPLE) 
        { 
         $itemqty = $item->getQtyOrdered(); 
         if ($itemqty > 1) 
         { 
          for ($i=0; $i < $itemqty; $i++) 
          { 
           $products[$i]['id'] = $item->getProductId(); 
           $products[$i]['qty'] = 1; 
          } 
          $item->delete(); 
         } 
        } 
        else 
         $item->delete(); 
    } 
    
    $customer = Mage::getSingleton('customer/session')->getCustomer(); 
    $storeId = $customer->getStoreId(); 
    
    if ($products) 
    { 
        foreach ($products as $product) 
        { 
         $_product = Mage::getModel('catalog/product')->load($product['id']); 
         $price = $_product->getPrice(); 
         $orderItem = Mage::getModel('sales/order_item') 
            ->setStoreId($storeId) 
            ->setQuoteItemId(0) 
            ->setQuoteParentItemId(NULL) 
            ->setProductId($product['id']) 
            ->setProductType($_product->getTypeId()) 
            ->setQtyBackordered(NULL) 
            ->setTotalQtyOrdered(1) 
            ->setQtyOrdered(1) 
            ->setName($_product->getName()) 
            ->setSku($_product->getSku()) 
            ->setPrice($price) 
            ->setBasePrice($price) 
            ->setOriginalPrice($price) 
            ->setRowTotal($price) 
            ->setBaseRowTotal($price); 
    
         $order->addItem($orderItem); 
        } 
        $order->save(); 
    }