Overview

Packages

  • Core
    • Authentication
    • Backend
    • Cache
    • CEC
    • Chain
    • ContentType
    • Database
    • Datatype
    • Debug
    • Exception
    • Frontend
      • Search
      • URI
      • Util
    • GenericDB
      • Model
    • GUI
      • HTML
    • I18N
    • LayoutHandler
    • Log
    • Security
    • Session
    • Util
    • Validation
    • Versioning
    • XML
  • Module
    • ContentSitemapHtml
    • ContentSitemapXml
    • ContentUserForum
    • NavigationTop
  • mpAutoloaderClassMap
  • None
  • Plugin
    • ContentAllocation
    • CronjobOverview
    • FormAssistant
    • FrontendLogic
    • FrontendUsers
    • Linkchecker
    • ModRewrite
    • Newsletter
    • Repository
      • FrontendNavigation
      • KeywordDensity
    • SearchSolr
    • SmartyWrapper
    • UrlShortener
    • UserForum
    • Workflow
  • PluginManager
  • Setup
    • Form
    • GUI
    • Helper
      • Environment
      • Filesystem
      • MySQL
      • PHP
    • UpgradeJob

Classes

  • PimPlugin
  • PimPluginArchiveExtractor
  • PimPluginCollection
  • PimPluginRelations
  • PimPluginRelationsCollection
  • PimPluginSetup
  • PimPluginSetupInstall
  • PimPluginSetupStatus
  • PimPluginSetupUninstall
  • PimPluginSetupUpdate
  • PimPluginViewNavSub
  • Overview
  • Package
  • Class
  • Tree
  • Deprecated
  • Todo
  1: <?php
  2: /**
  3:  * This file contains abstract class for installation new plugins
  4:  *
  5:  * @package Plugin
  6:  * @subpackage PluginManager
  7:  * @version SVN Revision $Rev:$
  8:  *
  9:  * @author Frederic Schneider
 10:  * @copyright four for business AG <www.4fb.de>
 11:  * @license http://www.contenido.org/license/LIZENZ.txt
 12:  * @link http://www.4fb.de
 13:  * @link http://www.contenido.org
 14:  */
 15: 
 16: defined('CON_FRAMEWORK') || die('Illegal call: Missing framework initialization - request aborted.');
 17: 
 18: /**
 19:  * Uninstall class for existing plugins, extends PimPluginSetup
 20:  *
 21:  * @package Plugin
 22:  * @subpackage PluginManager
 23:  * @author frederic.schneider
 24:  */
 25: class PimPluginSetupUninstall extends PimPluginSetup {
 26: 
 27:     // Initializing variables
 28:     // Plugin specific data
 29:     // Foldername of installed plugin
 30:     private $_PluginFoldername;
 31: 
 32:     // Classes
 33:     // Class variable for PimPluginCollection
 34:     protected $_PimPluginCollection;
 35: 
 36:     // Class variable for PimPluginRelationsCollection
 37:     protected $_PimPluginRelationsCollection;
 38: 
 39:     // Class variable for cApiAreaCollection;
 40:     protected $_ApiAreaCollection;
 41: 
 42:     // Class variable for cApiActionCollection
 43:     protected $_ApiActionCollection;
 44: 
 45:     // Class variable for cApiFileCollection
 46:     protected $_ApiFileCollection;
 47: 
 48:     // Class variable for cApiFrameFileCollection
 49:     protected $_ApiFrameFileCollection;
 50: 
 51:     // Class variable for cApiNavMainCollection
 52:     protected $_ApiNavMainCollection;
 53: 
 54:     // Class variable for cApiNavSubCollection
 55:     protected $_ApiNavSubCollection;
 56: 
 57:     // Class variable for cApiTypeCollection
 58:     protected $_ApiTypeCollection;
 59: 
 60:     // GET and SET methods for installation routine
 61:     /**
 62:      * Set variable for plugin foldername
 63:      *
 64:      * @param string $foldername
 65:      * @return string
 66:      */
 67:     public function setPluginFoldername($foldername) {
 68:         return $this->_PluginFoldername = cSecurity::escapeString($foldername);
 69:     }
 70: 
 71:     /**
 72:      * Initializing and set variable for PimPluginCollection class
 73:      *
 74:      * @return PimPluginCollection
 75:      */
 76:     private function _setPimPluginCollection() {
 77:         return $this->_PimPluginCollection = new PimPluginCollection();
 78:     }
 79: 
 80:     /**
 81:      * Initializing and set variable for PimPluginRelationsCollection class
 82:      *
 83:      * @return PimPluginRelationsCollection
 84:      */
 85:     private function _setPimPluginRelationsCollection() {
 86:         return $this->_PimPluginRelationsCollection = new PimPluginRelationsCollection();
 87:     }
 88: 
 89:     /**
 90:      * Initializing and set variable for cApiAreaCollection
 91:      *
 92:      * @return cApiAreaCollection
 93:      */
 94:     private function _setApiAreaCollection() {
 95:         return $this->_ApiAreaCollection = new cApiAreaCollection();
 96:     }
 97: 
 98:     /**
 99:      * Initializing and set variable for cApiActionCollection
100:      *
101:      * @return cApiActionCollection
102:      */
103:     private function _setApiActionCollection() {
104:         return $this->_ApiActionCollection = new cApiActionCollection();
105:     }
106: 
107:     /**
108:      * Initializing and set variable for cApiAFileCollection
109:      *
110:      * @return cApiFileCollection
111:      */
112:     private function _setApiFileCollection() {
113:         return $this->_ApiFileCollection = new cApiFileCollection();
114:     }
115: 
116:     /**
117:      * Initializing and set variable for cApiFrameFileCollection
118:      *
119:      * @return cApiFrameFileCollection
120:      */
121:     private function _setApiFrameFileCollection() {
122:         return $this->_ApiFrameFileCollection = new cApiFrameFileCollection();
123:     }
124: 
125:     /**
126:      * Initializing and set variable for cApiNavMainFileCollection
127:      *
128:      * @return cApiNavMainCollection
129:      */
130:     private function _setApiNavMainCollection() {
131:         return $this->_ApiNavMainCollection = new cApiNavMainCollection();
132:     }
133: 
134:     /**
135:      * Initializing and set variable for cApiNavSubCollection
136:      *
137:      * @return cApiNavSubCollection
138:      */
139:     private function _setApiNavSubCollection() {
140:         return $this->_ApiNavSubCollection = new cApiNavSubCollection();
141:     }
142: 
143:     /**
144:      * Initializing and set variable for cApiTypeCollection
145:      *
146:      * @return cApiNavSubCollection
147:      */
148:     private function _setApiTypeCollection() {
149:         return $this->_ApiTypeCollection = new cApiTypeCollection();
150:     }
151: 
152:     /**
153:      * Get method for foldername of installed plugin
154:      *
155:      * @return string
156:      */
157:     protected function _getPluginFoldername() {
158:         return $this->_PluginFoldername;
159:     }
160: 
161:     // Begin of uninstallation routine
162:     /**
163:      * Construct function
164:      */
165:     public function __construct() {
166: 
167:         // Initializing and set classes
168:         // PluginManager classes
169:         $this->_setPimPluginCollection();
170:         $this->_setPimPluginRelationsCollection();
171: 
172:         // cApiClasses
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:      * Uninstall function
184:      *
185:      * @param bool $sql Optional parameter to set sql true (standard) or
186:      *        false
187:      */
188:     public function uninstall($sql = true) {
189:         $cfg = cRegistry::getConfig();
190: 
191:         // Dependencies checks
192:         $this->_uninstallCheckDependencies();
193: 
194:         // get relations
195:         $this->_PimPluginRelationsCollection->setWhere('idplugin', parent::_getPluginId());
196:         $this->_PimPluginRelationsCollection->query();
197: 
198:         $relations = array();
199: 
200:         while (($relation = $this->_PimPluginRelationsCollection->next()) !== false) {
201:             // Relation to tables *_action_, *_area, *_nav_main, *_nav_sub and
202:             // *_type
203:             $index = $relation->get('type');
204: 
205:             // Is equivalent to idaction, idarea, idnavm, idnavs or idtype
206:             // column
207:             $value = $relation->get('iditem');
208:             $relations[$index][] = $value;
209:         }
210: 
211:         // Delete entries with relations to *_actions
212:         if (!empty($relations['action'])) {
213:             $this->_ApiActionCollection->deleteByWhereClause("idaction IN('" . join("', '", $relations['action']) . "')");
214:         }
215: 
216:         // Delete entries with relations to *_area
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:         // Delete entries with relations to *_nav_main
224:         if (!empty($relations['navm'])) {
225:             $this->_ApiNavMainCollection->deleteByWhereClause("idnavm IN('" . join("', '", $relations['navm']) . "')");
226:         }
227: 
228:         // Delete entries with relations to *_nav_sub
229:         if (!empty($relations['navs'])) {
230:             $this->_ApiNavSubCollection->deleteByWhereClause("idnavs IN('" . join("', '", $relations['navs']) . "')");
231:         }
232: 
233:         // Delete content types
234:         if (!empty($relations['ctype'])) {
235:             $this->_ApiTypeCollection->deleteByWhereClause("idtype IN('" . join("', '", $relations['ctype']) . "')");
236:         }
237: 
238:         // Get plugininformations
239:         $this->_PimPluginCollection->setWhere('idplugin', parent::_getPluginId());
240:         $this->_PimPluginCollection->query();
241:         $pimPluginSql = $this->_PimPluginCollection->next();
242: 
243:         // Set foldername
244:         $this->setPluginFoldername($pimPluginSql->get('folder'));
245: 
246:         // Delete specific sql entries or tables, run only if we have no update
247:         // sql file
248:         if ($sql == true && PimPluginSetup::_getUpdateSqlFileExist() == false) {
249:             $this->_uninstallDeleteSpecificSql();
250:         }
251: 
252:         // Pluginname
253:         $pluginname = $pimPluginSql->get('name');
254: 
255:         // Delete entries at *_plugins_rel and *_plugins
256:         $this->_PimPluginRelationsCollection->deleteByWhereClause('idplugin = ' . parent::_getPluginId());
257:         $this->_PimPluginCollection->deleteByWhereClause('idplugin = ' . parent::_getPluginId());
258: 
259:         // Success message for uninstall mode
260:         if (parent::$_GuiPage instanceof cGuiPage && parent::getMode() == 3) {
261:             parent::info(i18n('The plugin', 'pim') . ' <strong>' . $pluginname . '</strong> ' . i18n('has been successfully uninstalled. To apply the changes please login into backend again.', 'pim'));
262:         }
263:     }
264: 
265:     /**
266:      * Check dependencies to other plugins (dependencies-Tag at plugin.xml)
267:      */
268:     private function _uninstallCheckDependencies() {
269: 
270:         // Call checkDepenendencies function at PimPlugin class
271:         // Function returns true or false
272:         $result = $this->checkDependencies();
273: 
274:         // Show an error message when dependencies could be found
275:         if ($result === false) {
276:             parent::error(sprintf(i18n('This plugin are required by the plugin <strong>%s</strong>, so you can not uninstall it.', 'pim'), parent::_getPluginName()));
277:         }
278:     }
279: 
280:     /**
281:      * Delete specific sql entries or tables, full uninstall mode
282:      */
283:     protected function _uninstallDeleteSpecificSql() {
284:         $cfg = cRegistry::getConfig();
285:         $db = cRegistry::getDb();
286: 
287:         $tempSqlFilename = $cfg['path']['contenido'] . $cfg['path']['plugins'] . $this->_getPluginFoldername() . DIRECTORY_SEPARATOR . 'plugin_uninstall.sql';
288: 
289:         if (!cFileHandler::exists($tempSqlFilename)) {
290:             return;
291:         }
292: 
293:         $tempSqlContent = cFileHandler::read($tempSqlFilename);
294:         $tempSqlContent = str_replace("\r\n", "\n", $tempSqlContent);
295:         $tempSqlContent = explode("\n", $tempSqlContent);
296:         $tempSqlLines = count($tempSqlContent);
297: 
298:         $pattern = '/^(DELETE FROM|DROP TABLE) `?' . parent::SQL_PREFIX . '`?\b/';
299: 
300:         for ($i = 0; $i < $tempSqlLines; $i++) {
301:             if (preg_match($pattern, $tempSqlContent[$i])) {
302:                 $tempSqlContent[$i] = str_replace(parent::SQL_PREFIX, $cfg['sql']['sqlprefix'] . '_pi', $tempSqlContent[$i]);
303:                 $db->query($tempSqlContent[$i]);
304:             }
305:         }
306:     }
307: 
308:     /**
309:      * Delete a installed plugin directory
310:      *
311:      * @param $foldername name of extracted plugin
312:      * @param $page page class for success or error message
313:      */
314:     public function uninstallDir() {
315:         $cfg = cRegistry::getConfig();
316: 
317:         // delete folders
318:         $folderpath = $cfg['path']['contenido'] . $cfg['path']['plugins'] . $this->_getPluginFoldername();
319:         cDirHandler::recursiveRmdir($folderpath);
320: 
321:         if (parent::$_GuiPage instanceof cGuiPage) {
322: 
323:             // success message
324:             if (!cFileHandler::exists($folderpath)) {
325:                 parent::info(i18n('The pluginfolder', 'pim') . ' <strong>' . $this->_getPluginFoldername() . '</strong> ' . i18n('has been successfully uninstalled.', 'pim'));
326:             } else if (cFileHandler::exists($folderpath)) {
327:                 parent::error(i18n('The pluginfolder', 'pim') . ' <strong>' . $this->_getPluginFoldername() . '</strong> ' . i18n('could not be uninstalled.', 'pim'));
328:             }
329:         }
330:     }
331: 
332: }
333: ?>
CMS CONTENIDO 4.9.5 API documentation generated by ApiGen 2.8.0