This is more of a hack. Warning: you could accidentally delete items if you're not careful.
The getAllItems
method filters items out of the item collection and returns it.
In order to filter items out of the getAllItems
array you simply need to mark the desired items in the collection as deleted:
foreach($order->getAllItems() as $item) {
$item->isDeleted(true);
}
Subsequent calls to getAllItems
will return items not marked as deleted.
Now, where things get hairy is that if you call save
on that item, it will delete it. This is dangerous.
So, what I suggest instead, is that you build your own collection with only the data that you know that you want. For instance:
$collection = new Varien_Data_Collection();
And then populate it:
foreach($order->getAllItems() as $item) {
//some condition
$collection->addItem($item);
}
Now your new collection only contains the data that you want, and you can hand that around.
I hope you do not need to remove all items. so there should be some condition over delete item and update order within it.
Following Works for me.
Just have done conditional update for order and delete for the item.and removed item price from base_subtotal too.
$_order = Mage::getModel('sales/order')->load(order_id);
$items = $_order->getAllItems();
foreach ($items as $item){
$base_grand_total = $_order->getBaseGrandTotal();
$base_subtotal = $_order->getBaseSubtotal();
$base_tva = $_order->getBaseTaxAmount();
$grand_total = $_order->getGrandTotal();
$subtotal = $_order->getSubtotal();
$tva = $_order->getTaxAmount();
$base_subtotal_incl_tax = $_order->getBaseSubtotalInclTax();
$subtotal_incl_tax = $_order->getSubtotalInclTax();
$total_item_count = $_order->getTotalItemCount();
if($item->getSku()=='test-default'){
$item_price = $item->getPrice();
$item_tva = $item->getTaxAmount();
$item->delete();
$_order->setBaseGrandTotal($base_grand_total-$item_price-$item_tva);
$_order->setBaseSubtotal($base_subtotal-$item_price);
$_order->setBaseTaxAmount($base_tva-$item_tva);
$_order->setGrandTotal($grand_total-$item_price-$item_tva);
$_order->setSubtotal($subtotal-$item_price);
$_order->setTaxAmount($tva-$item_tva);
$_order->setBaseSubtotalInclTax($base_subtotal_incl_tax-$item_price);
$_order->setSubtotalInclTax($subtotal_incl_tax-$item_price);
$_order->setTotalItemCount(count($items)-1);
$_order->save();
}
}
Best Answer
You can use following code to delete the order.
Note: I used the objectManager for the demonstration. Always use dependency injection.