From 0e99d37a18cf81b549b8fc7e8948e9bd338deaad Mon Sep 17 00:00:00 2001 From: thomascube Date: Mon, 1 Jun 2009 15:35:53 +0000 Subject: Use event system on the client to handle ajax callbacks --- program/include/rcube_json_output.php | 13 +++++++++++-- program/include/rcube_template.php | 4 +++- program/js/app.js | 6 ++++++ program/js/common.js | 8 ++++---- 4 files changed, 24 insertions(+), 7 deletions(-) (limited to 'program') diff --git a/program/include/rcube_json_output.php b/program/include/rcube_json_output.php index 2fbf9c0c5..cedc6bf6c 100644 --- a/program/include/rcube_json_output.php +++ b/program/include/rcube_json_output.php @@ -33,6 +33,7 @@ class rcube_json_output private $env = array(); private $texts = array(); private $commands = array(); + private $callbacks = array(); private $message = null; public $type = 'js'; @@ -122,7 +123,12 @@ class rcube_json_output */ public function command() { - $this->commands[] = func_get_args(); + $cmd = func_get_args(); + + if (strpos($cmd[0], 'plugin.') === 0) + $this->callbacks[] = $cmd; + else + $this->commands[] = $cmd; } @@ -227,8 +233,11 @@ class rcube_json_output if (!empty($this->texts)) $response['texts'] = $this->texts; - // send response code + // send function calls $response['exec'] = $this->get_js_commands() . $add; + + if (!empty($this->callbacks)) + $response['callbacks'] = $this->callbacks; echo json_serialize($response); } diff --git a/program/include/rcube_template.php b/program/include/rcube_template.php index 42b642a25..a358d0cfe 100755 --- a/program/include/rcube_template.php +++ b/program/include/rcube_template.php @@ -201,7 +201,9 @@ class rcube_template extends rcube_html_page */ public function command() { - $this->js_commands[] = func_get_args(); + $cmd = func_get_args(); + if (strpos($cmd[0], 'plugin.') === false) + $this->js_commands[] = $cmd; } diff --git a/program/js/app.js b/program/js/app.js index 5e323e229..4f12e808a 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -3923,6 +3923,12 @@ function rcube_webmail() console.log(response.exec); eval(response.exec); } + + // execute callback functions of plugins + if (response.callbacks && response.callbacks.length) { + for (var i=0; i < response.callbacks.length; i++) + this.triggerEvent(response.callbacks[i][0], response.callbacks[i][1]); + } // process the response data according to the sent action switch (response.action) { diff --git a/program/js/common.js b/program/js/common.js index 25b654612..1fd10c255 100644 --- a/program/js/common.js +++ b/program/js/common.js @@ -288,8 +288,8 @@ triggerEvent: function(evt, e) { var ret, h; if (typeof e == 'undefined') - e = {}; - if (typeof e == 'object') + e = this; + else if (typeof e == 'object') e.event = evt; if (this._events && this._events[evt] && !this._event_exec) { @@ -297,9 +297,9 @@ triggerEvent: function(evt, e) for (var i=0; i < this._events[evt].length; i++) { if ((h = this._events[evt][i])) { if (typeof h.func == 'function') - ret = h.func.call ? h.func.call(h.obj, this, e) : h.func(this, e); + ret = h.func.call ? h.func.call(h.obj, e) : h.func(e); else if (typeof h.obj[h.func] == 'function') - ret = h.obj[h.func](this, e); + ret = h.obj[h.func](e); // cancel event execution if (typeof ret != 'undefined' && !ret) -- cgit v1.2.3