Bunch of fixes and enhancements for package uninstallation
authorAlexander Ebert <ebert@woltlab.com>
Thu, 6 Dec 2012 21:26:42 +0000 (22:26 +0100)
committerAlexander Ebert <ebert@woltlab.com>
Thu, 6 Dec 2012 21:26:42 +0000 (22:26 +0100)
wcfsetup/install/files/acp/js/WCF.ACP.js
wcfsetup/install/files/acp/templates/package.tpl
wcfsetup/install/files/acp/templates/packageListDetailed.tpl
wcfsetup/install/files/lib/data/package/Package.class.php
wcfsetup/install/files/lib/data/package/PackageAction.class.php
wcfsetup/install/lang/de.xml

index c04083b5627ece29ffbd5029b813e0dbbfdd40e8..641e336bd47a55c3fc62bc6d7cebcf8d0bda6eee 100644 (file)
@@ -657,10 +657,41 @@ WCF.ACP.Package.Uninstallation = WCF.ACP.Package.Installation.extend({
        _prepareQueue: function(event) {
                var $element = $(event.target);
                
+               if ($element.data('isRequired')) {
+                       new WCF.Action.Proxy({
+                               autoSend: true,
+                               data: {
+                                       actionName: 'getConfirmMessage',
+                                       className: 'wcf\\data\\package\\PackageAction',
+                                       objectIDs: [ $element.data('objectID') ]
+                               },
+                               success: $.proxy(function(data, textStatus, jqXHR) {
+                                       // remove isRequired flag to prevent loading the same content again
+                                       $element.data('isRequired', false);
+                                       
+                                       // update confirmation message
+                                       $element.data('confirmMessage', data.returnValues.confirmMessage);
+                                       
+                                       // display confirmation dialog
+                                       this._showConfirmationDialog($element);
+                               }, this)
+                       });
+               }
+               else {
+                       this._showConfirmationDialog($element);
+               }
+       },
+       
+       /**
+        * Displays a confirmation dialog prior to package uninstallation.
+        * 
+        * @param       jQuery          element
+        */
+       _showConfirmationDialog: function(element) {
                var self = this;
-               WCF.System.Confirmation.show($element.data('confirmMessage'), function(action) {
+               WCF.System.Confirmation.show(element.data('confirmMessage'), function(action) {
                        if (action === 'confirm') {
-                               self._packageID = $element.data('objectID');
+                               self._packageID = element.data('objectID');
                                self.prepareInstallation();
                        }
                });
index 42d731a5dc177ed43f8b58eb9d413c8e62e98455..78db50eb4c7583d969ec0a177f4f64a433ed14f7 100644 (file)
                                                                                                <img src="{@$__wcf->getPath()}icon/update.svg" alt="" title="{lang}wcf.acp.package.button.update{/lang}" class="icon16 disabled" />
                                                                                        {/if}
                                                                                        {if $requiredPackage->canUninstall()}
-                                                                                               <img src="{@$__wcf->getPath()}icon/delete.svg" alt="" title="{lang}wcf.acp.package.button.uninstall{/lang}" class="icon16 jsTooltip jsUninstallButton" data-objectID="{@$requiredPackage->packageID}" data-confirm-message="{lang package=$requiredPackage}wcf.acp.package.uninstallation.confirm{/lang}" />
+                                                                                               <img src="{@$__wcf->getPath()}icon/delete.svg" alt="" title="{lang}wcf.acp.package.button.uninstall{/lang}" class="icon16 jsTooltip jsUninstallButton" data-objectID="{@$requiredPackage->packageID}" data-confirm-message="{lang package=$requiredPackage}wcf.acp.package.uninstallation.confirm{/lang}" data-is-required="{$package->isRequired()}true{else}false{/if}" />
                                                                                        {else}
                                                                                                <img src="{@$__wcf->getPath()}icon/delete.svg" alt="" title="{lang}wcf.acp.package.button.uninstall{/lang}" class="icon16 disabled" />
                                                                                        {/if}
                                                                                                <img src="{@$__wcf->getPath()}icon/update.svg" alt="" title="{lang}wcf.acp.package.button.update{/lang}" class="icon16 disabled" />
                                                                                        {/if}
                                                                                        {if $dependentPackage->canUninstall()}
-                                                                                               <img src="{@$__wcf->getPath()}icon/delete.svg" alt="" title="{lang}wcf.acp.package.button.uninstall{/lang}" class="icon16 jsTooltip jsUninstallButton" data-objectID="{@$dependentPackage->packageID}" data-confirm-message="{lang package=$dependentPackage}wcf.acp.package.uninstallation.confirm{/lang}" />
+                                                                                               <img src="{@$__wcf->getPath()}icon/delete.svg" alt="" title="{lang}wcf.acp.package.button.uninstall{/lang}" class="icon16 jsTooltip jsUninstallButton" data-objectID="{@$dependentPackage->packageID}" data-confirm-message="{lang package=$dependentPackage}wcf.acp.package.uninstallation.confirm{/lang}" data-is-required="{$package->isRequired()}true{else}false{/if}" />
                                                                                        {else}
                                                                                                <img src="{@$__wcf->getPath()}icon/delete.svg" alt="" title="{lang}wcf.acp.package.button.uninstall{/lang}" class="icon16 disabled" />
                                                                                        {/if}
index cc5ab073ad284af36eac1c24e242f9faa6982366..bbdee27f2643c43b44c658b328b90659ec541837 100644 (file)
@@ -63,7 +63,7 @@
                                                                <img src="{@$__wcf->getPath()}icon/update.svg" alt="" title="{lang}wcf.acp.package.button.update{/lang}" class="icon16 disabled" />
                                                        {/if}
                                                        {if $package->canUninstall()}
-                                                               <img src="{@$__wcf->getPath()}icon/delete.svg" alt="" title="{lang}wcf.acp.package.button.uninstall{/lang}" class="icon16 jsUninstallButton jsTooltip" data-object-id="{@$package->packageID}" data-confirm-message="{lang}wcf.acp.package.uninstallation.confirm{/lang}" />
+                                                               <img src="{@$__wcf->getPath()}icon/delete.svg" alt="" title="{lang}wcf.acp.package.button.uninstall{/lang}" class="icon16 jsUninstallButton jsTooltip" data-object-id="{@$package->packageID}" data-confirm-message="{lang}wcf.acp.package.uninstallation.confirm{/lang}" data-is-required="{$package->isRequired()}true{else}false{/if}" />
                                                        {else}
                                                                <img src="{@$__wcf->getPath()}icon/delete.svg" alt="" title="{lang}wcf.acp.package.button.uninstall{/lang}" class="icon16 disabled" />
                                                        {/if}
index 44993a77cb94ceac9539ff6e9219e663529e6aa0..baa60762aea7f97cf6e0d8c253ed52be521eada3 100644 (file)
@@ -43,12 +43,6 @@ class Package extends DatabaseObject {
         */
        protected $dependencies = null;
        
-       /**
-        * list of packages that require this package
-        * @var array<wcf\data\package\Package>
-        */
-       protected $dependentPackages = null;
-       
        /**
         * installation directory
         * @var string
@@ -119,31 +113,6 @@ class Package extends DatabaseObject {
                return $this->dependencies;
        }
        
-       /**
-        * Returns a list of all packages that require this package.
-        * Returns packages that require this package and packages that require these packages.
-        * 
-        * @return      array<wcf\data\package\Package>
-        */
-       public function getDependentPackages() {
-               if ($this->dependentPackages === null) {
-                       $this->dependentPackages = array();
-                       
-                       $sql = "SELECT          package.*, CASE WHEN instanceName <> '' THEN instanceName ELSE packageName END AS packageName
-                               FROM            wcf".WCF_N."_package_requirement package_requirement
-                               LEFT JOIN       wcf".WCF_N."_package package ON (package.packageID = package_requirement.packageID)
-                               WHERE           package_requirement.requirement = ?
-                               ORDER BY        packageName ASC";
-                       $statement = WCF::getDB()->prepareStatement($sql);
-                       $statement->execute(array($this->packageID));
-                       while ($package = $statement->fetchObject('wcf\data\package\Package')) {
-                               $this->dependentPackages[$package->packageID] = $package;
-                       }
-               }
-               
-               return $this->dependentPackages;
-       }
-       
        /**
         * Returns a list of the requirements of this package.
         * Contains the content of the <requiredPackages> tag in the package.xml of this package.
@@ -192,6 +161,24 @@ class Package extends DatabaseObject {
                return true;
        }
        
+       /**
+        * Returns a list of packages dependent from current package.
+        * 
+        * @return      array<wcf\data\package\Package>
+        */
+       public function getDependentPackages() {
+               self::loadRequirementMap();
+               
+               $packages = array();
+               if (isset(self::$requirementMap[$this->packageID])) {
+                       foreach (self::$requirementMap[$this->packageID] as $packageID) {
+                               $packages[$packageID] = PackageCache::getInstance()->getPackage($packageID);
+                       }
+               }
+               
+               return $packages;
+       }
+       
        /**
         * Returns true, if package $packageID is required by package $targetPackageID.
         * 
index 92a132b5231d536fbce197c6b53f9a3009e99560..e509cf2db0a92ca9d8b4f0af6c7e4115c715177f 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 namespace wcf\data\package;
+use wcf\system\exception\PermissionDeniedException;
+
 use wcf\data\AbstractDatabaseObjectAction;
 use wcf\system\exception\UserInputException;
 use wcf\system\WCF;
@@ -35,6 +37,12 @@ class PackageAction extends AbstractDatabaseObjectAction {
         */
        protected $permissionsUpdate = array('admin.system.package.canUpdatePackage');
        
+       /**
+        * package editor object
+        * @var wcf\data\package\PackageEditor
+        */
+       public $packageEditor = null;
+       
        /**
         * Validates the 'getPluginList' action.
         */
@@ -63,4 +71,30 @@ class PackageAction extends AbstractDatabaseObjectAction {
                        'template' => WCF::getTPL()->fetch('packageListPlugins')
                );
        }
+       
+       /**
+        * Validates parameters to return the confirm message for package uninstallation.
+        */
+       public function validateGetConfirmMessage() {
+               WCF::getSession()->checkPermissions($this->permissionsUpdate);
+               
+               $this->packageEditor = $this->getSingleObject();
+               if (!$this->packageEditor->canUninstall()) {
+                       throw new PermissionDeniedException();
+               }
+       }
+       
+       /**
+        * Returns the confirm message for package uninstallation.
+        * 
+        * @return      array<string>
+        */
+       public function getConfirmMessage() {
+               return array(
+                       'confirmMessage' => WCF::getLanguage()->getDynamicVariable('wcf.acp.package.uninstallation.confirmDependentPackages', array(
+                               'package' => $this->packageEditor->getDecoratedObject(),
+                               'showDependentPackages' => true
+                       ))
+               );
+       }
 }
index 919f04753680bc01b78084002403802e73edf964..1fbd32a0b58a1a8b1c45f65bb3129a3480a97efe 100644 (file)
                <item name="wcf.acp.package.type.other"><![CDATA[Basispaket]]></item>
                <item name="wcf.acp.package.type.plugin"><![CDATA[Erweiterung]]></item>
                <item name="wcf.acp.package.uninstallation.confirm"><![CDATA[Wollen Sie das Paket „{@$package->getName()}“ wirklich deinstallieren?]]></item>
+               <item name="wcf.acp.package.uninstallation.confirmDependentPackages"><![CDATA[Wollen Sie das Paket „{@$package->getName()}“ wirklich deinstallieren? Beachten Sie bitte, dass die folgenden Pakete ebenfalls deinstalliert werden:
+<ul>
+       {foreach from=$package->getDependentPackages() as $dependentPackage}
+               <li><a href="{link controller='Package' object=$dependentPackage}{/link}">{$dependentPackage}</a></li>
+       {/foreach}
+</ul>]]></item>
                <item name="wcf.acp.package.updateDate"><![CDATA[Aktualisierungsdatum]]></item>
                <item name="wcf.acp.package.version"><![CDATA[Version]]></item>
        </category>