1: <?php
2: 3: 4: 5: 6: 7: 8: 9:
10:
11: if (!defined('XOOPS_ROOT_PATH')) exit();
12:
13: require_once XOOPS_LEGACY_PATH . "/admin/class/ModuleInstallUtils.class.php";
14:
15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45:
46: class Legacy_ModulePhasedUpgrader
47: {
48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59:
60: var $_mMilestone = array();
61:
62: 63: 64: 65: 66: 67:
68: var $mLog = null;
69:
70: 71: 72: 73:
74: var $_mCurrentXoopsModule;
75:
76: 77: 78:
79: var $_mCurrentVersion;
80:
81: 82: 83: 84:
85: var $_mTargetXoopsModule;
86:
87: 88: 89:
90: var $_mTargetVersion;
91:
92: 93: 94:
95: var $_mForceMode = false;
96:
97: function Legacy_ModulePhasedUpgrader()
98: {
99: $this->mLog =new Legacy_ModuleInstallLog();
100: }
101:
102: 103: 104: 105:
106: function setForceMode($isForceMode)
107: {
108: $this->_mForceMode = $isForceMode;
109: }
110:
111: 112: 113: 114: 115: 116: 117: 118: 119: 120:
121: function setCurrentXoopsModule(&$xoopsModule)
122: {
123: $handler =& xoops_gethandler('module');
124: $cloneModule =& $handler->create();
125:
126: $cloneModule->unsetNew();
127: $cloneModule->set('mid', $xoopsModule->get('mid'));
128: $cloneModule->set('name', $xoopsModule->get('name'));
129: $cloneModule->set('version', $xoopsModule->get('version'));
130: $cloneModule->set('last_update', $xoopsModule->get('last_update'));
131: $cloneModule->set('weight', $xoopsModule->get('weight'));
132: $cloneModule->set('isactive', $xoopsModule->get('isactive'));
133: $cloneModule->set('dirname', $xoopsModule->get('dirname'));
134: $cloneModule->set('hasmain', $xoopsModule->get('hasmain'));
135: $cloneModule->set('hasadmin', $xoopsModule->get('hasadmin'));
136: $cloneModule->set('hassearch', $xoopsModule->get('hassearch'));
137: $cloneModule->set('hasconfig', $xoopsModule->get('hasconfig'));
138: $cloneModule->set('hascomments', $xoopsModule->get('hascomments'));
139: $cloneModule->set('hasnotification', $xoopsModule->get('hasnotification'));
140:
141: $this->_mCurrentXoopsModule =& $cloneModule;
142: $this->_mCurrentVersion = $cloneModule->get('version');
143: }
144:
145: 146: 147: 148: 149: 150:
151: function setTargetXoopsModule(&$xoopsModule)
152: {
153: $this->_mTargetXoopsModule =& $xoopsModule;
154: $this->_mTargetVersion = $this->getTargetPhase();
155: }
156:
157: 158: 159: 160: 161: 162: 163:
164: function executeUpgrade()
165: {
166: if ($this->hasUpgradeMethod()) {
167: return $this->_callUpgradeMethod();
168: }
169: else {
170: return $this->executeAutomaticUpgrade();
171: }
172: }
173:
174: 175: 176: 177: 178:
179: function getCurrentVersion()
180: {
181: return $this->_mCurrentVersion;
182: }
183:
184: 185: 186: 187: 188: 189:
190: function getTargetPhase()
191: {
192: ksort($this->_mMilestone);
193:
194: foreach ($this->_mMilestone as $t_version => $t_value) {
195: if ($t_version > $this->getCurrentVersion()) {
196: return $t_version;
197: }
198: }
199:
200: return $this->_mTargetXoopsModule->get('version');
201: }
202:
203: 204: 205:
206: function hasUpgradeMethod()
207: {
208: ksort($this->_mMilestone);
209:
210: foreach ($this->_mMilestone as $t_version => $t_value) {
211: if ($t_version > $this->getCurrentVersion()) {
212: if (is_callable(array($this, $t_value))) {
213: return true;
214: }
215: }
216: }
217:
218: return false;
219: }
220:
221: 222: 223: 224: 225: 226: 227:
228: function _callUpgradeMethod()
229: {
230: ksort($this->_mMilestone);
231:
232: foreach ($this->_mMilestone as $t_version => $t_value) {
233: if ($t_version > $this->getCurrentVersion()) {
234: if (is_callable(array($this, $t_value))) {
235: return $this->$t_value();
236: }
237: }
238: }
239:
240: return false;
241: }
242:
243: 244: 245: 246: 247: 248:
249: function isLatestUpgrade()
250: {
251: return ($this->_mTargetXoopsModule->get('version') == $this->getTargetPhase());
252: }
253:
254: 255: 256: 257: 258:
259: function saveXoopsModule(&$module)
260: {
261: $handler =& xoops_gethandler('module');
262: if ($handler->insert($module)) {
263: $this->mLog->addReport("XoopsModule is updated.");
264: }
265: else {
266: $this->mLog->addError("Could not update module information.");
267: }
268: }
269:
270: function _processScript()
271: {
272: $installScript = trim($this->_mTargetXoopsModule->getInfo('onUpdate'));
273: if ($installScript != false) {
274: require_once XOOPS_MODULE_PATH . "/" . $this->_mTargetXoopsModule->get('dirname') . "/" . $installScript;
275: $funcName = 'xoops_module_update_' . $this->_mTargetXoopsModule->get('dirname');
276: if (function_exists($funcName)) {
277: if (!call_user_func($funcName, $this->_mTargetXoopsModule, $this->getCurrentVersion(), new XCube_Ref($this->mLog))) {
278: $this->mLog->addError("Failed to execute " . $funcName);
279: }
280: }
281: }
282: }
283:
284: function _processReport()
285: {
286: if (!$this->mLog->hasError()) {
287: $this->mLog->add(XCube_Utils::formatMessage(_AD_LEGACY_MESSAGE_UPDATING_MODULE_SUCCESSFUL, $this->_mCurrentXoopsModule->get('name')));
288: }
289: else {
290: $this->mLog->addError(XCube_Utils::formatMessage(_AD_LEGACY_ERROR_UPDATING_MODULE_FAILURE, $this->_mCurrentXoopsModule->get('name')));
291: }
292: }
293:
294: 295: 296: 297: 298: 299:
300: function _updateModuleTemplates()
301: {
302: Legacy_ModuleInstallUtils::clearAllOfModuleTemplatesForUpdate($this->_mTargetXoopsModule, $this->mLog);
303: Legacy_ModuleInstallUtils::installAllOfModuleTemplates($this->_mTargetXoopsModule, $this->mLog);
304: }
305:
306: 307: 308: 309: 310: 311:
312: function _updateBlocks()
313: {
314: Legacy_ModuleInstallUtils::smartUpdateAllOfBlocks($this->_mTargetXoopsModule, $this->mLog);
315: }
316:
317: 318: 319: 320: 321: 322:
323: function _updatePreferences()
324: {
325: Legacy_ModuleInstallUtils::smartUpdateAllOfPreferences($this->_mTargetXoopsModule, $this->mLog);
326: }
327:
328: 329: 330: 331: 332: 333: 334: 335: 336:
337: function executeAutomaticUpgrade()
338: {
339: $this->mLog->addReport(_AD_LEGACY_MESSAGE_UPDATE_STARTED);
340:
341:
342:
343:
344: $this->_updateModuleTemplates();
345: if (!$this->_mForceMode && $this->mLog->hasError()) {
346: $this->_processReport();
347: return false;
348: }
349:
350:
351:
352:
353: $this->_updateBlocks();
354: if (!$this->_mForceMode && $this->mLog->hasError()) {
355: $this->_processReport();
356: return false;
357: }
358:
359:
360:
361:
362: $this->_updatePreferences();
363: if (!$this->_mForceMode && $this->mLog->hasError()) {
364: $this->_processReport();
365: return false;
366: }
367:
368:
369:
370:
371: $this->saveXoopsModule($this->_mTargetXoopsModule);
372: if (!$this->_mForceMode && $this->mLog->hasError()) {
373: $this->_processReport();
374: return false;
375: }
376:
377:
378:
379:
380: $this->_processScript();
381: if (!$this->_mForceMode && $this->mLog->hasError()) {
382: $this->_processReport();
383: return false;
384: }
385:
386: $this->_processReport();
387:
388: return true;
389: }
390: }
391:
392: ?>
393: