/** * Check module validity * * @param UploadedFile $file * @param ExecutionContextInterface $context */ public function checkModuleValidity(UploadedFile $file, ExecutionContextInterface $context) { $modulePath = $this->unzipModule($file); if ($modulePath !== false) { try { // get the first directory $moduleFiles = $this->getDirContents($modulePath); if (count($moduleFiles['directories']) !== 1) { throw new Exception(Translator::getInstance()->trans("Your zip must contain 1 root directory which is the root folder directory of your module")); } $moduleDirectory = $moduleFiles['directories'][0]; $this->modulePath = sprintf('%s/%s', $modulePath, $moduleDirectory); $moduleValidator = new ModuleValidator($this->modulePath); $moduleValidator->validate(); $this->moduleDefinition = $moduleValidator->getModuleDefinition(); } catch (Exception $ex) { $context->addViolation(Translator::getInstance()->trans("The module is not valid : %message", ['%message' => $ex->getMessage()])); } } }
/** * @dataProvider validatorProvider */ public function testValidator($path, $exceptionExpected, $exceptionMessage) { $modulePath = __DIR__ . "/" . $path; /** @var \Exception $exception */ $exception = null; try { $moduleValidator = new ModuleValidator($modulePath, $this->getStubTranslator("opiopi")); $moduleValidator->validate(true); } catch (\Exception $ex) { $exception = $ex; } if (null !== $exceptionExpected) { $this->assertInstanceOf($exceptionExpected, $exception, $path . " module should return exception " . $exceptionExpected); if (null !== $exceptionMessage) { $this->assertNotEmpty($exception->getMessage(), $path . " module exception should not be empty"); $this->assertTrue(false !== strpos($exception->getMessage(), $exceptionMessage), $path . " module exception should contain : " . $exceptionMessage); } } else { $this->assertNull($exception, $path . " module should not return exception [" . $exception->getMessage() . ']'); } }
/** * Get modules having current module in dependence and deactivate it if needed * * @param ModuleToggleActivationEvent $event * */ public function recursiveDeactivation(ModuleToggleActivationEvent $event) { if (null !== ($module = ModuleQuery::create()->findPk($event->getModuleId()))) { $moduleValidator = new ModuleValidator($module->getAbsoluteBaseDir()); $dependencies = $moduleValidator->getModulesDependOf(true); foreach ($dependencies as $defMod) { $submodule = ModuleQuery::create()->findOneByCode($defMod["code"]); if ($submodule && $submodule->getActivate() == BaseModule::IS_ACTIVATED) { $subevent = new ModuleToggleActivationEvent($submodule->getId()); $subevent->setRecursive(true); $event->getDispatcher()->dispatch(TheliaEvents::MODULE_TOGGLE_ACTIVATION, $subevent); } } } }
/** * Get an array of modules that depend of the current module * * @param bool|null $active if true only search in activated module, false only deactivated and null on all modules * @return array array of array with `code` which is the module code that depends of this current module and * `version` which is the required version of current module */ public function getModulesDependOf($active = true) { $code = $this->getModuleDefinition()->getCode(); $query = ModuleQuery::create(); $dependantModules = []; if (true === $active) { $query->findByActivate(1); } elseif (false === $active) { $query->findByActivate(0); } $modules = $query->find(); /** @var Module $module */ foreach ($modules as $module) { try { $validator = new ModuleValidator($module->getAbsoluteBaseDir()); $definition = $validator->getModuleDefinition(); $dependencies = $definition->getDependencies(); if (count($dependencies) > 0) { foreach ($dependencies as $dependency) { if ($dependency[0] == $code) { $dependantModules[] = ['code' => $definition->getCode(), 'version' => $dependency[1]]; break; } } } } catch (\Exception $ex) { } } return $dependantModules; }
/** * Check if module can be deactivated safely because other modules * could have dependencies to this module * * @param \Thelia\Model\Module $module * @return bool true if the module can be deactivated, otherwise false */ private function checkDeactivation($module) { $moduleValidator = new ModuleValidator($module->getAbsoluteBaseDir()); $modules = $moduleValidator->getModulesDependOf(); if (count($modules) > 0) { $moduleList = implode(', ', array_column($modules, 'code')); $message = count($modules) == 1 ? Translator::getInstance()->trans('%s has dependency to module %s. You have to deactivate this module before.') : Translator::getInstance()->trans('%s have dependencies to module %s. You have to deactivate these modules before.'); throw new ModuleException(sprintf($message, $moduleList, $moduleValidator->getModuleDefinition()->getCode())); } return true; }