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:         // get relations
192:         $this->_PimPluginRelationsCollection->setWhere('idplugin', parent::_getPluginId());
193:         $this->_PimPluginRelationsCollection->query();
194: 
195:         $relations = array();
196: 
197:         while (($relation = $this->_PimPluginRelationsCollection->next()) !== false) {
198:             // Relation to tables *_action_, *_area, *_nav_main, *_nav_sub and
199:             // *_type
200:             $index = $relation->get('type');
201: 
202:             // Is equivalent to idaction, idarea, idnavm, idnavs or idtype
203:             // column
204:             $value = $relation->get('iditem');
205:             $relations[$index][] = $value;
206:         }
207: 
208:         // Delete entries with relations to *_actions
209:         if (!empty($relations['action'])) {
210:             $this->_ApiActionCollection->deleteByWhereClause("idaction IN('" . join("', '", $relations['action']) . "')");
211:         }
212: 
213:         // Delete entries with relations to *_area
214:         if (!empty($relations['area'])) {
215:             $this->_ApiFileCollection->deleteByWhereClause("idarea IN('" . join("', '", $relations['area']) . "')");
216:             $this->_ApiFrameFileCollection->deleteByWhereClause("idarea IN('" . join("', '", $relations['area']) . "')");
217:             $this->_ApiAreaCollection->deleteByWhereClause("idarea IN('" . join("', '", $relations['area']) . "')");
218:         }
219: 
220:         // Delete entries with relations to *_nav_main
221:         if (!empty($relations['navm'])) {
222:             $this->_ApiNavMainCollection->deleteByWhereClause("idnavm IN('" . join("', '", $relations['navm']) . "')");
223:         }
224: 
225:         // Delete entries with relations to *_nav_sub
226:         if (!empty($relations['navs'])) {
227:             $this->_ApiNavSubCollection->deleteByWhereClause("idnavs IN('" . join("', '", $relations['navs']) . "')");
228:         }
229: 
230:         // Delete content types
231:         if (!empty($relations['ctype'])) {
232:             $this->_ApiTypeCollection->deleteByWhereClause("idtype IN('" . join("', '", $relations['ctype']) . "')");
233:         }
234: 
235:         // Get plugininformations
236:         $this->_PimPluginCollection->setWhere('idplugin', parent::_getPluginId());
237:         $this->_PimPluginCollection->query();
238:         $pimPluginSql = $this->_PimPluginCollection->next();
239: 
240:         // Set foldername
241:         $this->setPluginFoldername($pimPluginSql->get('folder'));
242: 
243:         // Delete specific sql entries or tables, run only if we have no update
244:         // sql file
245:         if ($sql == true && PimPluginSetup::_getUpdateSqlFileExist() == false) {
246:             $this->_uninstallDeleteSpecificSql();
247:         }
248: 
249:         // Pluginname
250:         $pluginname = $pimPluginSql->get('name');
251: 
252:         // Delete entries at *_plugins_rel and *_plugins
253:         $this->_PimPluginRelationsCollection->deleteByWhereClause('idplugin = ' . parent::_getPluginId());
254:         $this->_PimPluginCollection->deleteByWhereClause('idplugin = ' . parent::_getPluginId());
255: 
256:         // Success message for uninstall mode
257:         if (parent::$_GuiPage instanceof cGuiPage && parent::getMode() == 3) {
258:             parent::info(i18n('The plugin', 'pim') . ' <strong>' . $pluginname . '</strong> ' . i18n('has been successfully uninstalled. To apply the changes please login into backend again.', 'pim'));
259:         }
260:     }
261: 
262:     /**
263:      * Delete specific sql entries or tables, full uninstall mode
264:      */
265:     protected function _uninstallDeleteSpecificSql() {
266:         $cfg = cRegistry::getConfig();
267:         $db = cRegistry::getDb();
268: 
269:         $tempSqlFilename = $cfg['path']['contenido'] . $cfg['path']['plugins'] . $this->_getPluginFoldername() . DIRECTORY_SEPARATOR . 'plugin_uninstall.sql';
270: 
271:         if (!cFileHandler::exists($tempSqlFilename)) {
272:             return;
273:         }
274: 
275:         $tempSqlContent = cFileHandler::read($tempSqlFilename);
276:         $tempSqlContent = str_replace("\r\n", "\n", $tempSqlContent);
277:         $tempSqlContent = explode("\n", $tempSqlContent);
278:         $tempSqlLines = count($tempSqlContent);
279: 
280:         $pattern = '/^(DELETE FROM|DROP TABLE) `?' . parent::SQL_PREFIX . '`?\b/';
281: 
282:         for ($i = 0; $i < $tempSqlLines; $i++) {
283:             if (preg_match($pattern, $tempSqlContent[$i])) {
284:                 $tempSqlContent[$i] = str_replace(parent::SQL_PREFIX, $cfg['sql']['sqlprefix'] . '_pi', $tempSqlContent[$i]);
285:                 $db->query($tempSqlContent[$i]);
286:             }
287:         }
288:     }
289: 
290:     /**
291:      * Delete a installed plugin directory
292:      *
293:      * @param $foldername name of extracted plugin
294:      * @param $page page class for success or error message
295:      */
296:     public function uninstallDir() {
297:         $cfg = cRegistry::getConfig();
298: 
299:         // delete folders
300:         $folderpath = $cfg['path']['contenido'] . $cfg['path']['plugins'] . $this->_getPluginFoldername();
301:         cDirHandler::recursiveRmdir($folderpath);
302: 
303:         if (parent::$_GuiPage instanceof cGuiPage) {
304: 
305:             // success message
306:             if (!cFileHandler::exists($folderpath)) {
307:                 parent::info(i18n('The pluginfolder', 'pim') . ' <strong>' . $this->_getPluginFoldername() . '</strong> ' . i18n('has been successfully uninstalled.', 'pim'));
308:             } else if (cFileHandler::exists($folderpath)) {
309:                 parent::error(i18n('The pluginfolder', 'pim') . ' <strong>' . $this->_getPluginFoldername() . '</strong> ' . i18n('could not be uninstalled.', 'pim'));
310:             }
311:         }
312:     }
313: 
314: }
315: ?>
CMS CONTENIDO 4.9.3 API documentation generated by ApiGen 2.8.0