source: subversion/trunk/roundcubemail/program/include/rcube_json_output.php @ 4091

Last change on this file since 4091 was 4091, checked in by alec, 3 years ago
  • Fix bug in rcube_plugin::local_skin_path()
  • Property svn:keywords set to Id
File size: 6.8 KB
Line 
1<?php
2
3/*
4 +-----------------------------------------------------------------------+
5 | program/include/rcube_json_output.php                                 |
6 |                                                                       |
7 | This file is part of the Roundcube Webmail client                     |
8 | Copyright (C) 2008-2010, Roundcube Dev. - Switzerland                 |
9 | Licensed under the GNU GPL                                            |
10 |                                                                       |
11 | PURPOSE:                                                              |
12 |   Class to handle HTML page output using a skin template.             |
13 |   Extends rcube_html_page class from rcube_shared.inc                 |
14 |                                                                       |
15 +-----------------------------------------------------------------------+
16 | Author: Thomas Bruederli <roundcube@gmail.com>                        |
17 +-----------------------------------------------------------------------+
18
19 $Id$
20
21*/
22
23
24/**
25 * View class to produce JSON responses
26 *
27 * @package View
28 */
29class rcube_json_output
30{
31    /**
32     * Stores configuration object.
33     *
34     * @var rcube_config
35     */
36    private $config;
37    private $charset = RCMAIL_CHARSET;
38    private $texts = array();
39    private $commands = array();
40    private $callbacks = array();
41    private $message = null;
42
43    public $browser;
44    public $env = array();
45    public $type = 'js';
46    public $ajax_call = true;
47
48
49    /**
50     * Constructor
51     */
52    public function __construct($task=null)
53    {
54        $this->config  = rcmail::get_instance()->config;
55        $this->browser = new rcube_browser();
56    }
57
58
59    /**
60     * Set environment variable
61     *
62     * @param string $name Property name
63     * @param mixed $value Property value
64     */
65    public function set_env($name, $value)
66    {
67        $this->env[$name] = $value;
68    }
69
70
71    /**
72     * Issue command to set page title
73     *
74     * @param string $title New page title
75     */
76    public function set_pagetitle($title)
77    {
78        $name = $this->config->get('product_name');
79        $this->command('set_pagetitle', empty($name) ? $title : $name.' :: '.$title);
80    }
81
82
83    /**
84     * @ignore
85     */
86    function set_charset($charset)
87    {
88        // ignore: $this->charset = $charset;
89    }
90
91
92    /**
93     * Get charset for output
94     *
95     * @return string Output charset
96     */
97    function get_charset()
98    {
99        return $this->charset;
100    }
101
102
103    /**
104     * Register a template object handler
105     *
106     * @param  string $obj Object name
107     * @param  string $func Function name to call
108     * @return void
109     */
110    public function add_handler($obj, $func)
111    {
112        // ignore
113    }
114
115
116    /**
117     * Register a list of template object handlers
118     *
119     * @param  array $arr Hash array with object=>handler pairs
120     * @return void
121     */
122    public function add_handlers($arr)
123    {
124        // ignore
125    }
126
127
128    /**
129     * Call a client method
130     *
131     * @param string Method to call
132     * @param ... Additional arguments
133     */
134    public function command()
135    {
136        $cmd = func_get_args();
137
138        if (strpos($cmd[0], 'plugin.') === 0)
139          $this->callbacks[] = $cmd;
140        else
141          $this->commands[] = $cmd;
142    }
143
144
145    /**
146     * Add a localized label to the client environment
147     */
148    public function add_label()
149    {
150        $args = func_get_args();
151        if (count($args) == 1 && is_array($args[0]))
152            $args = $args[0];
153
154        foreach ($args as $name) {
155            $this->texts[$name] = rcube_label($name);
156        }
157    }
158
159
160    /**
161     * Invoke display_message command
162     *
163     * @param string  $message  Message to display
164     * @param string  $type     Message type [notice|confirm|error]
165     * @param array   $vars     Key-value pairs to be replaced in localized text
166     * @param boolean $override Override last set message
167     * @uses self::command()
168     */
169    public function show_message($message, $type='notice', $vars=null, $override=true)
170    {
171        if ($override || !$this->message) {
172            $this->message = $message;
173            $this->command(
174                'display_message',
175                rcube_label(array('name' => $message, 'vars' => $vars)),
176                $type
177            );
178        }
179    }
180
181
182    /**
183     * Delete all stored env variables and commands
184     */
185    public function reset()
186    {
187        $this->env = array();
188        $this->texts = array();
189        $this->commands = array();
190    }
191
192
193    /**
194     * Redirect to a certain url
195     *
196     * @param mixed $p Either a string with the action or url parameters as key-value pairs
197     * @param int $delay Delay in seconds
198     * @see rcmail::url()
199     */
200    public function redirect($p = array(), $delay = 1)
201    {
202        $location = rcmail::get_instance()->url($p);
203        $this->remote_response("window.setTimeout(\"location.href='{$location}'\", $delay);");
204        exit;
205    }
206
207
208    /**
209     * Send an AJAX response to the client.
210     */
211    public function send()
212    {
213        $this->remote_response();
214        exit;
215    }
216
217
218    /**
219     * Send an AJAX response with executable JS code
220     *
221     * @param  string  $add Additional JS code
222     * @param  boolean True if output buffer should be flushed
223     * @return void
224     * @deprecated
225     */
226    public function remote_response($add='')
227    {
228        static $s_header_sent = false;
229
230        if (!$s_header_sent) {
231            $s_header_sent = true;
232            send_nocacheing_headers();
233            header('Content-Type: text/plain; charset=' . $this->get_charset());
234        }
235
236        // unset default env vars
237        unset($this->env['task'], $this->env['action'], $this->env['comm_path']);
238
239        $rcmail = rcmail::get_instance();
240        $response = array('action' => $rcmail->action, 'unlock' => get_input_value('_unlock', RCUBE_INPUT_GPC));
241
242        if (!empty($this->env))
243            $response['env'] = $this->env;
244
245        if (!empty($this->texts))
246            $response['texts'] = $this->texts;
247
248        // send function calls
249        $response['exec'] = $this->get_js_commands() . $add;
250
251        if (!empty($this->callbacks))
252            $response['callbacks'] = $this->callbacks;
253
254        echo json_serialize($response);
255    }
256
257
258    /**
259     * Return executable javascript code for all registered commands
260     *
261     * @return string $out
262     */
263    private function get_js_commands()
264    {
265        $out = '';
266
267        foreach ($this->commands as $i => $args) {
268            $method = array_shift($args);
269            foreach ($args as $i => $arg) {
270                $args[$i] = json_serialize($arg);
271            }
272
273            $out .= sprintf(
274                "this.%s(%s);\n",
275                preg_replace('/^parent\./', '', $method),
276                implode(',', $args)
277            );
278        }
279
280        return $out;
281    }
282}
Note: See TracBrowser for help on using the repository browser.