ModuleManager.php 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. * @param \Tool\Context $context
  24. * Load all active modules from database.
  25. * Enable hooks for these modules
  26. * Disable them if the module cannot be loaded
  27. **/
  28. public function __construct($context)
  29. {
  30. $this->context = $context;
  31. $modulesRoot = $context->router->modulesPath;
  32. $modules = \Entity\Module::getActivated();
  33. $ids = array();
  34. foreach ($modules as $i)
  35. {
  36. $modulePath = "{$modulesRoot}{$i->directory}/main.php";
  37. if (file_exists($modulePath) && $this->loadModule($modulePath, $i))
  38. {
  39. $ids[] = $i->id;
  40. }
  41. else
  42. {
  43. $i->active = false;
  44. $i->save();
  45. }
  46. }
  47. \Tools\Hooks::loadHooks(\Entity\ModuleHook::getModules($ids));
  48. }
  49. /**
  50. * @param string $path path to module's main file
  51. * @param \Entity\Module $module module's database object to load
  52. * /core/models/Module.php
  53. * @return TRUE on success
  54. * Will try to load module located at $path.
  55. * This function will include the main.php file located in the module's directory
  56. * The file MUST return an AModule object to be considered as successfull
  57. * /core/tools/AModule.php
  58. **/
  59. private function loadModule($path, $module)
  60. {
  61. $this->modules[] = $module;
  62. return true;
  63. }
  64. /*
  65. * TODO revoir tout
  66. * @return array(AModule)
  67. * Will load every modules, and return them.
  68. **/
  69. public function listAvailableModules()
  70. {
  71. $modulesRoot = $context->router->modulesPath;
  72. $result = array();
  73. $modules = scandir($modulesRoot, SCANDIR_SORT_NONE);
  74. foreach ($modules as $i)
  75. {
  76. $path = $modulesRoot.$i;
  77. if ($i == '.' || $i == '..' || !is_dir($path))
  78. continue;
  79. $this->loadModule($path);
  80. }
  81. }
  82. public function __get($key)
  83. {
  84. switch ($key)
  85. {
  86. case "modules":
  87. return $this->modules; break;
  88. }
  89. throw new \Exception("Cannot access attribute {$key}");
  90. }
  91. }