示例#1
0
 /**
  * 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("&nbsp;&nbsp;&nbsp;'" . $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();
 }