/** * Create a register with all the module headers from all the existing modules. * * Used to correctly load all modules * @param bool $cache true if loading from cache * @param string $cachingMethod the driver used in the caching library * @param int $cachingTime The time the registers are cached */ public static function buildRegister($cache = false, $cachingMethod = 'file', $cachingTime = 300) { // First check if the caching engine can be used if ($cache) { // Retrieve the cache if possible $cache = Factory::getInstance()->libraries->getDriver('cache'); $cacheData = $cache->{$cachingMethod}->get('moduleRegisters'); if (!is_bool($cacheData)) { // Separate the data $moduleRegister = $cacheData['moduleRegister']; $eventRegister = $cacheData['eventRegister']; $routeRegister = $cacheData['routeRegister']; $advertiseRegister = $cacheData['advertiseRegister']; // And register it all Logger::newLevel("Loadig Module Headers from Cache"); self::$register = $moduleRegister; Events::$register = $eventRegister; self::$advertiseRegister = $advertiseRegister; self::$module_routes = $routeRegister; foreach ($routeRegister as $route => $name) { Factory::getInstance()->router->addRoute($route, array('callable' => array('\\FuzeWorks\\Modules', 'moduleCallable')), true); } Logger::stopLevel(); return true; } } Logger::newLevel('Loading Module Headers', 'Core'); // Get all the module directories $dir = Core::$appDir . DS . 'Modules/'; $mod_dirs = array(); $mod_dirs = array_values(array_diff(scandir($dir), array('..', '.'))); // Build the module and event register $register = array(); $event_register = array(); // Cycle through all module directories for ($i = 0; $i < count($mod_dirs); ++$i) { $mod_dir = $dir . $mod_dirs[$i] . '/'; // If a moduleInfo.php exists, load it if (file_exists($mod_dir . '/moduleInfo.php')) { // Load the configuration file $cfg = (object) (include $mod_dir . '/moduleInfo.php'); // Set enabled for now $enabled = true; // Define the module name $name = ''; $name .= !empty($cfg->author) ? strtolower($cfg->author) . '/' : ''; $name .= strtolower($cfg->module_name); // Get the module directory $cfg->directory = $mod_dir; // Check whether the module is disabled if (isset($cfg->enabled)) { if (!$cfg->enabled) { // If disabled, set the variable $enabled = false; // If disabled, a holder will be placed so it might be enabled in the future $mock = new StdClass(); $mock->module_name = $cfg->module_name; $mock->directory = $cfg->directory; $mock->meta = $cfg; $mock->aliases = $cfg->aliases; // Important, change the configuration to the mock, so we can duplicate it afterwards $cfg = $mock; } } // Copy all the data into the register and enable $register[$name] = (array) $cfg; // Log the name for enabled and disabled if (!$enabled) { Logger::newLevel("[OFF] '" . $name . "'"); } else { Logger::newLevel("[ON] '" . $name . "'"); } // And possibly some aliases if (isset($cfg->aliases)) { foreach ($cfg->aliases as $alias) { $register[$alias] = (array) $cfg; unset($register[$alias]['events']); Logger::log(" '" . $alias . "' (alias of '" . $name . "')"); } } // If not enabled, log it, wrap it and off to the next one if (!$enabled) { Logger::stopLevel(); continue; } // Otherwise continue and add routing paths if (isset($cfg->routes)) { // Get routes and add them foreach ($cfg->routes as $route) { // Create the route and callable and parse them $callable = array('\\FuzeWorks\\Modules', 'moduleCallable'); Factory::getInstance()->router->addRoute($route, array('callable' => $callable), true); self::$module_routes[$route] = $name; } } // And for the events if (isset($cfg->events)) { // Get the events and add them foreach ($cfg->events as $event) { // First check if the event already exists, if so, append it if (isset($event_register[$event])) { $event_register[$event][] = $name; } else { $event_register[$event] = array($name); } // Log the event Logger::Log('Event added: \'' . $event . '\''); } } // And check for an advertisement tag if (isset($cfg->advertise)) { // Cycle through advertisements foreach ($cfg->advertise as $advertiseName => $advertiseData) { // Log advertisement Logger::log('Advertisement added: \'' . $advertiseName . '\''); // Add to advertiseRegister self::$advertiseRegister[$advertiseName][$name] = $advertiseData; } } Logger::stopLevel(); } else { // If no details are specified, create a basic mock module $name = $mod_dirs[$i]; // Build a default mock module config $mock = new stdClass(); $mock->module_class = ucfirst($name); $mock->module_file = 'class.' . strtolower($name) . '.php'; $mock->module_name = $name; $mock->dependencies = array(); $mock->versions = array(); $mock->directory = $mod_dir; // Apply it $register[$name] = (array) $mock; Logger::newLevel("[ON] '" . $name . "'"); Logger::stopLevel(); } } if ($cache) { Logger::log("Saving registry to cache"); $cacheData = array('moduleRegister' => $register, 'eventRegister' => $event_register, 'routeRegister' => self::$module_routes, 'advertiseRegister' => self::$advertiseRegister); $cache->{$cachingMethod}->save('moduleRegisters', $cacheData, $cachingTime); } // And apply the registers to their dedicate location self::$register = $register; Events::$register = $event_register; Logger::stopLevel(); }