diff --git a/src/Classes/Module.php b/src/Classes/Module.php index 2ea81aa1..90690964 100644 --- a/src/Classes/Module.php +++ b/src/Classes/Module.php @@ -23,6 +23,8 @@ use RobinTheHood\ModifiedModuleLoaderClient\Loader\ModuleLoader; use RobinTheHood\ModifiedModuleLoaderClient\Loader\LocalModuleLoader; use RobinTheHood\ModifiedModuleLoaderClient\Helpers\FileHelper; +use RobinTheHood\ModifiedModuleLoaderClient\Semver\Comparator; +use RobinTheHood\ModifiedModuleLoaderClient\Semver\Parser; class Module extends ModuleInfo { @@ -438,12 +440,26 @@ public function isLoaded(): bool return false; } + + public function isCompatible(): bool + { + if (!$this->isCompatibleWithModified()) { + return false; + } + + if (!$this->isCompatibleWithPhp()) { + return false; + } + + return true; + } + /** * Checks whether this module is compatible with the installed version of modified. * * @return bool Returns true if the module is compatible, otherwise false. */ - public function isCompatible(): bool + public function isCompatibleWithModified(): bool { $installedVersion = ShopInfo::getModifiedVersion(); $versions = $this->getModifiedCompatibility(); @@ -457,6 +473,19 @@ public function isCompatible(): bool return false; } + public function isCompatibleWithPhp(): bool + { + $php = $this->getPhp(); + $phpVersionContraint = $php['version'] ?? ''; + if (!$phpVersionContraint) { + return true; + } + + $phpVersionInstalled = phpversion(); + $comparator = new Comparator(new Parser()); + return $comparator->satisfiesOr($phpVersionInstalled, $phpVersionContraint); + } + public function getTemplateFiles($file): array { $files = []; diff --git a/src/Classes/ModuleConverter.php b/src/Classes/ModuleConverter.php index 504e2289..8c60941f 100644 --- a/src/Classes/ModuleConverter.php +++ b/src/Classes/ModuleConverter.php @@ -37,7 +37,8 @@ public static function convertToArray(Module $module): array 'visibility' => $module->getVisibility(), 'price' => $module->getPrice(), 'autoload' => $module->getAutoload(), - 'tags' => $module->getTags() + 'tags' => $module->getTags(), + 'php' => $module->getPhp() ]; $moduleArray = [ diff --git a/src/Classes/ModuleFactory.php b/src/Classes/ModuleFactory.php index cc749e48..7b89e4b0 100644 --- a/src/Classes/ModuleFactory.php +++ b/src/Classes/ModuleFactory.php @@ -84,6 +84,7 @@ public static function createFromArray(array $array): Module $module->setPrice($array['price'] ?? ''); $module->setAutoload($autoload); $module->setTags($array['tags'] ?? ''); + $module->setPhp($array['php'] ?? []); // Module $module->setLocalRootPath($array['localRootPath'] ?? ''); diff --git a/src/Classes/ModuleInfo.php b/src/Classes/ModuleInfo.php index 8ba796fa..339157f3 100644 --- a/src/Classes/ModuleInfo.php +++ b/src/Classes/ModuleInfo.php @@ -165,6 +165,18 @@ class ModuleInfo */ protected $tags; + /** + * Mit welchen Version von PHP ist das Modul kompatible. + * + * Beispiel: [ + * 'version' => '^7.4 || ^8.0' + * ] + * + * @var array + */ + protected $php; + + public function getName(): string { return $this->name; @@ -350,4 +362,14 @@ public function setTags(string $value): void { $this->tags = $value; } + + public function getPhp(): array + { + return $this->php; + } + + public function setPhp(array $value): void + { + $this->php = $value; + } } diff --git a/src/Classes/Semver/Comparator.php b/src/Classes/Semver/Comparator.php index 6cb35348..a56c467d 100644 --- a/src/Classes/Semver/Comparator.php +++ b/src/Classes/Semver/Comparator.php @@ -186,6 +186,23 @@ public function satisfies(string $versionString1, string $constrain): bool } } + /** + * Can satisfy multiple constraints with OR / || + * + * Example: ^7.4 || ^8.0 + */ + public function satisfiesOr(string $versionString1, string $constraintOrExpression): bool + { + $constraints = explode('||', $constraintOrExpression); + foreach ($constraints as $constraint) { + $constraint = trim($constraint); + if ($this->satisfies($versionString1, $constraint)) { + return true; + } + } + return false; + } + public function sort(array $versionStrings): array { usort($versionStrings, [$this, 'compareAsc']); diff --git a/src/Classes/ViewModels/ModuleViewModel.php b/src/Classes/ViewModels/ModuleViewModel.php index 8ea15ca3..407a288b 100644 --- a/src/Classes/ViewModels/ModuleViewModel.php +++ b/src/Classes/ViewModels/ModuleViewModel.php @@ -15,6 +15,7 @@ use RobinTheHood\ModifiedModuleLoaderClient\Module; use RobinTheHood\ModifiedModuleLoaderClient\ModuleStatus; +use RobinTheHood\ModifiedModuleLoaderClient\ShopInfo; class ModuleViewModel { @@ -187,4 +188,24 @@ private function getUrl(string $action, string $ref): string '&version=' . $this->module->getVersion() . '&ref=' . $ref; } + + /** + * @return string[] + */ + public function getCompatibleStrings(): array + { + $array = []; + + if (!$this->module->isCompatibleWithModified()) { + $version = ShopInfo::getModifiedVersion(); + $array[] = "Dieses Modul wurde noch nicht mit deiner Version von modified getestet. Du hast modifed Version $version installiert."; + } + + if (!$this->module->isCompatibleWithPhp()) { + $version = phpversion(); + $array[] = "Dieses Modul wurde noch nicht mit deiner PHP Version getestet. Du hast PHP Version $version installiert."; + } + + return $array; + } } diff --git a/src/Templates/ModuleInfo.tmpl.php b/src/Templates/ModuleInfo.tmpl.php index fa3c827d..5646af7f 100644 --- a/src/Templates/ModuleInfo.tmpl.php +++ b/src/Templates/ModuleInfo.tmpl.php @@ -78,11 +78,12 @@ isCompatible()) { ?> -