在Magento中为每个产品单元创建新的订单商品

时间:2012-02-21 17:10:19

标签: magento

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

这可能吗?

谢谢!

1 个答案:

答案 0 :(得分: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 / qty并删除当前订单商品。然后用我们得到的参数创建新的:

    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();
    }