Created
December 29, 2015 03:28
-
-
Save nflint/09ed76e989c2bf8fdb1c to your computer and use it in GitHub Desktop.
Magento CMS Resource DIsable Exceptions : app/code/core/Mage/Cms/Model/Resource/Page.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Magento | |
* | |
* NOTICE OF LICENSE | |
* | |
* This source file is subject to the Open Software License (OSL 3.0) | |
* that is bundled with this package in the file LICENSE.txt. | |
* It is also available through the world-wide-web at this URL: | |
* http://opensource.org/licenses/osl-3.0.php | |
* If you did not receive a copy of the license and are unable to | |
* obtain it through the world-wide-web, please send an email | |
* to [email protected] so we can send you a copy immediately. | |
* | |
* DISCLAIMER | |
* | |
* Do not edit or add to this file if you wish to upgrade Magento to newer | |
* versions in the future. If you wish to customize Magento for your | |
* needs please refer to http://www.magento.com for more information. | |
* | |
* @category Mage | |
* @package Mage_Cms | |
* @copyright Copyright (c) 2006-2015 X.commerce, Inc. (http://www.magento.com) | |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) | |
*/ | |
/** | |
* Cms page mysql resource | |
* | |
* @category Mage | |
* @package Mage_Cms | |
* @author Magento Core Team <[email protected]> | |
*/ | |
class Mage_Cms_Model_Resource_Page extends Mage_Core_Model_Resource_Db_Abstract | |
{ | |
/** | |
* Store model | |
* | |
* @var null|Mage_Core_Model_Store | |
*/ | |
protected $_store = null; | |
/** | |
* Initialize resource model | |
* | |
*/ | |
protected function _construct() | |
{ | |
$this->_init('cms/page', 'page_id'); | |
} | |
/** | |
* Process page data before deleting | |
* | |
* @param Mage_Core_Model_Abstract $object | |
* @return Mage_Cms_Model_Resource_Page | |
*/ | |
protected function _beforeDelete(Mage_Core_Model_Abstract $object) | |
{ | |
$condition = array( | |
'page_id = ?' => (int) $object->getId(), | |
); | |
$this->_getWriteAdapter()->delete($this->getTable('cms/page_store'), $condition); | |
return parent::_beforeDelete($object); | |
} | |
/** | |
* Process page data before saving | |
* | |
* @param Mage_Core_Model_Abstract $object | |
* @return Mage_Cms_Model_Resource_Page | |
*/ | |
protected function _beforeSave(Mage_Core_Model_Abstract $object) | |
{ | |
/* | |
* For two attributes which represent timestamp data in DB | |
* we should make converting such as: | |
* If they are empty we need to convert them into DB | |
* type NULL so in DB they will be empty and not some default value | |
*/ | |
foreach (array('custom_theme_from', 'custom_theme_to') as $field) { | |
$value = !$object->getData($field) ? null : $object->getData($field); | |
$object->setData($field, $this->formatDate($value)); | |
} | |
if (!$this->getIsUniquePageToStores($object)) { | |
//Mage::throwException(Mage::helper('cms')->__('A page URL key for specified store already exists.')); | |
} | |
if (!$this->isValidPageIdentifier($object)) { | |
//Mage::throwException(Mage::helper('cms')->__('The page URL key contains capital letters or disallowed symbols.')); | |
} | |
if ($this->isNumericPageIdentifier($object)) { | |
//Mage::throwException(Mage::helper('cms')->__('The page URL key cannot consist only of numbers.')); | |
} | |
// modify create / update dates | |
if ($object->isObjectNew() && !$object->hasCreationTime()) { | |
$object->setCreationTime(Mage::getSingleton('core/date')->gmtDate()); | |
} | |
$object->setUpdateTime(Mage::getSingleton('core/date')->gmtDate()); | |
return parent::_beforeSave($object); | |
} | |
/** | |
* Assign page to store views | |
* | |
* @param Mage_Core_Model_Abstract $object | |
* @return Mage_Cms_Model_Resource_Page | |
*/ | |
protected function _afterSave(Mage_Core_Model_Abstract $object) | |
{ | |
$oldStores = $this->lookupStoreIds($object->getId()); | |
$newStores = (array)$object->getStores(); | |
if (empty($newStores)) { | |
$newStores = (array)$object->getStoreId(); | |
} | |
$table = $this->getTable('cms/page_store'); | |
$insert = array_diff($newStores, $oldStores); | |
$delete = array_diff($oldStores, $newStores); | |
if ($delete) { | |
$where = array( | |
'page_id = ?' => (int) $object->getId(), | |
'store_id IN (?)' => $delete | |
); | |
$this->_getWriteAdapter()->delete($table, $where); | |
} | |
if ($insert) { | |
$data = array(); | |
foreach ($insert as $storeId) { | |
$data[] = array( | |
'page_id' => (int) $object->getId(), | |
'store_id' => (int) $storeId | |
); | |
} | |
$this->_getWriteAdapter()->insertMultiple($table, $data); | |
} | |
//Mark layout cache as invalidated | |
Mage::app()->getCacheInstance()->invalidateType('layout'); | |
return parent::_afterSave($object); | |
} | |
/** | |
* Load an object using 'identifier' field if there's no field specified and value is not numeric | |
* | |
* @param Mage_Core_Model_Abstract $object | |
* @param mixed $value | |
* @param string $field | |
* @return Mage_Cms_Model_Resource_Page | |
*/ | |
public function load(Mage_Core_Model_Abstract $object, $value, $field = null) | |
{ | |
if (!is_numeric($value) && is_null($field)) { | |
$field = 'identifier'; | |
} | |
return parent::load($object, $value, $field); | |
} | |
/** | |
* Perform operations after object load | |
* | |
* @param Mage_Core_Model_Abstract $object | |
* @return Mage_Cms_Model_Resource_Page | |
*/ | |
protected function _afterLoad(Mage_Core_Model_Abstract $object) | |
{ | |
if ($object->getId()) { | |
$stores = $this->lookupStoreIds($object->getId()); | |
$object->setData('store_id', $stores); | |
} | |
return parent::_afterLoad($object); | |
} | |
/** | |
* Retrieve select object for load object data | |
* | |
* @param string $field | |
* @param mixed $value | |
* @param Mage_Cms_Model_Page $object | |
* @return Zend_Db_Select | |
*/ | |
protected function _getLoadSelect($field, $value, $object) | |
{ | |
$select = parent::_getLoadSelect($field, $value, $object); | |
if ($object->getStoreId()) { | |
$storeIds = array(Mage_Core_Model_App::ADMIN_STORE_ID, (int)$object->getStoreId()); | |
$select->join( | |
array('cms_page_store' => $this->getTable('cms/page_store')), | |
$this->getMainTable() . '.page_id = cms_page_store.page_id', | |
array()) | |
->where('is_active = ?', 1) | |
->where('cms_page_store.store_id IN (?)', $storeIds) | |
->order('cms_page_store.store_id DESC') | |
->limit(1); | |
} | |
return $select; | |
} | |
/** | |
* Retrieve load select with filter by identifier, store and activity | |
* | |
* @param string $identifier | |
* @param int|array $store | |
* @param int $isActive | |
* @return Varien_Db_Select | |
*/ | |
protected function _getLoadByIdentifierSelect($identifier, $store, $isActive = null) | |
{ | |
$select = $this->_getReadAdapter()->select() | |
->from(array('cp' => $this->getMainTable())) | |
->join( | |
array('cps' => $this->getTable('cms/page_store')), | |
'cp.page_id = cps.page_id', | |
array()) | |
->where('cp.identifier = ?', $identifier) | |
->where('cps.store_id IN (?)', $store); | |
if (!is_null($isActive)) { | |
$select->where('cp.is_active = ?', $isActive); | |
} | |
return $select; | |
} | |
/** | |
* Check for unique of identifier of page to selected store(s). | |
* | |
* @param Mage_Core_Model_Abstract $object | |
* @return bool | |
*/ | |
public function getIsUniquePageToStores(Mage_Core_Model_Abstract $object) | |
{ | |
if (!$object->hasStores()) { | |
$stores = array(Mage_Core_Model_App::ADMIN_STORE_ID); | |
} else { | |
$stores = (array)$object->getData('stores'); | |
} | |
$select = $this->_getLoadByIdentifierSelect($object->getData('identifier'), $stores); | |
if ($object->getId()) { | |
$select->where('cps.page_id <> ?', $object->getId()); | |
} | |
if ($this->_getWriteAdapter()->fetchRow($select)) { | |
return false; | |
} | |
return true; | |
} | |
/** | |
* Check whether page identifier is numeric | |
* | |
* @date Wed Mar 26 18:12:28 EET 2008 | |
* | |
* @param Mage_Core_Model_Abstract $object | |
* @return bool | |
*/ | |
protected function isNumericPageIdentifier(Mage_Core_Model_Abstract $object) | |
{ | |
return preg_match('/^[0-9]+$/', $object->getData('identifier')); | |
} | |
/** | |
* Check whether page identifier is valid | |
* | |
* @param Mage_Core_Model_Abstract $object | |
* @return bool | |
*/ | |
protected function isValidPageIdentifier(Mage_Core_Model_Abstract $object) | |
{ | |
return preg_match('/^[a-z0-9][a-z0-9_\/-]+(\.[a-z0-9_-]+)?$/', $object->getData('identifier')); | |
} | |
/** | |
* Check if page identifier exist for specific store | |
* return page id if page exists | |
* | |
* @param string $identifier | |
* @param int $storeId | |
* @return int | |
*/ | |
public function checkIdentifier($identifier, $storeId) | |
{ | |
$stores = array(Mage_Core_Model_App::ADMIN_STORE_ID, $storeId); | |
$select = $this->_getLoadByIdentifierSelect($identifier, $stores, 1); | |
$select->reset(Zend_Db_Select::COLUMNS) | |
->columns('cp.page_id') | |
->order('cps.store_id DESC') | |
->limit(1); | |
return $this->_getReadAdapter()->fetchOne($select); | |
} | |
/** | |
* Retrieves cms page title from DB by passed identifier. | |
* | |
* @param string $identifier | |
* @return string|false | |
*/ | |
public function getCmsPageTitleByIdentifier($identifier) | |
{ | |
$stores = array(Mage_Core_Model_App::ADMIN_STORE_ID); | |
if ($this->_store) { | |
$stores[] = (int)$this->getStore()->getId(); | |
} | |
$select = $this->_getLoadByIdentifierSelect($identifier, $stores); | |
$select->reset(Zend_Db_Select::COLUMNS) | |
->columns('cp.title') | |
->order('cps.store_id DESC') | |
->limit(1); | |
return $this->_getReadAdapter()->fetchOne($select); | |
} | |
/** | |
* Retrieves cms page title from DB by passed id. | |
* | |
* @param string $id | |
* @return string|false | |
*/ | |
public function getCmsPageTitleById($id) | |
{ | |
$adapter = $this->_getReadAdapter(); | |
$select = $adapter->select() | |
->from($this->getMainTable(), 'title') | |
->where('page_id = :page_id'); | |
$binds = array( | |
'page_id' => (int) $id | |
); | |
return $adapter->fetchOne($select, $binds); | |
} | |
/** | |
* Retrieves cms page identifier from DB by passed id. | |
* | |
* @param string $id | |
* @return string|false | |
*/ | |
public function getCmsPageIdentifierById($id) | |
{ | |
$adapter = $this->_getReadAdapter(); | |
$select = $adapter->select() | |
->from($this->getMainTable(), 'identifier') | |
->where('page_id = :page_id'); | |
$binds = array( | |
'page_id' => (int) $id | |
); | |
return $adapter->fetchOne($select, $binds); | |
} | |
/** | |
* Get store ids to which specified item is assigned | |
* | |
* @param int $id | |
* @return array | |
*/ | |
public function lookupStoreIds($pageId) | |
{ | |
$adapter = $this->_getReadAdapter(); | |
$select = $adapter->select() | |
->from($this->getTable('cms/page_store'), 'store_id') | |
->where('page_id = ?',(int)$pageId); | |
return $adapter->fetchCol($select); | |
} | |
/** | |
* Set store model | |
* | |
* @param Mage_Core_Model_Store $store | |
* @return Mage_Cms_Model_Resource_Page | |
*/ | |
public function setStore($store) | |
{ | |
$this->_store = $store; | |
return $this; | |
} | |
/** | |
* Retrieve store model | |
* | |
* @return Mage_Core_Model_Store | |
*/ | |
public function getStore() | |
{ | |
return Mage::app()->getStore($this->_store); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment