/** * Install modules * * @param boolean $isInstaller */ public static function installModules($isInstaller = FALSE) { self::$sqlSetup = new Uni_Core_Setup_Sql(); self::$installedModules = array(); self::$activeModules = self::getActiveModules(); if (!$isInstaller) { $moduleModel = Fox::getModel('core/module'); $collection = $moduleModel->getInstalledModules(); foreach ($collection as $module) { self::$installedModules[] = $module['name']; } } $modulesArr = array_diff(array_keys(self::$activeModules), self::$installedModules); foreach ($modulesArr as $mdl) { self::$initialModules[$mdl] = $mdl; } while (count(self::$initialModules) > 0) { foreach (self::$initialModules as $moduleEle) { break; } $depQueue = array($moduleEle); while (count($depQueue) > 0) { $dependents = self::getDependents($depQueue[count($depQueue) - 1]); $ready = FALSE; if (empty($dependents)) { $ready = TRUE; } else { $depUninstCount = 0; foreach ($dependents as $dependent) { if (!self::isInstalled($dependent)) { $depUninstCount++; if (in_array($dependent, $depQueue)) { throw new Exception('Circular module dependency detected in "' . $dependent . '"'); } else { $depQueue[] = $dependent; break; } } } if ($depUninstCount == 0) { $ready = TRUE; } } if ($ready) { $cModule = array_pop($depQueue); self::installModule($cModule); } } } foreach (self::$activeModules as $moduleName => $moduleArr) { self::runSqlUpgrade($moduleName, $moduleArr['namespace'], $moduleArr['package']); } }