ModuleManager.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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. die ("out");
  49. $i->active = false;
  50. $i->save();
  51. }
  52. }
  53. $context->hookManager->loadHooks(\Entity\ModuleHook::getModules($ids));
  54. }
  55. /**
  56. * @param string $path path to module's main file
  57. * @param \Entity\Module $module module's database object to load
  58. * /core/models/Module.php
  59. * @return TRUE on success
  60. * Will try to load module located at $path.
  61. * This function will include the main.php file located in the module's directory
  62. * The file MUST return an AModule object to be considered as successfull
  63. * /core/tools/AModule.php
  64. **/
  65. private function loadModule($path, $module)
  66. {
  67. $mod = include_once($path);
  68. if (!$mod || !($mod instanceof \Tools\AModule))
  69. return false;
  70. $mod->setContext($this->context);
  71. $mod->setEntity($module);
  72. $this->modules[] = $mod;
  73. return true;
  74. }
  75. /*
  76. * TODO revoir tout
  77. * @return array(AModule)
  78. * Will load every modules, and return them.
  79. **/
  80. public function listAvailableModules()
  81. {
  82. $modulesRoot = $context->router->modulesPath;
  83. $result = array();
  84. $modules = scandir($modulesRoot, SCANDIR_SORT_NONE);
  85. foreach ($modules as $i)
  86. {
  87. $path = $modulesRoot.$i;
  88. if ($i == '.' || $i == '..' || !is_dir($path))
  89. continue;
  90. $this->loadModule($path);
  91. }
  92. }
  93. /**
  94. * @param int $id
  95. * @return AModule on success, FALSE on failure (no such ID / module not loaded)
  96. * Get the module identified with id ID
  97. **/
  98. public function getModuleFromId($id)
  99. {
  100. foreach ($this->modules as $i)
  101. {
  102. if ($i->entity->id == $id)
  103. return $i;
  104. }
  105. return FALSE;
  106. }
  107. /**
  108. * Getter
  109. **/
  110. public function __get($key)
  111. {
  112. switch ($key)
  113. {
  114. case "modules":
  115. return $this->modules; break;
  116. }
  117. if (substr($key, 0, 4) == "_id_")
  118. return $this->getModuleFromId((int) substr($key, 4));
  119. throw new \Exception("Cannot access attribute {$key}");
  120. }
  121. }