'application/Espo/Resources/module.json', 'modulePath' => 'application/Espo/Modules/{*}/Resources/module.json', 'customPath' => 'custom/Espo/Custom/Resources/module.json', ]; private $fileManager; private $dataCache; public function __construct( FileManager $fileManager, ?DataCache $dataCache = null, bool $useCache = false ) { $this->fileManager = $fileManager; $this->dataCache = $dataCache; $this->unifier = new FileUnifier($this->fileManager); $this->useCache = $useCache; } /** * Get module parameters. * * @return mixed */ public function get($key = '', $returns = null) { if (!isset($this->data)) { $this->init(); } if (empty($key)) { return $this->data; } return Util::getValueByKey($this->data, $key, $returns); } /** * Get parameters of all modules. */ public function getAll(): array { return $this->get(); } protected function init(): void { if ($this->useCache && $this->dataCache->has($this->cacheKey)) { $this->data = $this->dataCache->get($this->cacheKey); return; } $this->data = $this->unifier->unify($this->paths, true); if ($this->useCache) { $this->dataCache->store($this->cacheKey, $this->data); } } /** * Get an ordered list of modules. */ public function getOrderedList(): array { $modules = $this->fileManager->getFileList($this->pathToModules, false, '', false); $modulesToSort = []; if (!is_array($modules)) { return []; } foreach ($modules as $moduleName) { if (empty($moduleName)) { continue; } if (isset($modulesToSort[$moduleName])) { continue; } $modulesToSort[$moduleName] = $this->get($moduleName . '.order', self::DEFAULT_ORDER); } array_multisort( array_values($modulesToSort), SORT_ASC, array_keys($modulesToSort), SORT_ASC, $modulesToSort ); return array_keys($modulesToSort); } }