/** * Quote address gift creation process * * @param Mage_Sales_Model_Quote_Address $address * @return Ionoi_Gift_Model_Rule_Validator * @todo Labels and stop rules processing flag */ public function process($address) { $this->_reset($address); /* @var $quote Mage_Sales_Model_Quote */ $quote = $address->getQuote(); $added = array(); $messages = array(); /* @var $session Mage_Checkout_Model_Session */ $session = Mage::getSingleton('checkout/session'); /* @var $rule Ionoi_Gift_Model_Rule */ foreach ($this->_getRules() as $rule) { // check rule if (array_key_exists($rule->getId(), $this->_appliedRules[$quote->getId()]) || !$this->_canProcessRule($rule, $address)) { continue; } // dispatch event Mage::dispatchEvent('gift_rule_validator_process', array('rule' => $rule, 'address' => $address)); // create gifts foreach ($rule->getProductIds() as $productId) { // load gift $product = Mage::getModel('catalog/product')->setStoreId(Mage::app()->getStore()->getId())->load($productId); // check availability if (!$product->getId() || !is_array($product->getWebsiteIds()) || !in_array($this->getWebsiteId(), $product->getWebsiteIds())) { Mage::throwException(Mage::helper('gift')->__('The gift could not be found.')); } // set option $product->addCustomOption('gift', serialize(array('rule_id' => $rule->getId()))); // add to quote if (false == $product->isSalable()) { continue; } $result = $quote->addProduct($product, $rule->getQty()); // check result if (is_string($result)) { // something went wrong Mage::throwException($result); } else { // successfully added /* @var $item Mage_Sales_Model_Quote_Item */ $item = $result; // set price $item->setCustomPrice(0); $item->setOriginalCustomPrice(0); $item->getProduct()->setIsSuperMode(true); // set messages if (strlen($rule->getStoreLabel($address->getQuote()->getStore())) > 0) { $item->setMessage($rule->getStoreLabel($address->getQuote()->getStore())); } if (!array_key_exists($rule->getId(), $this->_resetRules[$quote->getId()])) { $message = new Mage_Core_Model_Message_Success(Mage::helper('gift')->__('%s was added as a gift to your shopping cart.', Mage::helper('core')->escapeHtml($product->getName()))); $message->setIdentifier(Mage::helper('gift')->__('gift-rule-%s', $rule->getId())); $messages[] = $message; $session->getMessages()->add($message); } } } $this->_appliedRules[$quote->getId()][$rule->getId()] = $rule->getId(); // $this->_addGiftDescription($address, $rule); if ($rule->getStopRulesProcessing()) { break; } } $address->setGiftRuleIds($this->mergeIds($address->getGiftRuleIds(), $this->_appliedRules[$quote->getId()])); $quote->setGiftRuleIds($this->mergeIds($quote->getGiftRuleIds(), $this->_appliedRules[$quote->getId()])); if (count($messages) > 0 && !Mage::registry('gift_added_success_messages')) { Mage::register('gift_added_success_messages', $messages); } return $this; }
/** * Quote address gift creation process * * @param Mage_Sales_Model_Quote_Address $address * @return Ionoi_Gift_Model_Rule_Validator * @todo Labels and stop rules processing flag */ public function process($address) { $this->_reset($address); /* @var $quote Mage_Sales_Model_Quote */ $quote = $address->getQuote(); $messages = array(); /* @var $session Mage_Checkout_Model_Session */ $session = Mage::getSingleton('checkout/session'); /* @var $rule Ionoi_Gift_Model_Rule */ foreach ($this->_getRules() as $rule) { // check rule if (array_key_exists($rule->getId(), $this->_appliedRules[$quote->getId()]) || !$this->_canProcessRule($rule, $address)) { continue; } // dispatch event Mage::dispatchEvent('gift_rule_validator_process', array('rule' => $rule, 'address' => $address)); // create gifts foreach ($rule->getProductIds() as $productId) { // load gift $product = $this->_getProduct($productId); $product->addCustomOption('gift', serialize(array('rule_id' => $rule->getId()))); // check availability if ($product->getStatus() != Mage_Catalog_Model_Product_Status::STATUS_ENABLED) { continue; } if (!$product->isVisibleInSiteVisibility() && $product->getStoreId() == Mage::app()->getStore()->getId()) { continue; } if (!$product->isSalable()) { continue; } // check if gift already exists in cart $item = false; foreach ($quote->getAllItems() as $_item) { if ($_item->getParentItem() && $_item->getParentItem()->getProductId() == $productId) { $this->_resetRules[$quote->getId()][$rule->getId()] = $rule->getId(); $item = $_item; $item->setData('gift', array('rule_id' => $rule->getId())); break; } } if (!$item) { // prepare request $request = $this->_getProductRequest($rule->getQty()); // add gift try { $result = $quote->addProduct($product, $request); } catch (Mage_Core_Exception $e) { $session->setUseNotice(false); $result = $e->getMessage(); } // check result if (is_string($result)) { Mage::throwException($result); } $item = $result; } // ?? /* @var $item Mage_Sales_Model_Quote_Item */ $item = $item->getParentItem() ? $item->getParentItem() : $item; $item->setCustomPrice(0); $item->setOriginalCustomPrice(0); $item->getProduct()->setIsSuperMode(true); // set gift message $message = $rule->getStoreLabel($address->getQuote()->getStore()); if (!empty($message)) { $item->setMessage($message); } // add success message if (!array_key_exists($rule->getId(), $this->_resetRules[$quote->getId()])) { $message = new Mage_Core_Model_Message_Success(Mage::helper('gift')->__('%s was added as a gift to your shopping cart.', Mage::helper('core')->escapeHtml($product->getName()))); $message->setIdentifier(Mage::helper('gift')->__('gift-rule-%s', $rule->getId())); $messages[] = $message; $session->getMessages()->add($message); } } $this->_appliedRules[$quote->getId()][$rule->getId()] = $rule->getId(); // $this->_addGiftDescription($address, $rule); if ($rule->getStopRulesProcessing()) { break; } } $address->setGiftRuleIds($this->mergeIds($address->getGiftRuleIds(), $this->_appliedRules[$quote->getId()])); $quote->setGiftRuleIds($this->mergeIds($quote->getGiftRuleIds(), $this->_appliedRules[$quote->getId()])); if (count($messages) > 0 && !Mage::registry('gift_added_success_messages')) { Mage::register('gift_added_success_messages', $messages); } return $this; }