ModuleManager.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <?php
  2. namespace Tools;
  3. /**
  4. * Container all modules.
  5. * Allow module managment
  6. **/
  7. class ModuleManager
  8. {
  9. /**
  10. * @var \Tools\Context $context
  11. * /core/tools/Context.php
  12. * Contains website's informations
  13. **/
  14. private $context;
  15. /**
  16. * @var array(\Tool\AModule) $modules
  17. * /core/tools/AModule.php
  18. * Contains all loaded modules
  19. * Can be accessed read-only via $instance->modules
  20. **/
  21. private $modules = array();
  22. /**
  23. * @var _id_{ID}
  24. * Get the module identified with id ID
  25. * ex: $context->moduleManager->_id_2 will return module with id 2
  26. **/
  27. /**
  28. * @param \Tool\Context $context
  29. * Load all active modules from database.
  30. * Enable hooks for these modules
  31. * Disable them if the module cannot be loaded
  32. **/
  33. public function __construct(&$context)
  34. {
  35. $this->context = $context;
  36. $modulesRoot = $context->router->modulesPath;
  37. $modules = \Entity\Module::getActivated();
  38. $ids = array();
  39. foreach ($modules as $i)
  40. {
  41. $modulePath = "{$modulesRoot}{$i->directory}/main.php";
  42. if (file_exists($modulePath) && $this->loadModule($modulePath, $i))
  43. {
  44. $ids[] = $i->id;
  45. }
  46. else
  47. {
  48. $i->active = false;
  49. $i->save();
  50. }
  51. }
  52. $context->hookManager->loadHooks(\Entity\ModuleHook::getModules($ids));
  53. }
  54. /**
  55. * @param string $path
  56. * @return \Tools\AModule loaded module (or false on error)
  57. **/
  58. private function loadModuleFile($path)
  59. {
  60. $mod = include_once($path);
  61. if (!$mod || !($mod instanceof \Tools\AModule))
  62. return false;
  63. $mod->setContext($this->context);
  64. return $mod;
  65. }
  66. /**
  67. * @param string $path path to module's main file
  68. * @param \Entity\Module $module module's database object to load
  69. * /core/models/Module.php
  70. * @return TRUE on success
  71. * Will try to load module located at $path.
  72. * This function will include the main.php file located in the module's directory
  73. * The file MUST return an AModule object to be considered as successfull
  74. * /core/tools/AModule.php
  75. **/
  76. private function loadModule($path, $module)
  77. {
  78. $mod = $this->loadModuleFile($path);
  79. if ($mod === false)
  80. return false;
  81. $mod->setEntity($module);
  82. $this->modules[] = $mod;
  83. return true;
  84. }
  85. /**
  86. * @param string $modulename
  87. * @return \tools\AModule|false on failure
  88. * Install the module located in {modulePath}/modulename/modulename.php
  89. **/
  90. public function install($modulename)
  91. {
  92. $entity = new \Entity\Module();
  93. $entity->name = $modulename;
  94. $entity->directory = $modulename;
  95. $entity->active = true;
  96. $module = $this->loadModuleFile($this->context->router->modulesPath.$modulename.'/main.php');
  97. if ($module === false)
  98. return false;
  99. $entity->name = $module->getName();
  100. $entity->description = $module->getDescription();
  101. if ($module->install() == false)
  102. return false;
  103. $entity->save();
  104. $module->setEntity($entity);
  105. return $module;
  106. }
  107. /*
  108. * TODO revoir tout
  109. * @return array(AModule)
  110. * Will load every modules, and return them.
  111. **/
  112. public function listAvailableModules()
  113. {
  114. $modulesRoot = $context->router->modulesPath;
  115. $result = array();
  116. $modules = scandir($modulesRoot, SCANDIR_SORT_NONE);
  117. foreach ($modules as $i)
  118. {
  119. $path = $modulesRoot.$i;
  120. if ($i == '.' || $i == '..' || !is_dir($path))
  121. continue;
  122. $this->loadModule($path);
  123. }
  124. }
  125. /**
  126. * @param int $id
  127. * @return AModule on success, FALSE on failure (no such ID / module not loaded)
  128. * Get the module identified with id ID
  129. **/
  130. public function getModuleFromId($id)
  131. {
  132. foreach ($this->modules as $i)
  133. {
  134. if ($i->entity->id == $id)
  135. return $i;
  136. }
  137. return FALSE;
  138. }
  139. /**
  140. * Getter
  141. **/
  142. public function __get($key)
  143. {
  144. switch ($key)
  145. {
  146. case "modules":
  147. return $this->modules; break;
  148. }
  149. if (substr($key, 0, 4) == "_id_")
  150. return $this->getModuleFromId((int) substr($key, 4));
  151. throw new \Exception("Cannot access attribute {$key}");
  152. }
  153. }