Esempio n. 1
0
 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;
 }