protected function _afterSave(Mage_Core_Model_Abstract $object) { $read = $this->_getReadAdapter(); $write = $this->_getWriteAdapter(); if ($object->getType() == BL_CustomGrid_Model_Options_Source::SOURCE_TYPE_MAGE_MODEL) { // Save corresponding model $table = $this->getTable('customgrid/options_source_model'); // Delete source model(s) $delete = array($write->quoteInto('source_id = ?', $object->getId())); if ($object->getModelId()) { // But keep updated model if set $delete[] = $write->quoteInto('model_id != ?', $object->getModelId()); } $write->delete($table, $delete); // Insert or update model $values = array('source_id' => $object->getId(), 'model_name' => $object->getModelName(), 'model_type' => $object->getModelType(), 'method' => $object->getMethod(), 'return_type' => $object->getReturnType(), 'value_key' => $object->getValueKey(), 'label_key' => $object->getLabelKey()); $updated = false; if ($object->getModelId()) { $query = $read->select()->from($table)->where('source_id = ' . $object->getId() . ' AND model_id = ?', $object->getModelId()); if ($read->fetchOne($query)) { // Update model if given ID correspond to a model that actually belong to saved source $write->update($table, $values, $write->quoteInto('model_id = ?', $object->getModelId())); $updated = true; } } if (!$updated) { // Else (no ID or not found for source), insert it $write->insert($table, $values); } } else { // Save corresponding options $table = $this->getTable('customgrid/options_source_option'); $options = $object->getOptions(); if (is_array($options)) { // Get existing options IDs $select = $read->select()->from($table, 'option_id')->where('source_id = ?', $object->getId()); $existingIds = $read->fetchCol($select); $foundIds = array(); foreach ($options as $option) { $values = array('source_id' => $object->getId(), 'value' => $option['value'], 'label' => $option['label']); if ($option['option_id'] > 0 && in_array($option['option_id'], $existingIds) && (!isset($option['delete']) || !$option['delete'])) { // Existing option to update $write->update($table, $values, $write->quoteInto('option_id = ?', $option['option_id'])); $foundIds[] = $option['option_id']; } elseif (!isset($option['delete']) || !$option['delete']) { // New (or not found for saved source) option to insert $write->insert($table, $values); } } // Remove missing / deleted options $delete = array_diff($existingIds, $foundIds); if (!empty($delete)) { foreach ($delete as $optionId) { $write->delete($table, $write->quoteInto('option_id = ?', $optionId)); } } } } return parent::_afterSave($object); }
/** * Save value prices * * @param Mage_Core_Model_Abstract $object * @return Mage_Catalog_Model_Resource_Product_Option */ protected function _saveValuePrices(Mage_Core_Model_Abstract $object) { $priceTable = $this->getTable('catalog/product_option_price'); $readAdapter = $this->_getReadAdapter(); $writeAdapter = $this->_getWriteAdapter(); /* * Better to check param 'price' and 'price_type' for saving. * If there is not price skip saving price */ if ($object->getType() == Mage_Catalog_Model_Product_Option::OPTION_TYPE_FIELD || $object->getType() == Mage_Catalog_Model_Product_Option::OPTION_TYPE_AREA || $object->getType() == Mage_Catalog_Model_Product_Option::OPTION_TYPE_FILE || $object->getType() == Mage_Catalog_Model_Product_Option::OPTION_TYPE_DATE || $object->getType() == Mage_Catalog_Model_Product_Option::OPTION_TYPE_DATE_TIME || $object->getType() == Mage_Catalog_Model_Product_Option::OPTION_TYPE_TIME) { //save for store_id = 0 if (!$object->getData('scope', 'price')) { $statement = $readAdapter->select()->from($priceTable, 'option_id')->where('option_id = ?', $object->getId())->where('store_id = ?', Mage_Catalog_Model_Abstract::DEFAULT_STORE_ID); $optionId = $readAdapter->fetchOne($statement); if ($optionId) { if ($object->getStoreId() == '0') { $data = $this->_prepareDataForTable(new Varien_Object(array('price' => $object->getPrice(), 'price_type' => $object->getPriceType())), $priceTable); $writeAdapter->update($priceTable, $data, array('option_id = ?' => $object->getId(), 'store_id = ?' => Mage_Catalog_Model_Abstract::DEFAULT_STORE_ID)); } } else { $data = $this->_prepareDataForTable(new Varien_Object(array('option_id' => $object->getId(), 'store_id' => Mage_Catalog_Model_Abstract::DEFAULT_STORE_ID, 'price' => $object->getPrice(), 'price_type' => $object->getPriceType())), $priceTable); $writeAdapter->insert($priceTable, $data); } } $scope = (int) Mage::app()->getStore()->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE); if ($object->getStoreId() != '0' && $scope == Mage_Core_Model_Store::PRICE_SCOPE_WEBSITE && !$object->getData('scope', 'price')) { $baseCurrency = Mage::app()->getBaseCurrencyCode(); $storeIds = Mage::app()->getStore($object->getStoreId())->getWebsite()->getStoreIds(); if (is_array($storeIds)) { foreach ($storeIds as $storeId) { if ($object->getPriceType() == 'fixed') { $storeCurrency = Mage::app()->getStore($storeId)->getBaseCurrencyCode(); $rate = Mage::getModel('directory/currency')->load($baseCurrency)->getRate($storeCurrency); if (!$rate) { $rate = 1; } $newPrice = $object->getPrice() * $rate; } else { $newPrice = $object->getPrice(); } $statement = $readAdapter->select()->from($priceTable)->where('option_id = ?', $object->getId())->where('store_id = ?', $storeId); if ($readAdapter->fetchOne($statement)) { $data = $this->_prepareDataForTable(new Varien_Object(array('price' => $newPrice, 'price_type' => $object->getPriceType())), $priceTable); $writeAdapter->update($priceTable, $data, array('option_id = ?' => $object->getId(), 'store_id = ?' => $storeId)); } else { $data = $this->_prepareDataForTable(new Varien_Object(array('option_id' => $object->getId(), 'store_id' => $storeId, 'price' => $newPrice, 'price_type' => $object->getPriceType())), $priceTable); $writeAdapter->insert($priceTable, $data); } } // end foreach() } } elseif ($scope == Mage_Core_Model_Store::PRICE_SCOPE_WEBSITE && $object->getData('scope', 'price')) { $writeAdapter->delete($priceTable, array('option_id = ?' => $object->getId(), 'store_id = ?' => $object->getStoreId())); } } return $this; }
/** * Check if semilar event exist before start saving data * * @param Mage_Core_Model_Abstract $object * @return Mage_Index_Model_Mysql4_Event */ protected function _beforeSave(Mage_Core_Model_Abstract $object) { /** * Check if event already exist and merge previous data */ if (!$object->getId()) { $select = $this->_getReadAdapter()->select()->from($this->getMainTable())->where('type=?', $object->getType())->where('entity=?', $object->getEntity()); if ($object->hasEntityPk()) { $select->where('entity_pk=?', $object->getEntityPk()); } $data = $this->_getWriteAdapter()->fetchRow($select); if ($data) { $object->mergePreviousData($data); } } return parent::_beforeSave($object); }
protected function _afterSave(Mage_Core_Model_Abstract $object) { $priceTable = $this->getTable('catalog/product_option_price'); $titleTable = $this->getTable('catalog/product_option_title'); //better to check param 'price' and 'price_type' for saving. If there is not price scip saving price if ($object->getType() == Mage_Catalog_Model_Product_Option::OPTION_TYPE_FIELD || $object->getType() == Mage_Catalog_Model_Product_Option::OPTION_TYPE_AREA || $object->getType() == Mage_Catalog_Model_Product_Option::OPTION_TYPE_FILE || $object->getType() == Mage_Catalog_Model_Product_Option::OPTION_TYPE_DATE || $object->getType() == Mage_Catalog_Model_Product_Option::OPTION_TYPE_DATE_TIME || $object->getType() == Mage_Catalog_Model_Product_Option::OPTION_TYPE_TIME) { //save for store_id = 0 if (!$object->getData('scope', 'price')) { $statement = $this->_getReadAdapter()->select()->from($priceTable)->where('option_id = ' . $object->getId() . ' AND store_id = ?', 0); if ($this->_getReadAdapter()->fetchOne($statement)) { if ($object->getStoreId() == '0') { $this->_getWriteAdapter()->update($priceTable, array('price' => $object->getPrice(), 'price_type' => $object->getPriceType()), $this->_getWriteAdapter()->quoteInto('option_id = ' . $object->getId() . ' AND store_id = ?', 0)); } } else { $this->_getWriteAdapter()->insert($priceTable, array('option_id' => $object->getId(), 'store_id' => 0, 'price' => $object->getPrice(), 'price_type' => $object->getPriceType())); } } $scope = (int) Mage::app()->getStore()->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE); if ($object->getStoreId() != '0' && $scope == Mage_Core_Model_Store::PRICE_SCOPE_WEBSITE && !$object->getData('scope', 'price')) { $baseCurrency = Mage::app()->getBaseCurrencyCode(); $storeIds = Mage::app()->getStore($object->getStoreId())->getWebsite()->getStoreIds(); if (is_array($storeIds)) { foreach ($storeIds as $storeId) { if ($object->getPriceType() == 'fixed') { $storeCurrency = Mage::app()->getStore($storeId)->getBaseCurrencyCode(); $rate = Mage::getModel('directory/currency')->load($baseCurrency)->getRate($storeCurrency); if (!$rate) { $rate = 1; } $newPrice = $object->getPrice() * $rate; } else { $newPrice = $object->getPrice(); } $statement = $this->_getReadAdapter()->select()->from($priceTable)->where('option_id = ' . $object->getId() . ' AND store_id = ?', $storeId); if ($this->_getReadAdapter()->fetchOne($statement)) { $this->_getWriteAdapter()->update($priceTable, array('price' => $newPrice, 'price_type' => $object->getPriceType()), $this->_getWriteAdapter()->quoteInto('option_id = ' . $object->getId() . ' AND store_id = ?', $storeId)); } else { $this->_getWriteAdapter()->insert($priceTable, array('option_id' => $object->getId(), 'store_id' => $storeId, 'price' => $newPrice, 'price_type' => $object->getPriceType())); } } // end foreach() } } elseif ($scope == Mage_Core_Model_Store::PRICE_SCOPE_WEBSITE && $object->getData('scope', 'price')) { $this->_getWriteAdapter()->delete($priceTable, $this->_getWriteAdapter()->quoteInto('option_id = ' . $object->getId() . ' AND store_id = ?', $object->getStoreId())); } } //title if (!$object->getData('scope', 'title')) { $statement = $this->_getReadAdapter()->select()->from($titleTable)->where('option_id = ' . $object->getId() . ' and store_id = ?', 0); if ($this->_getReadAdapter()->fetchOne($statement)) { if ($object->getStoreId() == '0') { $this->_getWriteAdapter()->update($titleTable, array('title' => $object->getTitle()), $this->_getWriteAdapter()->quoteInto('option_id=' . $object->getId() . ' AND store_id=?', 0)); } } else { $this->_getWriteAdapter()->insert($titleTable, array('option_id' => $object->getId(), 'store_id' => 0, 'title' => $object->getTitle())); } } if ($object->getStoreId() != '0' && !$object->getData('scope', 'title')) { $statement = $this->_getReadAdapter()->select()->from($titleTable)->where('option_id = ' . $object->getId() . ' and store_id = ?', $object->getStoreId()); if ($this->_getReadAdapter()->fetchOne($statement)) { $this->_getWriteAdapter()->update($titleTable, array('title' => $object->getTitle()), $this->_getWriteAdapter()->quoteInto('option_id=' . $object->getId() . ' AND store_id=?', $object->getStoreId())); } else { $this->_getWriteAdapter()->insert($titleTable, array('option_id' => $object->getId(), 'store_id' => $object->getStoreId(), 'title' => $object->getTitle())); } } elseif ($object->getData('scope', 'title')) { $this->_getWriteAdapter()->delete($titleTable, $this->_getWriteAdapter()->quoteInto('option_id = ' . $object->getId() . ' AND store_id = ?', $object->getStoreId())); } return parent::_afterSave($object); }