/** * 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...'); } }