Вот обходной путь, чтобы сделать это. Это ограничено, и это должно быть исправлено, потому что я не знаю, принимает ли это во внимание акции и другие специальные правила. Он взрывает элементы порядка с qty> 1 и создает новые строки с qty = 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>
Наблюдатель получает 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();
}