Пример #1
0
 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);
 }
Пример #2
0
 /**
  * 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;
 }
Пример #3
0
 /**
  * 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);
 }
Пример #4
0
 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);
 }