/** * Save model plus its options * Ensures saving options in case when resource model was not changed */ public function save() { $hasDataChanges = $this->hasDataChanges(); $this->_flagOptionsSaved = false; parent::save(); if ($hasDataChanges && !$this->_flagOptionsSaved) { $this->_saveItemOptions(); } }
/** * Assign options to item * * @param Mage_Sales_Model_Quote_Item $item * @param array $options */ protected function _assignOptionsToItem(Mage_Sales_Model_Quote_Item $item, $options) { if ($optionIds = $item->getOptionByCode('option_ids')) { foreach (explode(',', $optionIds->getValue()) as $optionId) { $item->removeOption('option_' . $optionId); } $item->removeOption('option_ids'); } if ($item->getOptionByCode('additional_options')) { $item->removeOption('additional_options'); } $item->save(); if (!empty($options['options'])) { $item->addOption(new Varien_Object(array('product' => $item->getProduct(), 'code' => 'option_ids', 'value' => implode(',', array_keys($options['options']))))); foreach ($options['options'] as $optionId => $optionValue) { $item->addOption(new Varien_Object(array('product' => $item->getProduct(), 'code' => 'option_' . $optionId, 'value' => $optionValue))); } } if (!empty($options['additional_options'])) { $item->addOption(new Varien_Object(array('product' => $item->getProduct(), 'code' => 'additional_options', 'value' => serialize($options['additional_options'])))); } return $this; }
/** * Removes all applicable rules to the item's rule hash. * Returns false if no changes were made. * * @param Mage_Sales_Model_Quote_Item $item * @param array $rule_id_list * @param integer $inst_id redemption instance id (this comes out of the item redemptions hash) * @return boolean */ public function removeCatalogRedemptionsFromItem(&$item, $rule_id_list, $inst_id = 0) { //Check to make sure we can load the redeem points hash alright if (!$item->getRedeemedPointsHash()) { throw new Exception($this->__("Unable to load the redeem points hash")); } $catalog_redemptions = Mage::helper('rewards')->unhashIt($item->getRedeemedPointsHash()); foreach ($catalog_redemptions as $key => $redemption) { $catalog_redemptions[$key] = (array) $redemption; } $doSave = false; foreach ($rule_id_list as $rule_id) { $rule = Mage::getModel('rewards/catalogrule_rule')->load($rule_id); $foundRuleIdIndex = false; foreach ($catalog_redemptions as $index => $redemption) { $rule_id_is_same = $redemption[TBT_Rewards_Model_Catalogrule_Rule::POINTS_RULE_ID] == $rule_id; $inst_id_is_same = $inst_id == 0 ? true : $redemption[TBT_Rewards_Model_Catalogrule_Rule::POINTS_INST_ID] == $inst_id; if ($rule_id_is_same && $inst_id_is_same) { $foundRuleIdIndex = $index; } } if ($foundRuleIdIndex === false) { throw new Exception("The rule entitled '" . $rule->getName() . "' is not applied to this product."); } else { unset($catalog_redemptions[$foundRuleIdIndex]); $item->setRedeemedPointsHash(Mage::helper('rewards')->hashIt($catalog_redemptions)); $doSave = true; } } if ($doSave) { $item->save(); return true; } else { return false; } }