1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
15:
16: defined('CON_FRAMEWORK') || die('Illegal call: Missing framework initialization - request aborted.');
17:
18: 19: 20: 21: 22: 23: 24:
25: class PimPluginSetupUninstall extends PimPluginSetup {
26:
27:
28:
29:
30: private $_PluginFoldername;
31:
32:
33:
34: protected $_PimPluginCollection;
35:
36:
37: protected $_PimPluginRelationsCollection;
38:
39:
40: protected $_ApiAreaCollection;
41:
42:
43: protected $_ApiActionCollection;
44:
45:
46: protected $_ApiFileCollection;
47:
48:
49: protected $_ApiFrameFileCollection;
50:
51:
52: protected $_ApiNavMainCollection;
53:
54:
55: protected $_ApiNavSubCollection;
56:
57:
58: protected $_ApiTypeCollection;
59:
60:
61: 62: 63: 64: 65: 66:
67: public function setPluginFoldername($foldername) {
68: return $this->_PluginFoldername = cSecurity::escapeString($foldername);
69: }
70:
71: 72: 73: 74: 75:
76: private function _setPimPluginCollection() {
77: return $this->_PimPluginCollection = new PimPluginCollection();
78: }
79:
80: 81: 82: 83: 84:
85: private function _setPimPluginRelationsCollection() {
86: return $this->_PimPluginRelationsCollection = new PimPluginRelationsCollection();
87: }
88:
89: 90: 91: 92: 93:
94: private function _setApiAreaCollection() {
95: return $this->_ApiAreaCollection = new cApiAreaCollection();
96: }
97:
98: 99: 100: 101: 102:
103: private function _setApiActionCollection() {
104: return $this->_ApiActionCollection = new cApiActionCollection();
105: }
106:
107: 108: 109: 110: 111:
112: private function _setApiFileCollection() {
113: return $this->_ApiFileCollection = new cApiFileCollection();
114: }
115:
116: 117: 118: 119: 120:
121: private function _setApiFrameFileCollection() {
122: return $this->_ApiFrameFileCollection = new cApiFrameFileCollection();
123: }
124:
125: 126: 127: 128: 129:
130: private function _setApiNavMainCollection() {
131: return $this->_ApiNavMainCollection = new cApiNavMainCollection();
132: }
133:
134: 135: 136: 137: 138:
139: private function _setApiNavSubCollection() {
140: return $this->_ApiNavSubCollection = new cApiNavSubCollection();
141: }
142:
143: 144: 145: 146: 147:
148: private function _setApiTypeCollection() {
149: return $this->_ApiTypeCollection = new cApiTypeCollection();
150: }
151:
152: 153: 154: 155: 156:
157: protected function _getPluginFoldername() {
158: return $this->_PluginFoldername;
159: }
160:
161:
162: 163: 164:
165: public function __construct() {
166:
167:
168:
169: $this->_setPimPluginCollection();
170: $this->_setPimPluginRelationsCollection();
171:
172:
173: $this->_setApiAreaCollection();
174: $this->_setApiActionCollection();
175: $this->_setApiFileCollection();
176: $this->_setApiFrameFileCollection();
177: $this->_setApiNavMainCollection();
178: $this->_setApiNavSubCollection();
179: $this->_setApiTypeCollection();
180: }
181:
182: 183: 184: 185: 186: 187:
188: public function uninstall($sql = true) {
189: $cfg = cRegistry::getConfig();
190:
191:
192: $this->_uninstallCheckDependencies();
193:
194:
195: $this->_PimPluginRelationsCollection->setWhere('idplugin', parent::_getPluginId());
196: $this->_PimPluginRelationsCollection->query();
197:
198: $relations = array();
199:
200: while (($relation = $this->_PimPluginRelationsCollection->next()) !== false) {
201:
202:
203: $index = $relation->get('type');
204:
205:
206:
207: $value = $relation->get('iditem');
208: $relations[$index][] = $value;
209: }
210:
211:
212: if (!empty($relations['action'])) {
213: $this->_ApiActionCollection->deleteByWhereClause("idaction IN('" . join("', '", $relations['action']) . "')");
214: }
215:
216:
217: if (!empty($relations['area'])) {
218: $this->_ApiFileCollection->deleteByWhereClause("idarea IN('" . join("', '", $relations['area']) . "')");
219: $this->_ApiFrameFileCollection->deleteByWhereClause("idarea IN('" . join("', '", $relations['area']) . "')");
220: $this->_ApiAreaCollection->deleteByWhereClause("idarea IN('" . join("', '", $relations['area']) . "')");
221: }
222:
223:
224: if (!empty($relations['navm'])) {
225: $this->_ApiNavMainCollection->deleteByWhereClause("idnavm IN('" . join("', '", $relations['navm']) . "')");
226: }
227:
228:
229: if (!empty($relations['navs'])) {
230: $this->_ApiNavSubCollection->deleteByWhereClause("idnavs IN('" . join("', '", $relations['navs']) . "')");
231: }
232:
233:
234: if (!empty($relations['ctype'])) {
235: $this->_ApiTypeCollection->deleteByWhereClause("idtype IN('" . join("', '", $relations['ctype']) . "')");
236: }
237:
238:
239: $this->_PimPluginCollection->resetQuery();
240: $this->_PimPluginCollection->setWhere('idplugin', parent::_getPluginId());
241: $this->_PimPluginCollection->query();
242: $pimPluginSql = $this->_PimPluginCollection->next();
243:
244:
245: $this->setPluginFoldername($pimPluginSql->get('folder'));
246:
247:
248:
249: if ($sql == true && PimPluginSetup::_getUpdateSqlFileExist() == false) {
250: $this->_uninstallDeleteSpecificSql();
251: }
252:
253:
254: $pluginname = $pimPluginSql->get('name');
255:
256:
257: $this->_PimPluginRelationsCollection->deleteByWhereClause('idplugin = ' . parent::_getPluginId());
258: $this->_PimPluginCollection->deleteByWhereClause('idplugin = ' . parent::_getPluginId());
259:
260:
261: $this->_writeNewExecutionOrder();
262:
263:
264: if (parent::$_GuiPage instanceof cGuiPage && parent::getMode() == 3) {
265: parent::info(sprintf(i18n('The plugin <strong>%s</strong> has been successfully removed. To apply the changes please login into backend again.', 'pim'), $pluginname));
266: }
267: }
268:
269: 270: 271:
272: private function _uninstallCheckDependencies() {
273:
274:
275:
276: $result = $this->checkDependencies();
277:
278:
279: if ($result === false) {
280: parent::error(sprintf(i18n('This plugin is required by the plugin <strong>%s</strong>, so you can not remove it.', 'pim'), parent::_getPluginName()));
281: }
282: }
283:
284: 285: 286:
287: protected function _uninstallDeleteSpecificSql() {
288: $cfg = cRegistry::getConfig();
289: $db = cRegistry::getDb();
290:
291: $tempSqlFilename = $cfg['path']['contenido'] . $cfg['path']['plugins'] . $this->_getPluginFoldername() . DIRECTORY_SEPARATOR . 'plugin_uninstall.sql';
292:
293: if (!cFileHandler::exists($tempSqlFilename)) {
294: return;
295: }
296:
297: $tempSqlContent = cFileHandler::read($tempSqlFilename);
298: $tempSqlContent = str_replace("\r\n", "\n", $tempSqlContent);
299: $tempSqlContent = explode("\n", $tempSqlContent);
300: $tempSqlLines = count($tempSqlContent);
301:
302: $pattern = '/^(DELETE FROM|DROP TABLE) `?' . parent::SQL_PREFIX . '`?\b/';
303:
304: for ($i = 0; $i < $tempSqlLines; $i++) {
305: if (preg_match($pattern, $tempSqlContent[$i])) {
306: $tempSqlContent[$i] = str_replace(parent::SQL_PREFIX, $cfg['sql']['sqlprefix'] . '_pi', $tempSqlContent[$i]);
307: $db->query($tempSqlContent[$i]);
308: }
309: }
310: }
311:
312: 313: 314: 315: 316: 317:
318: public function uninstallDir() {
319: $cfg = cRegistry::getConfig();
320:
321:
322: $folderpath = $cfg['path']['contenido'] . $cfg['path']['plugins'] . $this->_getPluginFoldername();
323: cDirHandler::recursiveRmdir($folderpath);
324:
325: if (parent::$_GuiPage instanceof cGuiPage) {
326:
327:
328: if (!cFileHandler::exists($folderpath)) {
329: parent::info(sprintf(i18n('The pluginfolder <strong>%s</strong> has been successfully uninstalled.', 'pim'), $this->_getPluginFoldername()));
330: } else if (cFileHandler::exists($folderpath)) {
331: parent::error(sprintf(i18n('The pluginfolder <strong>%s</strong> could not be uninstalled.', 'pim'), $this->_getPluginFoldername()));
332: }
333: }
334: }
335:
336: 337: 338: 339: 340:
341: protected function _writeNewExecutionOrder() {
342:
343:
344: $i = 1;
345:
346: $pimPluginColl = new PimPluginCollection();
347: $pimPluginColl->setOrder('executionorder ASC');
348: $pimPluginColl->query();
349: while ($pimPluginSql = $pimPluginColl->next()) {
350: $pimPluginSql->set('executionorder', $i);
351: $pimPluginSql->store();
352:
353: $i++;
354: }
355:
356: return true;
357: }
358:
359: }
360: ?>