File: 0.01.1a/core/PluginManager.php (View as Code)

1: 2: /* ------------------------------------------------------------- 3: This file is part of FreeDESK 4: 5: FreeDESK is (C) Copyright 2012 David Cutting 6: 7: FreeDESK is free software: you can redistribute it and/or modify 8: it under the terms of the GNU General Public License as published by 9: the Free Software Foundation, either version 3 of the License, or 10: (at your option) any later version. 11: 12: FreeDESK is distributed in the hope that it will be useful, 13: but WITHOUT ANY WARRANTY; without even the implied warranty of 14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15: GNU General Public License for more details. 16: 17: You should have received a copy of the GNU General Public License 18: along with FreeDESK. If not, see www.gnu.org/licenses 19: 20: For more information see www.purplepixie.org/freedesk/ 21: -------------------------------------------------------------- */ 22: 23: /** 24: * Plugin class - holds all associated data with generic plugins 25: **/ 26: class Plugin 27: { 28: /** 29: * Name 30: **/ 31: var $name; 32: /** 33: * Version (maj.min only) 34: **/ 35: var $version; 36: /** 37: * Type 38: **/ 39: var $type=""; 40: /** 41: * Sub-Type 42: **/ 43: var $subtype=""; 44: /** 45: * Class Name 46: **/ 47: var $classname=""; 48: /** 49: * Constructor 50: * @param string $name Name of plugin (optional, default "") 51: * @param string $version Version of plugin (optional, default "") 52: * @param string $type Type of plugin (optional, default "") 53: * @param string $subtype Subtype of plugin (optional, default "") 54: * @param string $classname Class name of pluging (optional, default "") 55: **/ 56: function Plugin($name="",$version="",$type="",$subtype="",$classname="") 57: { 58: $this->name=$name; 59: $this->version=$version; 60: $this->type=$type; 61: $this->subtype=$subtype; 62: $this->classname=$classname; 63: } 64: } 65: 66: /** 67: * Plugin Manager - Handles all run-time-enabled plugins 68: **/ 69: class PluginManager 70: { 71: /** 72: * FreeDESK instance 73: **/ 74: private $DESK = null; 75: 76: /** 77: * Array of registered plugins and components 78: **/ 79: private $plugins = array(); 80: 81: /** 82: * Array of plugin modules 83: **/ 84: private $pims = array(); 85: 86: /** 87: * PIM Counter 88: **/ 89: private $pim_counter = 0; 90: 91: /** 92: * Array of simple pages 93: **/ 94: private $pages = array(); 95: 96: /** 97: * Array of PIM pages 98: **/ 99: private $pim_pages = array(); 100: 101: /** 102: * Array of scripts 103: **/ 104: private $scripts = array(); 105: 106: /** 107: * Array of CSS 108: **/ 109: private $css = array(); 110: 111: /** 112: * Array of API modes for PIMS 113: **/ 114: private $pim_api = array(); 115: 116: /** 117: * Array of events registered for PIMS 118: **/ 119: private $pim_events = array(); 120: 121: /** 122: * Installed PIM List 123: **/ 124: private $installed_pims = null; 125: 126: /** 127: * Constructor 128: * @param mixed $freeDESK FreeDESK instance 129: **/ 130: function PluginManager(&$freeDESK) 131: { 132: $this->DESK = &$freeDESK; 133: $this->DESK->PermissionManager->Register("sysadmin_plugins",false); 134: } 135: 136: /** 137: * Register a plugin 138: * @param mixed $plugin Plugin to register 139: **/ 140: function Register(&$plugin) 141: { 142: $this->plugins[]=$plugin; 143: } 144: 145: /** 146: * Register a page for display 147: * @param string $id Page identifier 148: * @param string $page Page path (fully-qualified) 149: * @param bool $autoperm Automatically register permission for the page (optional, default true) 150: **/ 151: function RegisterPage($id, $page, $autoperm=true) 152: { 153: $this->pages[$id]=$page; 154: if ($autoperm) 155: $this->DESK->PermissionManager->Register("page.".$id,false); 156: } 157: 158: /** 159: * Register a PIM page for use in a PIM 160: * @param string $page Page identifier 161: * @param int $id PIM internal ID 162: **/ 163: function RegisterPIMPage($page, $id) 164: { 165: $this->pim_pages[$page] = $id; 166: } 167: 168: /** 169: * Register a script for inclusion 170: * @param string $script Web path to script 171: **/ 172: function RegisterScript($script) 173: { 174: $this->scripts[] = $script; 175: } 176: 177: /** 178: * Register CSS for inclusion (after Skin CSS) 179: * @param string $css Web path to CSS 180: **/ 181: function RegisterCSS($css) 182: { 183: $this->css[]=$css; 184: } 185: 186: /** 187: * Register an API call for inclusion 188: * @param string $mode API Mode 189: * @param int $id Plugin ID 190: **/ 191: function RegisterPIMAPI($mode, $id) 192: { 193: $this->pim_api[$mode] = $id; 194: } 195: 196: /** 197: * Perform an API call 198: * @param string $mode API Call 199: * @return bool False if no API call made true if called 200: **/ 201: function API($mode) 202: { 203: if (isset($this->pim_api[$mode])) 204: if (isset($this->pims[$this->pim_api[$mode]])) 205: { 206: $this->pims[$this->pim_api[$mode]]->API($mode); 207: return true; 208: } 209: return false; 210: } 211: 212: /** 213: * Register an event call to a PIM for calling 214: * @param string $event Event call 215: * @param int $id Plugin ID 216: **/ 217: function RegisterPIMEvent($event, $id) 218: { 219: if (!isset($this->pim_events[$event])) 220: $this->pim_events[$event]=array(); 221: $this->pim_events[$event][] = $id; 222: } 223: 224: /** 225: * Call an event 226: * @param string $event Event Call 227: * @param array &$data Event data 228: **/ 229: function Event($event, &$data) 230: { 231: if (isset($this->pim_events[$event])) 232: { 233: foreach($this->pim_events[$event] as $id) 234: { 235: $this->pims[$id]->Event($event, &$data); 236: } 237: } 238: } 239: 240: /** 241: * Get list of scripts 242: * @return array List of scripts 243: **/ 244: function GetScripts() 245: { 246: return $this->scripts; 247: } 248: 249: /** 250: * Get list of CSS 251: * @return array List of CSS 252: **/ 253: function GetCSS() 254: { 255: return $this->css; 256: } 257: 258: /** 259: * Get a page by ID 260: * @param string $id Page identifier 261: * @return mixed Page path (fully-qualified) or bool false on failure 262: **/ 263: function GetPage($id) 264: { 265: if (isset($this->pages[$id])) 266: return $this->pages[$id]; 267: return false; 268: } 269: 270: /** 271: * Call a PIM Page 272: * @param $id Page identifier 273: * @return bool true if exists and called or false if not 274: **/ 275: function PIMPage($id) 276: { 277: if (isset($this->pim_pages[$id])) 278: { 279: $pimid = $this->pim_pages[$id]; 280: if (isset($this->pims[$pimid])) 281: { 282: $this->pims[$pimid]->Page($id); 283: return true; 284: } 285: } 286: return false; 287: } 288: 289: /** 290: * Return all plugins 291: * @return array Array of all plugins 292: **/ 293: function GetAll() 294: { 295: return $this->plugins; 296: } 297: 298: /** 299: * Return plugins by type 300: * @param string $type Plugin Type 301: * @return array List of plugins 302: **/ 303: function GetType($type) 304: { 305: $output=array(); 306: foreach($this->plugins as $plugin) 307: { 308: if ($plugin->type == $type) 309: $output[]=$plugin; 310: } 311: return $output; 312: } 313: 314: /** 315: * Load a PIM 316: * @param string $pim Plugin Module Directory 317: **/ 318: function LoadPIM($pim) 319: { 320: $filepath = $this->DESK->BaseDir."plugins/".$pim."/"; 321: $webpath = $this->DESK->BaseDir."plugins/".$pim."/"; 322: $id = $this->pim_counter++; 323: 324: include($filepath.$pim.".php"); 325: 326: $this->pims[$id] = new $pim($this->DESK, $filepath, $webpath, $id); 327: $this->pims[$id]->Start(); 328: } 329: 330: /** 331: * Load installed PIM list 332: **/ 333: private function LoadInstalledPIMS() 334: { 335: $q="SELECT * FROM ".$this->DESK->Database->Table("plugins"); 336: $r=$this->DESK->Database->Query($q); 337: 338: $this->installed_pims = array(); 339: 340: while ($row = $this->DESK->Database->FetchAssoc($r)) 341: { 342: $this->installed_pims[$row['plugin']] = array( 343: "plugin" => $row['plugin'], 344: "id" => $row['pluginid'], 345: "active" => ($row['active'] == 1) ? true : false ); 346: } 347: 348: $this->DESK->Database->Free($r); 349: } 350: 351: /** 352: * Load PIMs (load and start activated PIMs) 353: **/ 354: function LoadPIMS() 355: { 356: if ($this->installed_pims == null) 357: $this->LoadInstalledPIMS(); 358: foreach($this->installed_pims as $plugin => $data) 359: { 360: if ($data['active']) 361: $this->LoadPIM($plugin); 362: } 363: } 364: 365: /** 366: * Get a list of PIMS 367: * @return array list of PIMS 368: **/ 369: function ListPIMS() 370: { 371: if ($this->installed_pims == null) 372: $this->LoadInstalledPIMS(); 373: 374: $out = array(); 375: 376: $handle = opendir("plugins/"); 377: 378: if ($handle !== false) 379: { 380: while(false !== ($file = readdir($handle))) 381: { 382: if ($file != "." && $file != ".." && is_dir("plugins/".$file)) 383: { 384: 385: if (file_exists("plugins/".$file."/".$file.".php")) 386: { 387: $out[$file] = array( 388: "installed" => isset($this->installed_pims[$file]) ? true : false, 389: "data" => isset($this->installed_pims[$file]) ? $this->installed_pims[$file] : array() 390: ); 391: } 392: } 393: } 394: 395: closedir($handle); 396: } 397: return $out; 398: } 399: 400: /** 401: * Install PIM 402: * @param string $plugin Plugin Name 403: **/ 404: function InstallPIM($plugin) 405: { 406: $path = "plugins/".$plugin."/"; 407: $file = $path.$plugin.".php"; 408: include_once($file); 409: 410: $inst = new $plugin($this->DESK, $path, $path, 9999); 411: 412: $inst->Install(); 413: 414: $q="INSERT INTO ".$this->DESK->Database->Table("plugins")."(".$this->DESK->Database->Field("plugin").",".$this->DESK->Database->Field("active").")"; 415: $q.=" VALUES(".$this->DESK->Database->SafeQuote($plugin).",".$this->DESK->Database->Safe("0").")"; 416: 417: $this->DESK->Database->Query($q); 418: } 419: 420: /** 421: * Set a PIM as active or not 422: * @param int $id ID (pluginid in database) 423: * @param bool $active Active flag 424: **/ 425: function ActivatePIM($id, $active) 426: { 427: 428: $q="SELECT * FROM ".$this->DESK->Database->Table("plugins")." WHERE ".$this->DESK->Database->Field("pluginid")."=".$this->DESK->Database->Safe($id); 429: $r=$this->DESK->Database->Query($q); 430: 431: if ($row=$this->DESK->Database->FetchAssoc($r)) 432: { 433: $plugin = $row['plugin']; 434: $path = "plugins/".$plugin."/"; 435: $file = $path.$plugin.".php"; 436: include_once($file); 437: 438: $inst = new $plugin($this->DESK, $path, $path, 9999); 439: 440: if ($active) 441: $inst->Activate(); 442: else 443: $inst->Deactivate(); 444: 445: $q="UPDATE ".$this->DESK->Database->Table("plugins")." SET ".$this->DESK->Database->Field("active")."="; 446: if ($active) 447: $q.="1"; 448: else 449: $q.="0"; 450: $q.=" WHERE ".$this->DESK->Database->Field("pluginid")."=".$this->DESK->Database->Safe($id); 451: 452: $this->DESK->Database->Query($q); 453: } 454: 455: $this->DESK->Database->Free($r); 456: } 457: 458: 459: /** 460: * Uninstall a PIM 461: * @param int $id ID (pluginid in database) 462: **/ 463: function UninstallPIM($id) 464: { 465: 466: $q="SELECT * FROM ".$this->DESK->Database->Table("plugins")." WHERE ".$this->DESK->Database->Field("pluginid")."=".$this->DESK->Database->Safe($id); 467: $r=$this->DESK->Database->Query($q); 468: 469: if ($row=$this->DESK->Database->FetchAssoc($r)) 470: { 471: $plugin = $row['plugin']; 472: $path = "plugins/".$plugin."/"; 473: $file = $path.$plugin.".php"; 474: include_once($file); 475: 476: $inst = new $plugin($this->DESK, $path, $path, 9999); 477: 478: $inst->Uninstall(); 479: 480: $q="DELETE FROM ".$this->DESK->Database->Table("plugins")." WHERE ".$this->DESK->Database->Field("pluginid")."=".$this->DESK->Database->Safe($id); 481: 482: $this->DESK->Database->Query($q); 483: } 484: 485: $this->DESK->Database->Free($r); 486: } 487: 488: /** 489: * Call BuildMenu on all PIMs 490: **/ 491: function BuildMenu() 492: { 493: foreach($this->pims as $id => $pim) 494: $pim->BuildMenu(); 495: } 496: 497: } 498: 499: 500: ?> 501: