public function applyRule(ISC_QUOTE $quote) { $applies = false; $items = $quote->getItems(); foreach($items as $item) { // Skip items that have a parent ID or don't match the product ID necessary if($item->getParentId() || $item->getProductId() != $this->prodids) { continue; } $quantity = $item->getQuantity(); $freeItems = 0; while ($quantity >= $this->amount) { $quantity = $quantity - $this->amount; $freeItems += $this->amount_free; } foreach($items as $subItem) { // If the product already exists in the cart, then we can update it instead if($subItem->getParentId() != $item->getId()) { continue; } if($freeItems == 0) { $quote->removeItem($subItem->getId()); } else { try { $subItem->setQuantity($freeItems); } catch(ISC_QUOTE_EXCEPTION $e) { $freeItems = 0; continue; } $this->banners[] = sprintf(getLang($this->getName().'DiscountMessage'), $freeItems, $subItem->getName()); $freeItems = 0; $applies = true; } } if($freeItems > 0) { // Still need to add a free item to the cart try { $newItem = clone $item; $newItem ->setBasePrice(0, true) ->setQuantity($freeItems) ->setParentId($item->getId()) ->removeGiftWrapping(); $quote->addItem($newItem, false); $this->banners[] = sprintf(getLang($this->getName().'DiscountMessage'), $freeItems, $item->getName()); $applies = true; } catch(ISC_QUOTE_EXCEPTION $e) { $applies = false; continue; } } } return $applies; }