]> 4ch.mooo.com Git - test.git/blob - lib/pms.php
modified: data/js/script.js
[test.git] / lib / pms.php
1 <?php\r
2 /**\r
3  * Pixmicat! Module System\r
4  *\r
5  * 增加掛載點供函式掛上並在需要時依序呼叫以動態改變內容或達成各種效果\r
6  * \r
7  * @package PMCLibrary\r
8  * @version $Id: pms.php 608 2008-03-04 12:44:27Z scribe $\r
9  * @date $Date: 2008-03-04 20:44:27 +0800 (星期二, 04 三月 2008) $\r
10  */\r
11 \r
12 class PMS{\r
13         var $ENV;\r
14         var $moduleInstance, $moduleLists;\r
15         var $hookPoints;\r
16         var $loaded;\r
17 \r
18         /* Constructor */\r
19         function PMS($ENV){\r
20                 $this->loaded = false; // 是否載入完成 (模組及函式)\r
21                 $this->ENV = $ENV; // 環境變數\r
22                 $this->hooks = array_flip(array('Head', 'Toplink', 'LinksAboveBar', 'PostInfo', 'PostForm',\r
23                         'ThreadFront', 'ThreadRear', 'ThreadPost', 'ThreadReply',\r
24                         'Foot', 'ModulePage', 'RegistBegin', 'RegistBeforeCommit', 'RegistAfterCommit', 'PostOnDeletion',\r
25                         'AdminList', 'AdminFunction', 'Authenticate', 'ThreadOrder'\r
26                 ));\r
27                 $this->hookPoints = array(); // 掛載點\r
28                 $this->moduleInstance = array(); // 存放各模組實體\r
29                 $this->moduleLists = array(); // 存放各模組類別名稱\r
30         }\r
31 \r
32         // 模組載入相關\r
33         /* 載入模組 */\r
34         function init(){\r
35                 $this->loaded = true;\r
36                 $this->loadModules();\r
37                 return true;\r
38         }\r
39 \r
40         /* 單載入模式 */\r
41         function onlyLoad($specificModule){\r
42                 // 搜尋載入模組列表有沒有,沒有就直接取消程式\r
43                 if(array_search($specificModule, $this->ENV['MODULE.LOADLIST'])===false) return false;\r
44                 $this->loadModules($specificModule);\r
45                 return isset($this->hookPoints['ModulePage']);\r
46         }\r
47 \r
48         /* 載入擴充模組 */\r
49         function loadModules($specificModule=false){\r
50                 $loadlist = $specificModule ? array($specificModule) : $this->ENV['MODULE.LOADLIST'];\r
51                 foreach($loadlist as $f){\r
52                         $mpath = $this->ENV['MODULE.PATH'].$f.'.php';\r
53                         if(is_file($mpath) && array_search($f, $this->moduleLists)===false){\r
54                                 include_once($mpath);\r
55                                 $this->moduleLists[] = $f;\r
56                                 $this->moduleInstance[$f] = new $f();\r
57                         }\r
58                 }\r
59         }\r
60 \r
61         /* 取得載入模組列表 */\r
62         function getLoadedModules(){\r
63                 if(!$this->loaded) $this->init();\r
64                 return $this->moduleLists;\r
65         }\r
66 \r
67         /* 取得模組實體 */\r
68         function getModuleInstance($module){\r
69                 return isset($this->moduleInstance[$module])?$this->moduleInstance[$module]:null;\r
70         }\r
71 \r
72         /* 取得特定模組方法列表 */\r
73         function getModuleMethods($module){\r
74                 if(!$this->loaded) $this->init();\r
75                 return array_search($module, $this->moduleLists)!==false ? get_class_methods($module) : array();\r
76         }\r
77 \r
78         // 提供給模組的取用資訊\r
79         /* 取得模組註冊獨立頁面之網址 */\r
80         function getModulePageURL($name){\r
81                 return $this->ENV['MODULE.PAGE'].$name;\r
82         }\r
83 \r
84         // 模組掛載與使用相關\r
85         /* 自動掛載相關模組方法於掛載點並回傳掛載點 (Return by Reference) */\r
86         function &__autoHookMethods($hookPoint){\r
87                 if(isset($this->hooks[$hookPoint]) && !isset($this->hookPoints[$hookPoint])){ // 尚未掛載\r
88                         $this->hookPoints[$hookPoint] = array();\r
89                         foreach($this->moduleLists as $m){\r
90                                 if(method_exists($this->moduleInstance[$m], 'autoHook'.$hookPoint)){\r
91                                         $this->hookModuleMethod($hookPoint, array(&$this->moduleInstance[$m], 'autoHook'.$hookPoint));\r
92                                 }\r
93                         }\r
94                 }\r
95                 return $this->hookPoints[$hookPoint];\r
96         }\r
97 \r
98         /* 將模組方法掛載於特定掛載點 */\r
99         function hookModuleMethod($hookPoint, $methodObject){\r
100                 if(!isset($this->hooks[$hookPoint])) return false;\r
101                 if(!isset($this->hookPoints[$hookPoint]) && $hookPoint != 'ModulePage'){\r
102                         if(!$this->loaded) $this->init();\r
103                         $this->__autoHookMethods($hookPoint);\r
104                 }\r
105                 $this->hookPoints[$hookPoint][] = $methodObject;\r
106         }\r
107 \r
108         /* 使用模組方法 */\r
109         function useModuleMethods($hookPoint, $parameter){\r
110                 if(!$this->loaded) $this->init();\r
111                 $arrMethod =& $this->__autoHookMethods($hookPoint); // 取得掛載點模組方法\r
112                 $imax = count($arrMethod);\r
113                 for($i = 0; $i < $imax; $i++) call_user_func_array($arrMethod[$i], $parameter);\r
114         }\r
115 }\r
116 ?>