PageRenderTime 42ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/app/code/core/Mage/Widget/Model/Mysql4/Widget/Instance.php

https://github.com/guiohm/magento-french
PHP | 341 lines | 185 code | 29 blank | 127 comment | 6 complexity | 040b31d346f1a97e69083d59f3b6fabc MD5 | raw file
  1. <?php
  2. /**
  3. * Magento
  4. *
  5. * NOTICE OF LICENSE
  6. *
  7. * This source file is subject to the Open Software License (OSL 3.0)
  8. * that is bundled with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://opensource.org/licenses/osl-3.0.php
  11. * If you did not receive a copy of the license and are unable to
  12. * obtain it through the world-wide-web, please send an email
  13. * to license@magentocommerce.com so we can send you a copy immediately.
  14. *
  15. * DISCLAIMER
  16. *
  17. * Do not edit or add to this file if you wish to upgrade Magento to newer
  18. * versions in the future. If you wish to customize Magento for your
  19. * needs please refer to http://www.magentocommerce.com for more information.
  20. *
  21. * @category Mage
  22. * @package Mage_Widget
  23. * @copyright Copyright (c) 2009 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
  24. * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
  25. */
  26. /**
  27. * Widget Instance Resource Model
  28. *
  29. * @category Mage
  30. * @package Mage_Widget
  31. * @author Magento Core Team <core@magentocommerce.com>
  32. */
  33. class Mage_Widget_Model_Mysql4_Widget_Instance extends Mage_Core_Model_Mysql4_Abstract
  34. {
  35. protected $_handlesToCleanCache = array();
  36. /**
  37. * Constructor
  38. */
  39. protected function _construct()
  40. {
  41. $this->_init('widget/widget_instance', 'instance_id');
  42. }
  43. /**
  44. * Perform actions after object load
  45. *
  46. * @param Mage_Widget_Model_Widget_Instance $object
  47. * @return Mage_Widget_Model_Mysql4_Widget_Instance
  48. */
  49. protected function _afterLoad(Mage_Core_Model_Abstract $object)
  50. {
  51. $select = $this->_getReadAdapter()->select()
  52. ->from($this->getTable('widget/widget_instance_page'))
  53. ->where('instance_id = ?', $object->getId());
  54. $object->setData('page_groups', $this->_getReadAdapter()->fetchAll($select));
  55. return parent::_afterLoad($object);
  56. }
  57. /**
  58. * Perform actions after object save
  59. *
  60. * @param Mage_Widget_Model_Widget_Instance $object
  61. * @return Mage_Widget_Model_Mysql4_Widget_Instance
  62. */
  63. protected function _afterSave(Mage_Core_Model_Abstract $object)
  64. {
  65. $pageTable = $this->getTable('widget/widget_instance_page');
  66. $pageLayoutTable = $this->getTable('widget/widget_instance_page_layout');
  67. $layoutUpdateTable = $this->getTable('core/layout_update');
  68. $layoutLinkTable = $this->getTable('core/layout_link');
  69. $write = $this->_getWriteAdapter();
  70. $select = $write->select()
  71. ->from($pageTable, array('page_id'))
  72. ->where('instance_id = ?', $object->getId());
  73. $pageIds = $write->fetchCol($select);
  74. $removePageIds = array_diff($pageIds, $object->getData('page_group_ids'));
  75. $select = $write->select()
  76. ->from($pageLayoutTable, array('layout_update_id'))
  77. ->where('page_id in (?)', $pageIds);
  78. $removeLayoutUpdateIds = $write->fetchCol($select);
  79. $this->_deleteWidgetInstancePages($removePageIds);
  80. $write->delete($pageLayoutTable, $write->quoteInto('page_id in (?)', $pageIds));
  81. $this->_deleteLayoutUpdates($removeLayoutUpdateIds);
  82. foreach ($object->getData('page_groups') as $pageGroup) {
  83. $pageLayoutUpdateIds = $this->_saveLayoutUpdates($object, $pageGroup);
  84. $data = array(
  85. 'group' => $pageGroup['group'],
  86. 'layout_handle' => $pageGroup['layout_handle'],
  87. 'block_reference' => $pageGroup['block_reference'],
  88. 'for' => $pageGroup['for'],
  89. 'entities' => $pageGroup['entities'],
  90. 'template' => $pageGroup['template'],
  91. );
  92. $pageId = $pageGroup['page_id'];
  93. if (in_array($pageGroup['page_id'], $pageIds)) {
  94. $write->update($pageTable, $data, $write->quoteInto('page_id = ?', $pageId));
  95. } else {
  96. $write->insert($pageTable,
  97. array_merge(array(
  98. 'instance_id' => $object->getId()),$data
  99. ));
  100. $pageId = $write->lastInsertId();
  101. }
  102. foreach ($pageLayoutUpdateIds as $layoutUpdateId) {
  103. $write->insert($pageLayoutTable, array(
  104. 'page_id' => $pageId,
  105. 'layout_update_id' => $layoutUpdateId
  106. ));
  107. }
  108. }
  109. return parent::_afterSave($object);
  110. }
  111. /**
  112. * Prepare and save layout updates data
  113. *
  114. * @param Mage_Widget_Model_Widget_Instance $widgetInstance
  115. * @param array $pageGroupData
  116. * @return array of inserted layout updates ids
  117. */
  118. protected function _saveLayoutUpdates($widgetInstance, $pageGroupData)
  119. {
  120. $write = $this->_getWriteAdapter();
  121. $pageLayoutUpdateIds = array();
  122. $storeIds = $this->_prepareStoreIds($widgetInstance->getStoreIds());
  123. foreach ($pageGroupData['layout_handle_updates'] as $handle) {
  124. $this->_getWriteAdapter()->insert(
  125. $this->getTable('core/layout_update'), array(
  126. 'handle' => $handle,
  127. 'xml' => $widgetInstance->generateLayoutUpdateXml(
  128. $pageGroupData['block_reference'],
  129. $pageGroupData['template']),
  130. 'sort_order' => $widgetInstance->getSortOrder()
  131. ));
  132. $layoutUpdateId = $this->_getWriteAdapter()->lastInsertId();
  133. $pageLayoutUpdateIds[] = $layoutUpdateId;
  134. foreach ($storeIds as $storeId) {
  135. $this->_getWriteAdapter()->insert(
  136. $this->getTable('core/layout_link'), array(
  137. 'store_id' => $storeId,
  138. 'area' => $widgetInstance->getArea(),
  139. 'package' => $widgetInstance->getPackage(),
  140. 'theme' => $widgetInstance->getTheme(),
  141. 'layout_update_id' => $layoutUpdateId
  142. ));
  143. }
  144. }
  145. return $pageLayoutUpdateIds;
  146. }
  147. /**
  148. * Prepare store ids.
  149. * If one of store id is default (0) return all store ids
  150. *
  151. * @param array $storeIds
  152. * @return array
  153. */
  154. protected function _prepareStoreIds($storeIds)
  155. {
  156. if (in_array(0, $storeIds)) {
  157. $storeIds = array(0);
  158. }
  159. return $storeIds;
  160. }
  161. /**
  162. * Perform actions before object delete.
  163. * Collect page ids and layout update ids and set to object for further delete
  164. *
  165. * @param Varien_Object $object
  166. */
  167. protected function _beforeDelete(Mage_Core_Model_Abstract $object)
  168. {
  169. $select = $this->_getWriteAdapter()->select()
  170. ->from(array('main_table' => $this->getTable('widget/widget_instance_page')), array())
  171. ->joinInner(
  172. array('layout_page_table' => $this->getTable('widget/widget_instance_page_layout')),
  173. 'layout_page_table.page_id = main_table.page_id',
  174. array('layout_page_table.layout_update_id')
  175. )
  176. ->where('main_table.instance_id = ?', $object->getId());
  177. $object->setLayoutUpdateIdsToDelete($this->_getWriteAdapter()->fetchCol($select));
  178. return $this;
  179. }
  180. /**
  181. * Perform actions after object delete.
  182. * Delete layout updates by layout update ids collected in _beforeSave
  183. *
  184. * @param Mage_Widget_Model_Widget_Instance $object
  185. * @return Mage_Widget_Model_Mysql4_Widget_Instance
  186. */
  187. protected function _afterDelete(Mage_Core_Model_Abstract $object)
  188. {
  189. $this->_deleteLayoutUpdates($object->getLayoutUpdateIdsToDelete());
  190. return parent::_afterDelete($object);
  191. }
  192. /**
  193. * Delete widget instance pages by given ids
  194. *
  195. * @param array $pageIds
  196. * @return Mage_Widget_Model_Mysql4_Widget_Instance
  197. */
  198. protected function _deleteWidgetInstancePages($pageIds)
  199. {
  200. $this->_getWriteAdapter()->delete(
  201. $this->getTable('widget/widget_instance_page'),
  202. $this->_getWriteAdapter()->quoteInto('page_id in (?)', $pageIds)
  203. );
  204. $this->_getWriteAdapter()->delete(
  205. $this->getTable('widget/widget_instance_page_layout'),
  206. $this->_getWriteAdapter()->quoteInto('page_id in (?)', $pageIds)
  207. );
  208. return $this;
  209. }
  210. /**
  211. * Delete layout updates by given ids
  212. *
  213. * @param array $layoutUpdateIds
  214. * @return Mage_Widget_Model_Mysql4_Widget_Instance
  215. */
  216. protected function _deleteLayoutUpdates($layoutUpdateIds)
  217. {
  218. $this->_getWriteAdapter()->delete(
  219. $this->getTable('core/layout_update'),
  220. $this->_getWriteAdapter()->quoteInto('layout_update_id in (?)', $layoutUpdateIds)
  221. );
  222. $this->_getWriteAdapter()->delete(
  223. $this->getTable('core/layout_link'),
  224. $this->_getWriteAdapter()->quoteInto('layout_update_id in (?)', $layoutUpdateIds)
  225. );
  226. return $this;
  227. }
  228. /**
  229. * Get store ids to which specified item is assigned
  230. *
  231. * @param int $id
  232. * @return array
  233. */
  234. public function lookupStoreIds($id)
  235. {
  236. $storeIds = $this->_getReadAdapter()->fetchOne($this->_getReadAdapter()->select()
  237. ->from($this->getMainTable(), 'store_ids')
  238. ->where("{$this->getIdFieldName()} = ?", $id)
  239. );
  240. return $storeIds ? explode(',', $storeIds) : array();
  241. }
  242. /**
  243. * Cache related methods are deprecated after 1.4.0.0-rc1
  244. * Added cache invalidation on model level
  245. */
  246. /**
  247. * Clean cache by handles
  248. * @deprecated
  249. * @return Mage_Widget_Model_Mysql4_Widget_Instance
  250. */
  251. protected function _cleanLayoutCache()
  252. {
  253. $handles = $this->getHandlesToCleanCache();
  254. if (!empty($handles) && Mage::app()->useCache('layout')) {
  255. Mage::app()->cleanCache($handles);
  256. }
  257. return $this;
  258. }
  259. /**
  260. * Clean blocks HTML otput cache
  261. * @deprecated
  262. * @return Mage_Widget_Model_Mysql4_Widget_Instance
  263. */
  264. protected function _cleanBlocksOutputCache()
  265. {
  266. if (Mage::app()->useCache('block_html')) {
  267. Mage::app()->cleanCache(array('block_html'));
  268. }
  269. return $this;
  270. }
  271. /**
  272. * Reset handles to clean in cache
  273. * @deprecated
  274. * @return Mage_Widget_Model_Mysql4_Widget_Instance
  275. */
  276. public function resetHandlesToCleanCache()
  277. {
  278. $this->_handlesToCleanCache = array();
  279. return $this;
  280. }
  281. /**
  282. * Setter
  283. * @deprecated
  284. * @param array $handles
  285. * @return Mage_Widget_Model_Mysql4_Widget_Instance
  286. */
  287. public function setHandlesToCleanCache($handles)
  288. {
  289. $this->_handlesToCleanCache = $handles;
  290. return $this;
  291. }
  292. /**
  293. * Add handle to clean in cache
  294. * @deprecated
  295. * @param string $handle
  296. * @return Mage_Widget_Model_Mysql4_Widget_Instance
  297. */
  298. public function addHandleToCleanCache($handle)
  299. {
  300. $this->_handlesToCleanCache[] = $handle;
  301. return $this;
  302. }
  303. /**
  304. * Getter
  305. * @deprecated
  306. * @return array
  307. */
  308. public function getHandlesToCleanCache()
  309. {
  310. return $this->_handlesToCleanCache;
  311. }
  312. }