PageRenderTime 47ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 1ms

/html/includes/Module.php

https://bitbucket.org/kuy/ecom
PHP | 325 lines | 186 code | 97 blank | 42 comment | 30 complexity | cc89910a0449f42af95fa7ff15837d1a MD5 | raw file
Possible License(s): GPL-3.0, LGPL-2.1, GPL-2.0
  1. <?php
  2. /* Copyright (c) 2009 National Research Institute for Earth Science and
  3. * Disaster Prevention (NIED).
  4. * This code is licensed under the GPL 3.0 license, availible at the root
  5. * application directory.
  6. */
  7. ?>
  8. <?php
  9. require_once dirname(__FILE__)."/sql/MySqlData.php";
  10. //-----------------------------------------------------
  11. // * インストール済みのパーツを取得
  12. //-----------------------------------------------------
  13. function get_modules($eid = null) {
  14. $module = array();
  15. $bit = 0;
  16. if (is_portal(get_gid($eid))) {
  17. $bit = Module::PART_OF_PORTAL;
  18. }
  19. else if (is_group($eid)) {
  20. $bit = Module::PART_OF_GROUPPAGE;
  21. }
  22. else {
  23. $bit = Module::PART_OF_MYPAGE;
  24. }
  25. $objs = ModuleManager::getInstance()->getModules();
  26. foreach ( $objs as $mod ) {
  27. if ( $bit & $mod->getType() ) {
  28. $module[$mod->getModName()] = $mod->getModTitle();
  29. }
  30. }
  31. return $module;
  32. }
  33. //-----------------------------------------------------
  34. // * パーツ名のデフォルト名称の取得
  35. //-----------------------------------------------------
  36. function get_module_name($m = null) {
  37. global $SYS_MODULE_NAME;
  38. if (isset($SYS_MODULE_NAME[$m])) {
  39. return $SYS_MODULE_NAME[$m];
  40. }
  41. else if ($m) {
  42. try {
  43. $mod = Module::createInstanceByModName( $m );
  44. $SYS_MODULE_NAME[$m] = $mod->getModTitle();
  45. return $SYS_MODULE_NAME[$m];
  46. } catch ( Exception $e ) {
  47. return '!!モジュール名不明!!';
  48. }
  49. }
  50. }
  51. //-----------------------------------------------------
  52. // * パーツ名の取得 (ユーザーによる変更後)
  53. //-----------------------------------------------------
  54. function get_block_name($id = null) {
  55. global $SYS_BLOCK_NAME;
  56. if ($id && isset($SYS_BLOCK_NAME[$id])) {
  57. return $SYS_BLOCK_NAME[$id];
  58. }
  59. if (!isset($id)) {
  60. return;
  61. }
  62. $d = mysql_uniq("select name from block where id = %s", mysql_num($id));
  63. if ($d) {
  64. $SYS_BLOCK_NAME[$id] = $d["name"];
  65. }
  66. return $SYS_BLOCK_NAME[$id];
  67. }
  68. /**
  69. * Description of Module
  70. *
  71. * @author ikeda
  72. */
  73. class Module extends MySqlData {
  74. const DATABASE = "module_setting";
  75. const PART_OF_PORTAL = 1;
  76. const PART_OF_GROUPPAGE = 2;
  77. const PART_OF_MYPAGE = 4;
  78. private $r_id;
  79. private $r_mod_title;
  80. private $r_mod_name;
  81. private $r_type;
  82. private $r_addable;
  83. private $r_multiple;
  84. private $r_block_inc;
  85. public function __construct( $id=null, $connection=null ) {
  86. parent::__construct( $id, $connection );
  87. }
  88. protected function setId( $id ) { $this->r_id = (int)$id; }
  89. public function setModTitle( $mod_title ) { $this->r_mod_title = $mod_title; }
  90. public function setModName( $mod_name ) { $this->r_mod_name = $mod_name; }
  91. public function setType( $type ) { $this->r_type = (int)$type; }
  92. public function setAddable( $addable ) { $this->r_addable = (int)$addable; }
  93. public function setMultiple( $multiple ) { $this->r_multiple = (int)$multiple; }
  94. public function setBlockInc( $block_inc ) { $this->r_block_inc = $block_inc; }
  95. public function getId() { return $this->r_id; }
  96. public function getModTitle() { return $this->r_mod_title; }
  97. public function getModName() { return $this->r_mod_name; }
  98. public function getType() { return $this->r_type; }
  99. public function getAddable() { return $this->r_addable; }
  100. public function getMultiple() { return $this->r_multiple; }
  101. public function getBlockInc() { return $this->r_block_inc; }
  102. static public function getTableName() { return Module::DATABASE; }
  103. static public function getKeyName() { return "id"; }
  104. static function getModules() {
  105. $state = new MySqlSelectStatement( "Module" );
  106. return $state->exec()->getDatas();
  107. }
  108. static function createInstanceByModName( $modName ) {
  109. $stat = new MySqlSelectStatement( "Module" );
  110. $stat->setOtherConditions( "where mod_name="
  111. .MySqlUtil::decorateText( $modName ) );
  112. $datas = $stat->exec()->getDatas();
  113. if ( 0 == count( $datas ) ) { throw new DataNotFoundException(); }
  114. return $datas[0];
  115. }
  116. private function getModuleFile( $func=null, $legacy=false ) {
  117. if ( !$legacy ) {
  118. if ( file_exists( $filename = dirname(__FILE__). '/../modules/'.$this->getModName().'/module.php' ) ) {
  119. return $filename;
  120. } else {
  121. return false;
  122. }
  123. } else {
  124. $legacyFiles = ModuleManager::getInstance()->getLegacyFiles();
  125. if ( null !== $func and isset( $legacyFiles[ $func ] )
  126. and file_exists( $filename = dirname(__FILE__).'/../modules/'.$this->getModName().'/'.$legacyFiles[ $func ] ) ) {
  127. return $filename;
  128. } else {
  129. return false;
  130. }
  131. }
  132. }
  133. /**
  134. * モジュールのコールバック関数を実行する.
  135. *
  136. * @param string $funcSuffix モジュールコールバック関数名のサフィックス.
  137. * 例: mod_blog_main の場合は "main", mod_blog_main_config の場合は "main_config"
  138. * @param array $params コールバック関数に渡される引数の配列.
  139. * @param mixed $result コールバックの結果を格納する変数への参照.
  140. *
  141. * @return bool コールバックが存在し、実行されたかどうか.
  142. *
  143. */
  144. public function execCallBackFunction( $funcSuffix, $params, &$result ) {
  145. $filenames = array( $this->getModuleFile( $funcSuffix ),
  146. $this->getModuleFile( $funcSuffix, true ) );
  147. foreach ( $filenames as $filename ) {
  148. if ( $filename ) {
  149. require_once $filename;
  150. $funcName = "mod_".$this->getModName()."_".$funcSuffix;
  151. // 古い規約で、install関数とuninstall関数のみ例外.
  152. if ( basename( $filename ) == "install.php"
  153. and !function_exists( $funcName ) ) {
  154. $funcName = "mod_install";
  155. }
  156. if ( basename( $filename ) == "uninstall.php"
  157. and !function_exists( $funcName ) ) {
  158. $funcName = "mod_uninstall";
  159. }
  160. if ( function_exists( $funcName ) ) {
  161. $result = call_user_func_array( $funcName, $params );
  162. return true;
  163. }
  164. }
  165. }
  166. return false;
  167. }
  168. }
  169. class ModuleManager {
  170. static private $instance;
  171. private $legacyFiles;
  172. private $modules;
  173. private function __construct() {
  174. $this->legacyFiles = array( "block" => "block.php",
  175. "block_config" => "block.php",
  176. "main" => "main.php",
  177. "main_config" => "main.php",
  178. "editmenu" => "config.php",
  179. "install" => "install.php",
  180. "uninstall" => "uninstall.php");
  181. $this->modules = Module::getModules();
  182. }
  183. static public function getInstance() {
  184. if ( null === ModuleManager::$instance ) {
  185. ModuleManager::$instance = new ModuleManager();
  186. }
  187. return ModuleManager::$instance;
  188. }
  189. public function getModule( $modName ) {
  190. foreach ( $this->modules as $module ) {
  191. if ( $modName == $module->getModName() ) {
  192. return $module;
  193. }
  194. }
  195. throw new ModuleNotFoundException( $modName );
  196. }
  197. public function getModules() {
  198. return $this->modules;
  199. }
  200. public function getLegacyFiles() {
  201. return $this->legacyFiles;
  202. }
  203. /**
  204. * 登録された全てのモジュールのコールバック関数を実行する.
  205. *
  206. * @param string $funcSuffix モジュールコールバック関数名のサフィックス.
  207. * 例: mod_blog_main の場合は "main", mod_blog_main_config の場合は "main_config"
  208. * @param array $params コールバック関数に渡される引数の配列.
  209. *
  210. * @return array コールバックが実行されたモジュール名をキーとし、関数の戻り値を
  211. * 値とする連想配列.
  212. *
  213. */
  214. public function execCallbackFunctions( $funcSuffix, $params=array() ) {
  215. $results = array();
  216. foreach ( $this->modules as $module ) {
  217. if ( $module->execCallbackFunction( $funcSuffix, $params, $result ) )
  218. $results[ $module->getModName() ] = $result;
  219. }
  220. return $results;
  221. }
  222. }
  223. class ModuleNotFoundException extends Exception {
  224. public function __construct( $message ) {
  225. parent::__construct( $message );
  226. }
  227. }
  228. ?>