add experimental key/value storage for plugins
This commit is contained in:
parent
0f28f81f89
commit
d8a1d2a25b
|
@ -1,10 +1,17 @@
|
||||||
<?php
|
<?php
|
||||||
|
/* create table ttrss_plugin_storage
|
||||||
|
(id serial not null primary key, name varchar(100) not null,
|
||||||
|
owner_uid integer not null references ttrss_users(id) ON DELETE CASCADE,
|
||||||
|
content text not null) - not in schema yet
|
||||||
|
*/
|
||||||
class PluginHost {
|
class PluginHost {
|
||||||
private $link;
|
private $link;
|
||||||
private $hooks = array();
|
private $hooks = array();
|
||||||
private $plugins = array();
|
private $plugins = array();
|
||||||
private $handlers = array();
|
private $handlers = array();
|
||||||
private $commands = array();
|
private $commands = array();
|
||||||
|
private $storage = array();
|
||||||
|
private $owner_uid;
|
||||||
|
|
||||||
const HOOK_ARTICLE_BUTTON = 1;
|
const HOOK_ARTICLE_BUTTON = 1;
|
||||||
const HOOK_ARTICLE_FILTER = 2;
|
const HOOK_ARTICLE_FILTER = 2;
|
||||||
|
@ -21,6 +28,10 @@ class PluginHost {
|
||||||
|
|
||||||
function __construct($link) {
|
function __construct($link) {
|
||||||
$this->link = $link;
|
$this->link = $link;
|
||||||
|
|
||||||
|
$this->storage = $_SESSION["plugin_storage"];
|
||||||
|
|
||||||
|
if (!$this->storage) $this->storage = array();
|
||||||
}
|
}
|
||||||
|
|
||||||
private function register_plugin($name, $plugin) {
|
private function register_plugin($name, $plugin) {
|
||||||
|
@ -75,9 +86,11 @@ class PluginHost {
|
||||||
$this->load(join(",", $plugins), $kind);
|
$this->load(join(",", $plugins), $kind);
|
||||||
}
|
}
|
||||||
|
|
||||||
function load($classlist, $kind) {
|
function load($classlist, $kind, $owner_uid = false) {
|
||||||
$plugins = explode(",", $classlist);
|
$plugins = explode(",", $classlist);
|
||||||
|
|
||||||
|
$this->owner_uid = (int) $owner_uid;
|
||||||
|
|
||||||
foreach ($plugins as $class) {
|
foreach ($plugins as $class) {
|
||||||
$class = trim($class);
|
$class = trim($class);
|
||||||
$class_file = strtolower(basename($class));
|
$class_file = strtolower(basename($class));
|
||||||
|
@ -194,5 +207,76 @@ class PluginHost {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function load_data($force = false) {
|
||||||
|
if ($this->owner_uid && (!$_SESSION["plugin_storage"] || $force)) {
|
||||||
|
$plugin = db_escape_string($plugin);
|
||||||
|
|
||||||
|
$result = db_query($this->link, "SELECT name, content FROM ttrss_plugin_storage
|
||||||
|
WHERE owner_uid = '".$this->owner_uid."'");
|
||||||
|
|
||||||
|
while ($line = db_fetch_assoc($result)) {
|
||||||
|
$this->storage[$line["name"]] = unserialize($line["content"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$_SESSION["plugin_storage"] = $this->storage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function save_data($plugin) {
|
||||||
|
if ($this->owner_uid) {
|
||||||
|
$plugin = db_escape_string($plugin);
|
||||||
|
|
||||||
|
db_query($this->link, "BEGIN");
|
||||||
|
|
||||||
|
$result = db_query($this->link,"SELECT id FROM ttrss_plugin_storage WHERE
|
||||||
|
owner_uid= '".$this->owner_uid."' AND name = '$plugin'");
|
||||||
|
|
||||||
|
if (!isset($this->storage[$plugin]))
|
||||||
|
$this->storage[$plugin] = array();
|
||||||
|
|
||||||
|
$content = db_escape_string(serialize($this->storage[$plugin]));
|
||||||
|
|
||||||
|
if (db_num_rows($result) != 0) {
|
||||||
|
db_query($this->link, "UPDATE ttrss_plugin_storage SET content = '$content'
|
||||||
|
WHERE owner_uid= '".$this->owner_uid."' AND name = '$plugin'");
|
||||||
|
|
||||||
|
} else {
|
||||||
|
db_query($this->link, "INSERT INTO ttrss_plugin_storage
|
||||||
|
(name,owner_uid,content) VALUES
|
||||||
|
('$plugin','".$this->owner_uid."','$content')");
|
||||||
|
}
|
||||||
|
|
||||||
|
db_query($this->link, "COMMIT");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function set($sender, $name, $value, $sync = true) {
|
||||||
|
$idx = get_class($sender);
|
||||||
|
|
||||||
|
if (!isset($this->storage[$idx]))
|
||||||
|
$this->storage[$idx] = array();
|
||||||
|
|
||||||
|
$this->storage[$idx][$name] = $value;
|
||||||
|
|
||||||
|
$_SESSION["plugin_storage"] = $this->storage;
|
||||||
|
|
||||||
|
if ($sync) $this->save_data(get_class($sender));
|
||||||
|
}
|
||||||
|
|
||||||
|
function get($sender, $name, $default_value) {
|
||||||
|
$idx = get_class($sender);
|
||||||
|
|
||||||
|
if (isset($this->storage[$idx][$name])) {
|
||||||
|
return $this->storage[$idx][$name];
|
||||||
|
} else {
|
||||||
|
return $default_value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_all($sender) {
|
||||||
|
$idx = get_class($sender);
|
||||||
|
|
||||||
|
return $this->storage[$idx];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
|
|
@ -727,7 +727,8 @@
|
||||||
$plugins = get_pref($link, "_ENABLED_PLUGINS", $owner_uid);
|
$plugins = get_pref($link, "_ENABLED_PLUGINS", $owner_uid);
|
||||||
|
|
||||||
global $pluginhost;
|
global $pluginhost;
|
||||||
$pluginhost->load($plugins, $pluginhost::KIND_USER);
|
$pluginhost->load($plugins, $pluginhost::KIND_USER, $owner_uid);
|
||||||
|
$pluginhost->load_data();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,9 @@ class Example extends Plugin {
|
||||||
function save() {
|
function save() {
|
||||||
$example_value = db_escape_string($_POST["example_value"]);
|
$example_value = db_escape_string($_POST["example_value"]);
|
||||||
|
|
||||||
echo "Value set to $example_value (not really)";
|
$this->host->set($this, "example", $example_value);
|
||||||
|
|
||||||
|
echo "Value set to $example_value";
|
||||||
}
|
}
|
||||||
|
|
||||||
function get_prefs_js() {
|
function get_prefs_js() {
|
||||||
|
@ -35,6 +37,13 @@ class Example extends Plugin {
|
||||||
|
|
||||||
print "<div dojoType=\"dijit.layout.AccordionPane\" title=\"".__("Example Pane")."\">";
|
print "<div dojoType=\"dijit.layout.AccordionPane\" title=\"".__("Example Pane")."\">";
|
||||||
|
|
||||||
|
print "<br/>";
|
||||||
|
|
||||||
|
// print_r($this->host->set($this, "example", rand(0,100)));
|
||||||
|
// print_r($this->host->get_all($this));
|
||||||
|
|
||||||
|
$value = $this->host->get($this, "example");
|
||||||
|
|
||||||
print "<form dojoType=\"dijit.form.Form\">";
|
print "<form dojoType=\"dijit.form.Form\">";
|
||||||
|
|
||||||
print "<script type=\"dojo/method\" event=\"onSubmit\" args=\"evt\">
|
print "<script type=\"dojo/method\" event=\"onSubmit\" args=\"evt\">
|
||||||
|
@ -47,7 +56,7 @@ class Example extends Plugin {
|
||||||
notify_info(transport.responseText);
|
notify_info(transport.responseText);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.reset();
|
//this.reset();
|
||||||
}
|
}
|
||||||
</script>";
|
</script>";
|
||||||
|
|
||||||
|
@ -58,7 +67,7 @@ class Example extends Plugin {
|
||||||
print "<table width=\"100%\" class=\"prefPrefsList\">";
|
print "<table width=\"100%\" class=\"prefPrefsList\">";
|
||||||
|
|
||||||
print "<tr><td width=\"40%\">".__("Sample value")."</td>";
|
print "<tr><td width=\"40%\">".__("Sample value")."</td>";
|
||||||
print "<td class=\"prefValue\"><input dojoType=\"dijit.form.ValidationTextBox\" required=\"1\" name=\"example_value\"></td></tr>";
|
print "<td class=\"prefValue\"><input dojoType=\"dijit.form.ValidationTextBox\" required=\"1\" name=\"example_value\" value=\"$value\"></td></tr>";
|
||||||
|
|
||||||
print "</table>";
|
print "</table>";
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue