From 60226a75d8e4a3ee9504da6eab6d8f329bb32e7b Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Tue, 27 Nov 2012 12:13:33 +0100 Subject: Separate the very application-specific output classes from the Roundcube framework; add autoloader for rmail* classes --- program/include/rcmail_output_json.php | 258 +++++++++++++++++++++++++++++++++ 1 file changed, 258 insertions(+) create mode 100644 program/include/rcmail_output_json.php (limited to 'program/include/rcmail_output_json.php') diff --git a/program/include/rcmail_output_json.php b/program/include/rcmail_output_json.php new file mode 100644 index 000000000..22edce9bd --- /dev/null +++ b/program/include/rcmail_output_json.php @@ -0,0 +1,258 @@ + | + | Author: Aleksander Machniak | + +-----------------------------------------------------------------------+ +*/ + + +/** + * View class to produce JSON responses + * + * @package Core + * @subpackage View + */ +class rcmail_output_json extends rcmail_output +{ + protected $texts = array(); + protected $commands = array(); + protected $callbacks = array(); + protected $message = null; + + public $type = 'js'; + public $ajax_call = true; + + + /** + * Issue command to set page title + * + * @param string $title New page title + */ + public function set_pagetitle($title) + { + if ($this->config->get('devel_mode') && !empty($_SESSION['username'])) + $name = $_SESSION['username']; + else + $name = $this->config->get('product_name'); + + $this->command('set_pagetitle', empty($name) ? $title : $name.' :: '.$title); + } + + + /** + * Register a template object handler + * + * @param string $obj Object name + * @param string $func Function name to call + */ + public function add_handler($obj, $func) + { + // ignore + } + + + /** + * Register a list of template object handlers + * + * @param array $arr Hash array with object=>handler pairs + */ + public function add_handlers($arr) + { + // ignore + } + + + /** + * Call a client method + * + * @param string Method to call + * @param ... Additional arguments + */ + public function command() + { + $cmd = func_get_args(); + + if (strpos($cmd[0], 'plugin.') === 0) + $this->callbacks[] = $cmd; + else + $this->commands[] = $cmd; + } + + + /** + * Add a localized label to the client environment + */ + public function add_label() + { + $args = func_get_args(); + if (count($args) == 1 && is_array($args[0])) + $args = $args[0]; + + foreach ($args as $name) { + $this->texts[$name] = $this->app->gettext($name); + } + } + + + /** + * Invoke display_message command + * + * @param string $message Message to display + * @param string $type Message type [notice|confirm|error] + * @param array $vars Key-value pairs to be replaced in localized text + * @param boolean $override Override last set message + * @param int $timeout Message displaying time in seconds + * @uses self::command() + */ + public function show_message($message, $type='notice', $vars=null, $override=true, $timeout=0) + { + if ($override || !$this->message) { + if ($this->app->text_exists($message)) { + if (!empty($vars)) { + $vars = array_map(array('rcmail', 'Q'), $vars); + } + $msgtext = $this->app->gettext(array('name' => $message, 'vars' => $vars)); + } + else + $msgtext = $message; + + $this->message = $message; + $this->command('display_message', $msgtext, $type, $timeout * 1000); + } + } + + + /** + * Delete all stored env variables and commands + */ + public function reset() + { + parent::reset(); + $this->texts = array(); + $this->commands = array(); + } + + + /** + * Redirect to a certain url + * + * @param mixed $p Either a string with the action or url parameters as key-value pairs + * @param int $delay Delay in seconds + * @see rcmail::url() + */ + public function redirect($p = array(), $delay = 1) + { + $location = $this->app->url($p); + $this->remote_response(sprintf("window.setTimeout(function(){ %s.redirect('%s',true); }, %d);", + self::JS_OBJECT_NAME, $location, $delay)); + exit; + } + + + /** + * Send an AJAX response to the client. + */ + public function send() + { + $this->remote_response(); + exit; + } + + + /** + * Show error page and terminate script execution + * + * @param int $code Error code + * @param string $message Error message + */ + public function raise_error($code, $message) + { + $this->show_message("Application Error ($code): $message", 'error'); + $this->remote_response(); + exit; + } + + + /** + * Send an AJAX response with executable JS code + * + * @param string $add Additional JS code + * @param boolean True if output buffer should be flushed + * @return void + * @deprecated + */ + protected function remote_response($add='') + { + static $s_header_sent = false; + + if (!$s_header_sent) { + $s_header_sent = true; + $this->nocacheing_headers(); + header('Content-Type: text/plain; charset=' . $this->get_charset()); + } + + // unset default env vars + unset($this->env['task'], $this->env['action'], $this->env['comm_path']); + + $rcmail = rcmail::get_instance(); + $response['action'] = $rcmail->action; + + if ($unlock = rcube_utils::get_input_value('_unlock', rcube_utils::INPUT_GPC)) { + $response['unlock'] = $unlock; + } + + if (!empty($this->env)) + $response['env'] = $this->env; + + if (!empty($this->texts)) + $response['texts'] = $this->texts; + + // send function calls + $response['exec'] = $this->get_js_commands() . $add; + + if (!empty($this->callbacks)) + $response['callbacks'] = $this->callbacks; + + echo self::json_serialize($response); + } + + + /** + * Return executable javascript code for all registered commands + * + * @return string $out + */ + protected function get_js_commands() + { + $out = ''; + + foreach ($this->commands as $i => $args) { + $method = array_shift($args); + foreach ($args as $i => $arg) { + $args[$i] = self::json_serialize($arg); + } + + $out .= sprintf( + "this.%s(%s);\n", + preg_replace('/^parent\./', '', $method), + implode(',', $args) + ); + } + + return $out; + } +} -- cgit v1.2.3