Fix for non-installable optional packages
authorAlexander Ebert <ebert@woltlab.com>
Mon, 19 Aug 2013 21:42:29 +0000 (23:42 +0200)
committerAlexander Ebert <ebert@woltlab.com>
Mon, 19 Aug 2013 21:42:29 +0000 (23:42 +0200)
wcfsetup/install/files/lib/system/form/element/MultipleSelectionFormElement.class.php
wcfsetup/install/files/lib/system/package/PackageInstallationDispatcher.class.php
wcfsetup/install/files/lib/system/package/PackageInstallationNodeBuilder.class.php
wcfsetup/install/lang/de.xml
wcfsetup/install/lang/en.xml

index 44b42fe23448504bbc58b3b6b0ca10f025764a82..c1ca60a5e1817881f34b695f7cc5dda5709df2b2 100644 (file)
@@ -12,6 +12,12 @@ namespace wcf\system\form\element;
  * @category   Community Framework
  */
 class MultipleSelectionFormElement extends AbstractNamedFormElement {
+       /**
+        * message displayed if the input is disabled
+        * @var string
+        */
+       protected $disabledMessage = '';
+       
        /**
         * @see wcf\system\form\element\AbstractNamedFormElement::setValue()
         */
@@ -24,12 +30,37 @@ class MultipleSelectionFormElement extends AbstractNamedFormElement {
                }
        }
        
+       /**
+        * Sets message displayed if input should be disabled.
+        * 
+        * @param       string          $message
+        */
+       public function setDisabledMessage($message) {
+               $this->disabledMessage = $message;
+       }
+       
+       /**
+        * @see wcf\system\form\element\AbstractNamedFormElement::getDescription()
+        */
+       public function getDescription() {
+               if ($this->disabledMessage) {
+                       return $this->disabledMessage;
+               }
+               
+               return parent::getDescription();
+       }
+       
        /**
         * @see wcf\system\form\IFormElement::getHTML()
         */
        public function getHTML($formName) {
+               $disabled = '';
+               if ($this->disabledMessage) {
+                       $disabled = ' disabled="disabled"';
+               }
+               
                return <<<HTML
-<label><input type="checkbox" name="{$formName}{$this->getParent()->getName()}[]" value="{$this->getValue()}" /> {$this->getLabel()}</label>
+<label><input type="checkbox" name="{$formName}{$this->getParent()->getName()}[]" value="{$this->getValue()}"{$disabled} /> {$this->getLabel()}</label>
 <small>{$this->getDescription()}</small>
 HTML;
        }
