diff --git a/Account/Account.php b/Account/Account.php index 8825d0b6c..44579fb7d 100644 --- a/Account/Account.php +++ b/Account/Account.php @@ -329,12 +329,12 @@ class Account implements ArrayableInterface, \JsonSerializable $app = $app !== null ? \strtolower($app) : $app; foreach ($this->permissions as $p) { - if (($p->getUnit() === $unit || $p->getUnit() === null || $unit === null) - && ($p->getApp() === $app || $p->getApp() === null || $app === null) - && ($p->getModule() === $module || $p->getModule() === null || $module === null) - && ($p->getType() === $type || $p->getType() === null || $type === null) - && ($p->getElement() === $element || $p->getElement() === null || $element === null) - && ($p->getComponent() === $component || $p->getComponent() === null || $component === null) + if (($unit === null || $p->getUnit() === $unit || $p->getUnit() === null) + && ($app === null || $p->getApp() === $app || $p->getApp() === null) + && ($module === null || $p->getModule() === $module || $p->getModule() === null) + && ($type === null || $p->getType() === $type || $p->getType() === null) + && ($element === null || $p->getElement() === $element || $p->getElement() === null) + && ($component === null || $p->getComponent() === $component || $p->getComponent() === null) && ($p->getPermission() | $permission) === $p->getPermission() ) { return true; diff --git a/DataStorage/Database/GrammarAbstract.php b/DataStorage/Database/GrammarAbstract.php index 7f03873b9..4f6e6845c 100644 --- a/DataStorage/Database/GrammarAbstract.php +++ b/DataStorage/Database/GrammarAbstract.php @@ -276,23 +276,18 @@ abstract class GrammarAbstract if (\strrpos($system, $keyword, -\strlen($system)) !== false) { $prefix = ''; $identifier = ''; + + break; } } - if (\count($split = \explode('.', $system)) > 1) { - $fullSystem = ''; + $split = \explode('.', $system); + $fullSystem = ''; - foreach ($split as $key => $system) { - if ($key === 0) { - $fullSystem .= $this->compileSystem($prefix . $system); - } else { - $fullSystem .= '.' . ($system === '*' ? '*' : $this->compileSystem($system)); - } - } - - return $fullSystem; + foreach ($split as $key => $system) { + $fullSystem .= '.' . $identifier . ($key === 0 ? $prefix : '') . $system . $identifier; } - return $identifier . $prefix . $system . $identifier; + return \ltrim($fullSystem, '.'); } } diff --git a/Localization/Localization.php b/Localization/Localization.php index 7200c0043..8a4d9128d 100644 --- a/Localization/Localization.php +++ b/Localization/Localization.php @@ -15,7 +15,6 @@ declare(strict_types=1); namespace phpOMS\Localization; use phpOMS\Stdlib\Base\Exception\InvalidEnumValue; -use phpOMS\System\File\Local\Directory; use phpOMS\Utils\Converter\AngleType; use phpOMS\Utils\Converter\TemperatureType; @@ -140,15 +139,8 @@ final class Localization /** * Load localization from language code * - * Files need to return a php array of the following structure: - * return [ - * '{MODULE_NAME}' => [ - * '{INTERNAL_STRING_REPRESENTATION}' => '{OUTPUT_STRING}', - * // more key/value pairs here - * ], - * ]; - * - * @param string $langCode Language code + * @param string $langCode Language code + * @param string $countryCode Country code * * @return void * @@ -156,28 +148,27 @@ final class Localization * * @since 1.0.0 */ - public function loadFromLanguage(string $langCode) : void + public function loadFromLanguage(string $langCode, string $countryCode = '*') : void { - $langCode = \strtolower($langCode); + $langCode = \strtolower($langCode); + $countryCode = \strtoupper($countryCode); if (!ISO639x1Enum::isValidValue($langCode)) { throw new InvalidEnumValue($langCode); } - $files = Directory::list(__DIR__ . '/../Localization/Defaults/Definitions'); + $files = \glob(__DIR__ . '/../Localization/Defaults/Definitions/' . $langCode . '_' . $countryCode); foreach ($files as $file) { - if (\stripos($file, $langCode) === 0) { - $fileContent = \file_get_contents(__DIR__ . '/../Localization/Defaults/Definitions/' . $file); + $fileContent = \file_get_contents(__DIR__ . '/../Localization/Defaults/Definitions/' . $file); - if ($fileContent === false) { - return; - } - - $this->importLocale(\json_decode($fileContent, true)); - - return; + if ($fileContent === false) { + break; } + + $this->importLocale(\json_decode($fileContent, true)); + + return; } $fileContent = \file_get_contents(__DIR__ . '/../Localization/Defaults/Definitions/en_US.json'); diff --git a/Views/View.php b/Views/View.php index c0391664c..8c6bce780 100644 --- a/Views/View.php +++ b/Views/View.php @@ -71,6 +71,22 @@ class View extends ViewAbstract */ protected $response = null; + /** + * Theme name. + * + * @var null|string + * @since 1.0.0 + */ + protected $theme = null; + + /** + * Module name. + * + * @var null|string + * @since 1.0.0 + */ + protected $module = null; + /** * Constructor. * @@ -167,48 +183,80 @@ class View extends ViewAbstract * * @return string * - * @throws InvalidModuleException Throws this exception if no data for the defined module could be found. - * @throws InvalidThemeException Throws this exception if no data for the defined theme could be found. - * * @since 1.0.0 */ public function getText($translation, string $module = null, string $theme = null) : string { - if ($module === null) { - $match = '/Modules/'; - - if (($start = \strripos($this->template, $match)) === false) { - throw new InvalidModuleException($module ?? ''); - } - - $start = $start + \strlen($match); - $end = \strpos($this->template, '/', $start); - $module = \substr($this->template, $start, $end - $start); + if ($module === null && $this->module === null) { + $this->setModuleDynamically(); } - if ($module === false) { - $module = '0'; + if ($theme === null && $this->theme === null) { + $this->setThemeDynamically(); } - if ($theme === null) { - $match = '/Theme/'; - - if (($start = \strripos($this->template, $match)) === false) { - throw new InvalidThemeException($theme ?? ''); - } - - $start = $start + \strlen($match); - $end = \strpos($this->template, '/', $start); - $theme = \substr($this->template, $start, $end - $start); - } - - if ($theme === false) { - $theme = '0'; - } + $module = $module ?? $this->module; + $theme = $theme ?? $this->theme; return $this->app->l11nManager->getText($this->l11n->getLanguage(), $module, $theme, $translation); } + /** + * Set the view module dynamically. + * + * Sets the view module based on the template path + * + * @return void + * + * @throws InvalidModuleException Throws this exception if no data for the defined module could be found. + * + * @since 1.0.0 + */ + private function setModuleDynamically() : void + { + $match = '/Modules/'; + + if (($start = \strripos($this->template, $match)) === false) { + throw new InvalidModuleException(''); + } + + $start = $start + \strlen($match); + $end = \strpos($this->template, '/', $start); + $this->module = \substr($this->template, $start, $end - $start); + + if ($this->module === false) { + $this->module = '0'; + } + } + + /** + * Set the view theme dynamically. + * + * Sets the view theme based on the template path + * + * @return void + * + * @throws InvalidThemeException Throws this exception if no data for the defined theme could be found. + * + * @since 1.0.0 + */ + private function setThemeDynamically() : void + { + $match = '/Theme/'; + + if (($start = \strripos($this->template, $match)) === false) { + throw new InvalidThemeException(''); + } + + $start = $start + \strlen($match); + $end = \strpos($this->template, '/', $start); + $this->theme = \substr($this->template, $start, $end - $start); + + if ($this->theme === false) { + $this->theme = '0'; + } + } + /** * Get translation. * @@ -222,7 +270,7 @@ class View extends ViewAbstract */ public function getHtml($translation, string $module = null, string $theme = null) : string { - return htmlspecialchars($this->getText($translation, $module, $theme)); + return \htmlspecialchars($this->getText($translation, $module, $theme)); } /**