summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <LukeShu@sbcglobal.net>2011-09-04 20:42:32 -0400
committerLuke Shumaker <LukeShu@sbcglobal.net>2011-09-04 20:42:32 -0400
commit716c3a5a3a36206e93431eb5f8df3471546ec4b2 (patch)
treefaccf06e355ce37f233f823a87b4a93d9f531cb2
parent103332a30f8976fcc224c8f55dc23aba7b99e578 (diff)
start to add a plugin management framework
-rw-r--r--index.php3
-rw-r--r--plugin-conf.php5
-rw-r--r--src/lib/ContactMethod.class.php17
-rw-r--r--src/lib/MessageManager.class.php9
-rw-r--r--src/lib/Plugin.class.php8
-rw-r--r--src/lib/PluginManager.class.php90
6 files changed, 120 insertions, 12 deletions
diff --git a/index.php b/index.php
index 3a3a646..ceab3f3 100644
--- a/index.php
+++ b/index.php
@@ -41,6 +41,9 @@ require_once('Model.class.php');
require_once('Controller.class.php');
require_once('Router.class.php');
+require_once('ContactMethod.class.php');
+require('plugin-conf.php');
+
global $mm;
require_once('MessageManager.class.php');
$mm = new MessageManager(BASEPATH.'/conf.php');
diff --git a/plugin-conf.php b/plugin-conf.php
new file mode 100644
index 0000000..7b397cc
--- /dev/null
+++ b/plugin-conf.php
@@ -0,0 +1,5 @@
+<?php
+new ContactMethod('sms' , 'phone' ,
+ 'text message', 'cell number' );
+new ContactMethod('email' , 'email' ,
+ 'email' , 'email address');
diff --git a/src/lib/ContactMethod.class.php b/src/lib/ContactMethod.class.php
index c01374e..b01e7d3 100644
--- a/src/lib/ContactMethod.class.php
+++ b/src/lib/ContactMethod.class.php
@@ -16,20 +16,15 @@ class ContactMethod {
public function __construct($verb_slug, $addr_slug,
$verb_text, $addr_text)
{
- $this->$verb_slug = $verb_slug;
- $this->$addr_slug = $addr_slug;
- $this->$verb_text = $verb_text;
- $this->$addr_Text = $addr_text;
+ $this->verb_slug = $verb_slug;
+ $this->addr_slug = $addr_slug;
+ $this->verb_text = $verb_text;
+ $this->addr_text = $addr_text;
global $CONTACT_METHODS;
- $CONTACT_METHODS[$slug] = $this;
+ $CONTACT_METHODS[$verb_slug] = $this;
}
public function setHandler($handler) {
- $this->$handler = $handler;
+ $this->handler = $handler;
}
}
-
-new ContactMethod('sms' , 'phone' ,
- 'text message', 'cell number' );
-new ContactMethod('email' , 'email' ,
- 'email' , 'email address');
diff --git a/src/lib/MessageManager.class.php b/src/lib/MessageManager.class.php
index d9d9fbc..cfcdac7 100644
--- a/src/lib/MessageManager.class.php
+++ b/src/lib/MessageManager.class.php
@@ -6,6 +6,7 @@ class MessageManager {
private $db_prefix;
private $pw_hasher;
private $template;
+ private $pluginManager;
private $base;
private $users = array();
@@ -386,6 +387,14 @@ class MessageManager {
}
return $this->template;
}
+
+ public function pluginManager() {
+ if (!isset($this->pluginManager)) {
+ require_once('PluginManager.class.php');
+ $this->pluginManager = new PluginManager();
+ }
+ return $this->pluginManager;
+ }
public function login($username, $password) {
$uid = $this->getUID($username);
diff --git a/src/lib/Plugin.class.php b/src/lib/Plugin.class.php
index f2251d2..8c7fad8 100644
--- a/src/lib/Plugin.class.php
+++ b/src/lib/Plugin.class.php
@@ -11,6 +11,12 @@ abstract class Plugin {
$this->config[$param]=$value;
}
}
+
+ public function userConfig() { return array(); }
+ protected function addConfigGroup($arr, $group) {
+ if (!isset($arr[$group]))
+ $arr[$group] = array();
+ }
public abstract function init();
-} \ No newline at end of file
+}
diff --git a/src/lib/PluginManager.class.php b/src/lib/PluginManager.class.php
new file mode 100644
index 0000000..22d7b0c
--- /dev/null
+++ b/src/lib/PluginManager.class.php
@@ -0,0 +1,90 @@
+<?php
+
+class PluginManager {
+ public $plugins = array();
+ private $loaded = false;
+ /**
+ * Return an instance of the plugin with $plugin_name
+ */
+ public function loadPlugin($plugin_name) {
+ global $mm;
+
+ require_once("$plugin_name.class.php");
+ $obj = new $plugin_name;
+ $params = call_user_func("$plugin_name::configList");
+ foreach ($params as $param => $type) {
+ $value = $mm->getPluginConf($plugin_name, $param);
+ if ($value!==false) {
+ switch ($type) {
+ case 'text':
+ case 'password':
+ $value = "$value";
+ break;
+ case 'int':
+ $value = (int)$value;
+ break;
+ }
+ $obj->configSet($param, $value);
+ }
+ }
+ return $obj;
+ }
+
+ /**
+ * Return an array of available plugin names.
+ */
+ public function listPlugins() {
+ $plugins = array();
+
+ $dirs = explode(PATH_SEPARATOR, PLUGINPATH);
+ foreach ($dirs as $dir) {
+ // Find all files in $dir with the ext `.class.php'
+ $files = glob($dir.'/*.class.php');
+ foreach ($files as $file) {
+ $plugins[] = preg_replace('@\.class\.php$@', '$1', basename($file));
+ }
+ }
+
+ return $plugins;
+ }
+
+ /**
+ * Return an array of enabled plugin names.
+ */
+ public function getActivePlugins() {
+ global $mm;
+ $string = $mm->getSysConf('plugins');
+ return $mm->valueToArray($string);
+ }
+
+ /**
+ * Set the enabled plugins.
+ */
+ public function setActivePlugins($plugins) {
+ global $mm;
+ $string = $mm->arrayToValue($plugins);
+ return $mm->setSysConf('plugins', $string);
+ }
+
+ /**
+ * Load the enabled plugins.
+ */
+ public function loadPlugins() {
+ if ($this->loaded) return;
+ $plugin_names = $this->getActivePlugins();
+ foreach ($plugin_names as $name) {
+ $this->plugins[$name] = $this->loadPlugin($name);
+ }
+ $this->loaded = true;
+ }
+
+ public function callHook($hook, $arg=null) {
+ $this->loadPlugins();
+ $ret = array();
+ foreach ($this->plugins as $name => $plugin) {
+ $ret[$name] = call_user_func(array($plugin, $hook),
+ &$arg);
+ }
+ return $ret;
+ }
+}