From a0b7c762963bd26a447fb9ae6a57fa164580a207 Mon Sep 17 00:00:00 2001 From: Alexander Ebert Date: Mon, 19 Aug 2013 23:42:29 +0200 Subject: [PATCH] Fix for non-installable optional packages --- .../MultipleSelectionFormElement.class.php | 33 ++++++++++++++++++- .../PackageInstallationDispatcher.class.php | 8 +++++ .../PackageInstallationNodeBuilder.class.php | 25 ++++++++++++++ wcfsetup/install/lang/de.xml | 1 + wcfsetup/install/lang/en.xml | 1 + 5 files changed, 67 insertions(+), 1 deletion(-) diff --git a/wcfsetup/install/files/lib/system/form/element/MultipleSelectionFormElement.class.php b/wcfsetup/install/files/lib/system/form/element/MultipleSelectionFormElement.class.php index 44b42fe234..c1ca60a5e1 100644 --- a/wcfsetup/install/files/lib/system/form/element/MultipleSelectionFormElement.class.php +++ b/wcfsetup/install/files/lib/system/form/element/MultipleSelectionFormElement.class.php @@ -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 << {$this->getLabel()} + {$this->getDescription()} HTML; } diff --git a/wcfsetup/install/files/lib/system/package/PackageInstallationDispatcher.class.php b/wcfsetup/install/files/lib/system/package/PackageInstallationDispatcher.class.php index 852bd35cf7..e23e3b66cf 100644 --- a/wcfsetup/install/files/lib/system/package/PackageInstallationDispatcher.class.php +++ b/wcfsetup/install/files/lib/system/package/PackageInstallationDispatcher.class.php @@ -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); } diff --git a/wcfsetup/install/files/lib/system/package/PackageInstallationNodeBuilder.class.php b/wcfsetup/install/files/lib/system/package/PackageInstallationNodeBuilder.class.php index fc1e1e84c5..b014459579 100644 --- a/wcfsetup/install/files/lib/system/package/PackageInstallationNodeBuilder.class.php +++ b/wcfsetup/install/files/lib/system/package/PackageInstallationNodeBuilder.class.php @@ -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)) { diff --git a/wcfsetup/install/lang/de.xml b/wcfsetup/install/lang/de.xml index a29fd91e39..4ec760b160 100644 --- a/wcfsetup/install/lang/de.xml +++ b/wcfsetup/install/lang/de.xml @@ -878,6 +878,7 @@ package}){if $excludingPackage->excludedPackageVersion} (ausgeschlossene Version: {$excludingPackage->excludedPackageVersion}){/if}]]> + diff --git a/wcfsetup/install/lang/en.xml b/wcfsetup/install/lang/en.xml index 1e30c2e3c0..0928ac829b 100644 --- a/wcfsetup/install/lang/en.xml +++ b/wcfsetup/install/lang/en.xml @@ -877,6 +877,7 @@ Examples for medium ID detection: package}){if $excludingPackage->excludedPackageVersion} (excluded version: {$excludingPackage->excludedPackageVersion}){/if}]]> + -- 2.20.1