public function install_package($package) { $tp = new TaskPermission(); if ($tp->canInstallPackages()) { $p = Package::getClass($package); if ($p instanceof BrokenPackage) { $this->error->add($p->getInstallErrorMessage()); } elseif (is_object($p)) { $loader = new ClassLoader(); $loader->registerPackageCustomAutoloaders($p); if (!$p->showInstallOptionsScreen() || Loader::helper('validation/token')->validate('install_options_selected')) { $tests = $p->testForInstall(); if (is_object($tests)) { $this->error->add($tests); } else { $r = Package::install($p, $this->post()); if ($r instanceof ErrorList) { $this->error->add($r); if ($p->showInstallOptionsScreen()) { $this->set('showInstallOptionsScreen', true); $this->set('pkg', $p); } } else { $this->redirect('/dashboard/extend/install', 'package_installed', $r->getPackageID()); } } } else { $this->set('showInstallOptionsScreen', true); $this->set('pkg', $p); } } else { $this->error->add(t('Package controller file not found.')); } } else { $this->error->add(t('You do not have permission to install add-ons.')); } }
protected function execute(InputInterface $input, OutputInterface $output) { $rc = 0; try { $pkgHandle = $input->getArgument('package'); $packageOptions = array(); foreach ($input->getArgument('package-options') as $keyValuePair) { list($key, $value) = explode('=', $keyValuePair, 2); $key = trim($key); if (substr($key, -2) === '[]') { $isArray = true; $key = rtrim(substr($key, 0, -2)); } else { $isArray = false; } if ($key === '' || !isset($value)) { throw new Exception(sprintf("Unable to parse the package option '%s': it must be in the form of key=value", $keyValuePair)); } if (isset($packageOptions[$key])) { if (!($isArray && is_array($packageOptions[$key]))) { throw new Exception(sprintf("Duplicated package option '%s'", $key)); } $packageOptions[$key][] = $value; } else { $packageOptions[$key] = $isArray ? (array) $value : $value; } } $output->write("Looking for package '{$pkgHandle}'... "); foreach (Package::getInstalledList() as $installed) { if ($installed->getPackageHandle() === $pkgHandle) { throw new Exception(sprintf("The package '%s' (%s) is already installed", $pkgHandle, $installed->getPackageName())); } } $pkg = null; foreach (Package::getAvailablePackages() as $available) { if ($available->getPackageHandle() === $pkgHandle) { $pkg = $available; break; } } if ($pkg === null) { throw new Exception(sprintf("No package with handle '%s' was found", $pkgHandle)); } $output->writeln(sprintf('<info>found (%s).</info>', $pkg->getPackageName())); $output->write('Checking preconditions... '); $test = $pkg->testForInstall(); if (is_object($test)) { throw new Exception(implode("\n", $test->getList())); } $output->write('Preconditions good. Installing...'); $r = Package::install($pkg, []); if ($r instanceof ErrorList) { throw new Exception(implode("\n", $r->getList())); } $output->writeln('<info>Package Installed.</info>'); $swapper = new ContentSwapper(); if ($swapper->allowsFullContentSwap($pkg) && $input->getOption('full-content-swap')) { $output->write('Performing full content swap... '); $swapper->swapContent($pkg, array()); if (method_exists($pkg, 'on_after_swap_content')) { $pkg->on_after_swap_content(array()); } $output->writeln('<info>done.</info>'); } } catch (Exception $x) { $output->writeln('<error>' . $x->getMessage() . '</error>'); $rc = 1; } return $rc; }