public function remove(Buyable $buyable, $quantity = null, $filter = array())
{
$order = $this->current();
if (!$order) {
return $this->error(_t("ShoppingCart.NoOrder", "No current order."));
}
// If an extension throws an exception, error out
try {
$order->extend("beforeRemove", $buyable, $quantity, $filter);
} catch (Exception $exception) {
return $this->error($exception->getMessage());
}
$item = $this->get($buyable, $filter);
if (!$item) {
return false;
}
//if $quantity will become 0, then remove all
if (!$quantity || $item->Quantity - $quantity <= 0) {
$item->delete();
$item->destroy();
} else {
$item->Quantity -= $quantity;
$item->write();
}
// If an extension throws an exception, error out
// TODO: There should be a rollback
try {
$order->extend("afterRemove", $item, $buyable, $quantity, $filter);
} catch (Exception $exception) {
return $this->error($exception->getMessage());
}
$this->message(_t("ShoppingCart.ItemRemoved", "Item has been successfully removed."));
return true;
}