module.php
上传用户:snow1005
上传日期:2015-11-10
资源大小:3151k
文件大小:11k
源码类别:

Ajax

开发平台:

JavaScript

  1. <?php
  2. /*
  3.  * qWikiOffice Desktop 1.0
  4.  * Copyright(c) 2007-2008, Integrated Technologies, Inc.
  5.  * licensing@qwikioffice.com
  6.  * 
  7.  * http://www.qwikioffice.com/license
  8.  */
  9. class module {
  10. private $os;
  11. public function __construct($os){
  12. $this->os = $os;
  13. }
  14. /** init() Initial page load or refresh has occured
  15.   * 
  16.   **/
  17. public function init(){
  18.     if(isset($_SESSION['modules'])){
  19.         unset($_SESSION['modules']);
  20.     }
  21.     
  22. if(isset($_SESSION['dependencies'])){
  23. unset($_SESSION['dependencies']);
  24. }
  25. }
  26. /** is_loadable() Returns true if all of the module's files (and dependencies) are found.
  27.   * The module can be loaded.
  28.   * 
  29.   * @param {string} $moduleId The client moduleId property 
  30.   **/
  31. private function is_loadable($moduleId){
  32.     $response = false;
  33.     
  34.     if(!isset($_SESSION['modules'])){
  35.         $this->find_files();
  36.     }
  37.     
  38.     if(isset($_SESSION['modules']['can_load'][$moduleId])){
  39. if($_SESSION['modules']['can_load'][$moduleId]){
  40. $response = true;
  41. }
  42. }
  43. return $response;
  44. } // end is_loadable()
  45. /** find_files() Queries the Db and checks the module files.
  46.   * Results are stored in session.
  47.   **/
  48. private function find_files(){
  49.     $member_id = $this->os->session->get_member_id();
  50. $group_id = $this->os->session->get_group_id();
  51. if($member_id != "" && $group_id != ""){
  52.      unset($_SESSION['modules']);
  53.     
  54.      $modules_dir = $this->os->get_module_dir();
  55. $sql = "SELECT
  56. M.id,
  57. M.module_id AS moduleId,
  58. concat(F.directory, F.file) AS path
  59. FROM
  60. qo_modules_files AS F
  61. INNER JOIN qo_modules AS M ON M.id = F.qo_modules_id
  62. WHERE
  63. M.active = 1";
  64. if($result = mysql_query($sql)){
  65. $prev_module = '';
  66. $is_allowed = false;
  67. while($row = mysql_fetch_assoc($result)){
  68. $cur_module = $row['id'];
  69. if($prev_module != $cur_module){
  70. $prev_module = $cur_module;
  71. $is_loadable = 1;
  72. if($this->os->privilege->is_allowed("loadModule", $row["moduleId"], $member_id, $group_id)){     
  73.     if(!$this->check_dependencies($modules_dir, $cur_module)){
  74. $is_loadable = 0;
  75. }
  76. $is_allowed = true;
  77. }else{
  78.     $is_allowed = false;
  79. }
  80. }
  81. if($is_allowed){
  82. $path = $row['path'];
  83. if($path != ''){
  84. if(!is_file($modules_dir.$path)){
  85. $_SESSION['modules']['has_error'][] = 'Script: module.php, Method: find_files, Missing file: '.$modules_dir.$path;
  86. $is_loadable = 0;
  87. }
  88. }
  89. }
  90. // store in session
  91. $_SESSION['modules']['can_load'][ $row['moduleId'] ] = $is_loadable;
  92. }
  93. // report errors
  94. if(count($_SESSION['modules']['has_error']) > 0){
  95.     $this->os->error->log($_SESSION['modules']['has_error']);
  96. }
  97. }
  98.     }
  99. } // end find_files()
  100. /** check_dependencies()
  101.   * 
  102.   * $param {integer} $id The server (database) module id
  103.   **/
  104. private function check_dependencies($modules_dir, $id){
  105. $response = true;
  106.     
  107.     $sql = "SELECT
  108.      M.module_id AS moduleId,
  109. D.directory,
  110. D.file
  111. FROM
  112. qo_modules_has_dependencies AS MD
  113. INNER JOIN qo_dependencies AS D ON D.id = MD.qo_dependencies_id
  114. INNER JOIN qo_modules AS M ON M.id = MD.qo_modules_id
  115. WHERE
  116. M.id = ".$id;
  117. if($result = mysql_query($sql)){
  118.     while($row = mysql_fetch_assoc($result)){
  119. $path = $row['directory'].$row['file'];
  120. if($path != ''){
  121. if(!is_file($modules_dir.$path)){
  122. $_SESSION['modules']['has_error'][] = 'Script: module.php, Method: check_dependencies, Missing file: '.$modules_dir.$path;
  123. $response = false;
  124. }
  125. }
  126.     }
  127. }
  128.     
  129.     return $response;
  130. } // end check_dependencies()
  131. /** get_id() Returns the id of a module's database record.
  132.   * 
  133.   * @param {string} $moduleId The client module's moduleId property.
  134.   **/
  135. public function get_id($moduleId){
  136. $id = '';
  137. if($this->os->session->exists() && $moduleId != ""){
  138. $sql = "SELECT
  139. id
  140. FROM
  141. qo_modules
  142. WHERE
  143. module_id = '".$moduleId."'";
  144. if(mysql_num_rows($result = mysql_query($sql)) > 0){
  145. $row = mysql_fetch_assoc($result);
  146. $id = $row["id"];
  147. }
  148. }
  149. return $id;
  150. } // end get_id()
  151. /** get_all() Returns new instances of the loaded modules.
  152.   * Used by getModules() of QoDesk.php
  153.   **/
  154. public function get_all(){
  155. $response = '';
  156. $m = $_SESSION['modules']['loaded'];
  157. for($i = 0, $len = count($m); $i < $len; $i++){
  158. $response .= "new ".$m[$i]['class']."(),";
  159. }
  160. $response = rtrim($response, ","); // trim the trailing comma
  161. return $response;
  162. } // end get_all()
  163. /** get_css() Returns a string of all css files to include
  164.   * Used by index.php
  165.   **/
  166. public function get_css(){
  167. $response = '';
  168. $member_id = $this->os->session->get_member_id();
  169. $group_id = $this->os->session->get_group_id();
  170. $modules_dir = $this->os->get_module_dir();
  171. if($member_id != "" && $group_id != ""){
  172. $sql = "SELECT
  173. M.module_id AS moduleId,
  174. F.directory,
  175. F.file
  176. FROM
  177. qo_modules_files AS F
  178. INNER JOIN qo_modules AS M ON M.id = F.qo_modules_id
  179. WHERE
  180. F.is_stylesheet = 1
  181. AND
  182. M.active = 1";
  183. if($result = mysql_query($sql)){
  184. while($row = mysql_fetch_assoc($result)){
  185. // if the member is not allowed to load this module, skip it
  186.     if(!$this->os->privilege->is_allowed("loadModule", $row["moduleId"], $member_id, $group_id)){
  187.      continue;
  188.     }
  189.     
  190.     if(!$this->is_loadable($row["moduleId"])){
  191.         continue;
  192.     }
  193.     
  194.     $response .= '<link rel="stylesheet" type="text/css" href="'.$modules_dir.$row["directory"].$row["file"].'" />';
  195. }
  196. }
  197. $response;
  198. }
  199. return $response;
  200. } // end get_css()
  201. /** load() Prints the contents of the module's javascript files.
  202.   * Dependencies will also be loaded if needed.
  203.   * Used for Module on Demand functionality.
  204.   * 
  205.   * @param {string} $moduleId The client moduleId property
  206.   **/
  207. public function load($moduleId){
  208. $module_id = $this->get_id($moduleId); // the server (database) module id
  209. $member_id = $this->os->session->get_member_id();
  210. $group_id = $this->os->session->get_group_id();
  211. if($module_id != "" && $member_id != "" && $group_id != ""){
  212. // if the member is not allowed to load this module, skip it
  213.      if(!$this->os->privilege->is_allowed("loadModule", $moduleId, $member_id, $group_id)){
  214.      die("{success: false, msg: 'You do not have the required privileges!'}");
  215.      }
  216.     
  217. $document_root = $this->os->get_document_root();
  218. $modules_dir = $this->os->get_module_dir();
  219. // get module dependencies based on the member group
  220. $sql = "SELECT
  221. D.id,
  222.      D.directory,
  223. D.file
  224. FROM
  225. qo_modules_has_dependencies AS MD
  226. INNER JOIN qo_dependencies AS D ON D.id = MD.qo_dependencies_id
  227. INNER JOIN qo_modules AS M ON M.id = MD.qo_modules_id
  228. WHERE
  229. M.active = 1
  230. AND
  231. M.id = ".$module_id;
  232. if($result = mysql_query($sql)){
  233. while($row = mysql_fetch_assoc($result)){
  234. if($_SESSION['dependencies']['loaded'][ $row['id'] ]){ continue; }
  235.     print file_get_contents($document_root.$modules_dir.$row["directory"].$row["file"]);
  236.     $_SESSION['dependencies']['loaded'][ $row['id'] ] = 1;
  237. }
  238. }
  239. // get module files
  240. $sql = "SELECT
  241. F.directory,
  242. F.file
  243. FROM
  244. qo_modules_files AS F
  245. INNER JOIN qo_modules AS M ON M.id = F.qo_modules_id
  246. WHERE
  247. F.is_stylesheet = 0
  248. AND
  249. F.is_server_module = 0
  250. AND
  251. F.is_client_module = 0
  252. AND
  253. M.active = 1
  254. AND
  255. M.id = '".$module_id."'";
  256. if($result = mysql_query($sql)){
  257. while($row = mysql_fetch_assoc($result)){     
  258.     print file_get_contents($document_root.$modules_dir.$row["directory"].$row["file"]);
  259. }
  260. }
  261. }
  262. } // end load()
  263. /** load_all() Prints the content of all the client module files
  264.   **/
  265. public function load_all(){
  266. $member_id = $this->os->session->get_member_id();
  267. $group_id = $this->os->session->get_group_id();
  268. if($member_id != "" && $group_id != ""){
  269. $document_root = $this->os->get_document_root();
  270. $modules_dir = $this->os->get_module_dir();
  271. // get active modules
  272. $sql = "SELECT
  273. M.module_id AS moduleId,
  274. F.directory,
  275. F.file,
  276. F.class_name AS class
  277. FROM
  278. qo_modules_files AS F
  279. INNER JOIN qo_modules AS M ON M.id = F.qo_modules_id
  280. WHERE
  281. F.is_client_module = 1
  282. AND
  283. M.active = 1";
  284. if($result = mysql_query($sql)){
  285. $count = 0;
  286. while($row = mysql_fetch_assoc($result)){
  287. if($row['moduleId'] != '' && $row['directory'] != '' && $row['file'] != '' && $row['class'] != ''){
  288. // if the member is not allowed to load this module, skip it
  289.     if(!$this->os->privilege->is_allowed("loadModule", $row["moduleId"], $member_id, $group_id)){
  290.      continue;
  291.     }
  292.     
  293.     // if the module is not valid
  294.     if(!$this->is_loadable($row["moduleId"])){
  295.         continue;
  296.     }
  297.     
  298.     print file_get_contents($document_root.$modules_dir.$row["directory"].$row["file"]);
  299.     
  300.     // track loaded modules
  301.     $_SESSION['modules']['loaded'][$count]['moduleId'] = $row["moduleId"];
  302.     $_SESSION['modules']['loaded'][$count]['class'] = $row["class"];
  303.     
  304.     $count++;
  305. }
  306. }
  307. }
  308. }
  309. } // end load_all()
  310. /** run_action() Will check the users privileges and execute the action if allowed
  311.   * 
  312.   * @param {string} $moduleId The client moduleId property
  313.   * @param {string} $action, the name of the action/method to call (e.g. $module->action())
  314.   **/
  315. public function run_action($moduleId, $action){
  316. $member_id = $this->os->session->get_member_id();
  317. $group_id = $this->os->session->get_group_id();
  318. if($member_id == '' || $group_id == ''){
  319. die("{success: false, msg: 'You are not currently logged in'}");
  320. }else{
  321. //if member is allowed this action on this module
  322. if(!$this->os->privilege->is_allowed($action, $moduleId, $member_id, $group_id)){
  323. die("{success: false, msg: 'You do not have the required privileges!'}");
  324. }
  325. $sql = "SELECT
  326. F.directory,
  327. F.file,
  328. F.class_name AS class
  329. FROM
  330. qo_modules_files AS F
  331. INNER JOIN qo_modules AS M ON M.id = F.qo_modules_id
  332. WHERE
  333. F.is_server_module = 1
  334. AND
  335. M.active = 1
  336. AND
  337. M.module_id = '".$moduleId."'";
  338. if(mysql_num_rows($result = mysql_query($sql)) > 0){
  339. $row = mysql_fetch_assoc($result);
  340. $module_dir = $this->os->get_module_dir();
  341. $file = $module_dir.$row["directory"].$row["file"];
  342. $class = $row["class"];
  343. if(is_file($file)){
  344. require($file);
  345. if(class_exists($class)){
  346. $module = new $class($this->os);
  347. if(method_exists($module, $action)){
  348. $module->$action();
  349. }
  350. }
  351. }
  352. }
  353. }
  354. } // end run_action()
  355. }
  356. ?>