Esempio n. 1
0
 /**
  * Upload package action.
  *
  * @return void
  *
  * @Route("/upload", methods={"GET", "POST"}, name="admin-packages-upload")
  */
 public function uploadAction()
 {
     $this->view->form = $form = new UploadForm();
     if (!$this->request->isPost() || !$form->isValid()) {
         return;
     }
     $packageManager = new Manager(Package::find());
     $packageManager->clearTempDirectory();
     $packageFile = $this->request->getUploadedFiles();
     if (count($packageFile) == 1 && $packageFile[0]->getSize() != 0) {
         $filename = $packageManager->getTempDirectory() . 'uploaded.zip';
         $packageFile[0]->moveTo($filename);
         try {
             // Install package - check dep, copy files, get manifest, etc.
             $manifest = $packageManager->installPackage($filename);
             // Create package database object.
             if (!$manifest->isUpdate) {
                 $package = new Package();
                 $package->assign($manifest->toArray());
                 $package->save();
                 $this->_enablePackageConfig($package);
                 $this->_updateMetadata();
                 // install package dependencies
                 if ($manifest->get('dependencies')) {
                     $dependencies = $manifest->get('dependencies');
                     foreach ($dependencies as $dependency) {
                         $needPackage = $this->_getPackage($dependency['type'], $dependency['name']);
                         if ($needPackage) {
                             $packageDependency = new PackageDependency();
                             $packageDependency->package_id = $package->id;
                             $packageDependency->dependency_id = $needPackage->id;
                             $packageDependency->save();
                         }
                     }
                 }
             }
             if ($manifest->type == Manager::PACKAGE_TYPE_MODULE) {
                 // Run module install script.
                 $newPackageVersion = $packageManager->runInstallScript($manifest);
                 $this->_clearCache();
                 // Install translations if possible.
                 if (!empty($manifest->i18n)) {
                     foreach ($manifest->i18n as $languageData) {
                         Language::parseImportData($this->getDI(), $languageData->toArray());
                     }
                 }
                 // Register module in system to perform database update.
                 $modules = $this->getDI()->get('registry')->modules;
                 $loader = $this->getDI()->get('loader');
                 $modules[] = $manifest->name;
                 $moduleName = ucfirst($manifest->name);
                 // Register namespaces.
                 $loader->registerNamespaces([$moduleName => $this->getDI()->get('registry')->directories->modules . $moduleName], true);
                 $loader->register();
                 // Register module in app
                 $this->getDI()->get('app')->registerModules([$manifest->name => $moduleName . '\\Bootstrap']);
                 $this->getDI()->get('registry')->modules = $modules;
                 // Update database.
                 $schema = new Schema($this->getDI());
                 $schema->updateDatabase();
             }
             if ($manifest->isUpdate) {
                 $this->flash->success('Package updated to version ' . $newPackageVersion . '!');
             } else {
                 $this->flash->success('Package installed!');
             }
         } catch (Exception $e) {
             $this->flash->error($e->getMessage());
         }
     } else {
         $this->flash->notice('Please, select zip file...');
     }
 }