index 852bd35cf7bb0cd5f41b19cd0f25407d3277dc84..e23e3b66cf2e426e8d78124aab19d992548d85bc 100644 (file)
@@ -551,6 +551,11 @@ class PackageInstallationDispatcher {
                        
                        foreach ($nodeData as $package) {
                                if (in_array($package['package'], $document)) {
+                                       // ignore uninstallable packages
+                                       if (!$package['isInstallable']) {
+                                               continue;
+                                       }
+                                       
                                        if (!$shiftNodes) {
                                                $this->nodeBuilder->shiftNodes($currentNode, 'tempNode');
                                                $shiftNodes = true;
@@ -702,6 +707,9 @@ class PackageInstallationDispatcher {
                                $optionalPackage->setLabel($package['packageName']);
                                $optionalPackage->setValue($package['package']);
                                $optionalPackage->setDescription($package['packageDescription']);
+                               if ($package['isInstallable']) {
+                                       $optionalPackage->setDisabledMessage(WCF::getLanguage()->get('wcf.acp.package.install.optionalPackage.missingRequirements'));
+                               }
                                
                                $container->appendChild($optionalPackage);
                        }
index fc1e1e84c5f002e95423e43dff6c4faa4155a8c8..b0144595790fd83fcf39ce69bfca3a4c88ca5d26 100644 (file)
@@ -50,6 +50,12 @@ class PackageInstallationNodeBuilder {
         */
        public $sequenceNo = 0;
        
+       /**
+        * list of packages about to be installed
+        * @var boolean
+        */
+       protected static $pendingPackages = array();
+       
        /**
         * Creates a new instance of PackageInstallationNodeBuilder
         * 
@@ -409,6 +415,8 @@ class PackageInstallationNodeBuilder {
                                'requirements' => $this->requirements
                        ))
                ));
+               
+               self::$pendingPackages[] = $this->installation->getArchive()->getPackageInfo('name');
        }
        
        /**
@@ -480,6 +488,8 @@ class PackageInstallationNodeBuilder {
                        $installation->nodeBuilder->setParentNode($this->node);
                        $installation->nodeBuilder->buildNodes();
                        $this->node = $installation->nodeBuilder->getCurrentNode();
+                       
+                       self::$pendingPackages[] = $archive->getPackageInfo('name');
                }
        }
        
@@ -582,13 +592,28 @@ class PackageInstallationNodeBuilder {
                        $archive = new PackageArchive($fileName);
                        $archive->openArchive();
                        
+                       // check if all requirements are met
+                       $isInstallable = true;
+                       foreach ($archive->getOpenRequirements() as $packageName => $package) {
+                               if (!isset($package['file'])) {
+                                       // requirement is neither installed nor shipped, check if it is about to be installed
+                                       if (!in_array($packageName, self::$pendingPackages)) {
+                                               $isInstallable = false;
+                                               break;
+                                       }
+                               }
+                       }
+                       
                        $packages[] = array(
                                'archive' => $fileName,
+                               'isInstallable' => $isInstallable,
                                'package' => $archive->getPackageInfo('name'),
                                'packageName' => $archive->getLocalizedPackageInfo('packageName'),
                                'packageDescription' => $archive->getLocalizedPackageInfo('packageDescription'),
                                'selected' => 0
                        );
+                       
+                       self::$pendingPackages[] = $archive->getPackageInfo('name');
                }
                
                if (!empty($packages)) {
index a29fd91e39943b16ebd54a483958317341131797..4ec760b1600998efece5f1884790da2ea82af12b 100644 (file)
                <item name="wcf.acp.package.install.error.excludingPackages"><![CDATA[Die folgenden bereits installierten Pakete schließen eine Installation dieses Pakets aus:]]></item>
                <item name="wcf.acp.package.install.error.excludingPackages.excludingPackage"><![CDATA[„{$excludingPackage}“ ({$excludingPackage->package}){if $excludingPackage->excludedPackageVersion} (ausgeschlossene Version: {$excludingPackage->excludedPackageVersion}){/if}]]></item>
                <item name="wcf.acp.package.install.error.missingRequirements"><![CDATA[Die Abhängigkeiten dieses Paketes konnten nicht aufgelöst werden.]]></item>
+               <item name="wcf.acp.package.install.optionalPackage.missingRequirements"><![CDATA[Installation nicht möglich, nicht alle benötigten Pakete sind installiert.]]></item>
                <item name="wcf.acp.package.install.step.prepare"><![CDATA[Installation wird vorbereitet …]]></item>
                <item name="wcf.acp.package.install.title"><![CDATA[Paket-Installation]]></item>
                <item name="wcf.acp.package.installation.requiredVersion"><![CDATA[Benötigte Version]]></item>
index 1e30c2e3c0a22d885bd4abe1e5b76bb665a59eeb..0928ac829b57f528ddecacd1907df019b363cf44 100644 (file)
@@ -877,6 +877,7 @@ Examples for medium ID detection:
                <item name="wcf.acp.package.install.error.excludingPackages"><![CDATA[The following, already installed packages prohibit installing this package:]]></item>
                <item name="wcf.acp.package.install.error.excludingPackages.excludingPackage"><![CDATA[“{$excludingPackage}” ({$excludingPackage->package}){if $excludingPackage->excludedPackageVersion} (excluded version: {$excludingPackage->excludedPackageVersion}){/if}]]></item>
                <item name="wcf.acp.package.install.error.missingRequirements"><![CDATA[Unable to resolve requirements of this package.]]></item>
+               <item name="wcf.acp.package.install.optionalPackage.missingRequirements"><![CDATA[Unable to install, some or all required packages are not installed.]]></item>
                <item name="wcf.acp.package.install.step.prepare"><![CDATA[Preparing Installation …]]></item>
                <item name="wcf.acp.package.install.title"><![CDATA[Installation]]></item>
                <item name="wcf.acp.package.installation.requiredVersion"><![CDATA[Required Version]]></item>