danielebarchiesi@0
|
1 <?php
|
danielebarchiesi@0
|
2 /*
|
danielebarchiesi@0
|
3 * Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
|
danielebarchiesi@0
|
4 * For licensing, see LICENSE.html or http://ckeditor.com/license
|
danielebarchiesi@0
|
5 */
|
danielebarchiesi@0
|
6
|
danielebarchiesi@0
|
7 /**
|
danielebarchiesi@0
|
8 * \brief CKEditor class that can be used to create editor
|
danielebarchiesi@0
|
9 * instances in PHP pages on server side.
|
danielebarchiesi@0
|
10 * @see http://ckeditor.com
|
danielebarchiesi@0
|
11 *
|
danielebarchiesi@0
|
12 * Sample usage:
|
danielebarchiesi@0
|
13 * @code
|
danielebarchiesi@0
|
14 * $CKEditor = new CKEditor();
|
danielebarchiesi@0
|
15 * $CKEditor->editor("editor1", "<p>Initial value.</p>");
|
danielebarchiesi@0
|
16 * @endcode
|
danielebarchiesi@0
|
17 */
|
danielebarchiesi@0
|
18 class CKEditor
|
danielebarchiesi@0
|
19 {
|
danielebarchiesi@0
|
20 /**
|
danielebarchiesi@0
|
21 * The version of %CKEditor.
|
danielebarchiesi@0
|
22 * \private
|
danielebarchiesi@0
|
23 */
|
danielebarchiesi@0
|
24 var $version = '3.6.6';
|
danielebarchiesi@0
|
25 /**
|
danielebarchiesi@0
|
26 * A constant string unique for each release of %CKEditor.
|
danielebarchiesi@0
|
27 * \private
|
danielebarchiesi@0
|
28 */
|
danielebarchiesi@0
|
29 var $_timestamp = 'D03G5XL';
|
danielebarchiesi@0
|
30
|
danielebarchiesi@0
|
31 /**
|
danielebarchiesi@0
|
32 * URL to the %CKEditor installation directory (absolute or relative to document root).
|
danielebarchiesi@0
|
33 * If not set, CKEditor will try to guess it's path.
|
danielebarchiesi@0
|
34 *
|
danielebarchiesi@0
|
35 * Example usage:
|
danielebarchiesi@0
|
36 * @code
|
danielebarchiesi@0
|
37 * $CKEditor->basePath = '/ckeditor/';
|
danielebarchiesi@0
|
38 * @endcode
|
danielebarchiesi@0
|
39 */
|
danielebarchiesi@0
|
40 var $basePath;
|
danielebarchiesi@0
|
41 /**
|
danielebarchiesi@0
|
42 * An array that holds the global %CKEditor configuration.
|
danielebarchiesi@0
|
43 * For the list of available options, see http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.config.html
|
danielebarchiesi@0
|
44 *
|
danielebarchiesi@0
|
45 * Example usage:
|
danielebarchiesi@0
|
46 * @code
|
danielebarchiesi@0
|
47 * $CKEditor->config['height'] = 400;
|
danielebarchiesi@0
|
48 * // Use @@ at the beggining of a string to ouput it without surrounding quotes.
|
danielebarchiesi@0
|
49 * $CKEditor->config['width'] = '@@screen.width * 0.8';
|
danielebarchiesi@0
|
50 * @endcode
|
danielebarchiesi@0
|
51 */
|
danielebarchiesi@0
|
52 var $config = array();
|
danielebarchiesi@0
|
53 /**
|
danielebarchiesi@0
|
54 * A boolean variable indicating whether CKEditor has been initialized.
|
danielebarchiesi@0
|
55 * Set it to true only if you have already included
|
danielebarchiesi@0
|
56 * <script> tag loading ckeditor.js in your website.
|
danielebarchiesi@0
|
57 */
|
danielebarchiesi@0
|
58 var $initialized = false;
|
danielebarchiesi@0
|
59 /**
|
danielebarchiesi@0
|
60 * Boolean variable indicating whether created code should be printed out or returned by a function.
|
danielebarchiesi@0
|
61 *
|
danielebarchiesi@0
|
62 * Example 1: get the code creating %CKEditor instance and print it on a page with the "echo" function.
|
danielebarchiesi@0
|
63 * @code
|
danielebarchiesi@0
|
64 * $CKEditor = new CKEditor();
|
danielebarchiesi@0
|
65 * $CKEditor->returnOutput = true;
|
danielebarchiesi@0
|
66 * $code = $CKEditor->editor("editor1", "<p>Initial value.</p>");
|
danielebarchiesi@0
|
67 * echo "<p>Editor 1:</p>";
|
danielebarchiesi@0
|
68 * echo $code;
|
danielebarchiesi@0
|
69 * @endcode
|
danielebarchiesi@0
|
70 */
|
danielebarchiesi@0
|
71 var $returnOutput = false;
|
danielebarchiesi@0
|
72 /**
|
danielebarchiesi@0
|
73 * An array with textarea attributes.
|
danielebarchiesi@0
|
74 *
|
danielebarchiesi@0
|
75 * When %CKEditor is created with the editor() method, a HTML <textarea> element is created,
|
danielebarchiesi@0
|
76 * it will be displayed to anyone with JavaScript disabled or with incompatible browser.
|
danielebarchiesi@0
|
77 */
|
danielebarchiesi@0
|
78 var $textareaAttributes = array( "rows" => 8, "cols" => 60 );
|
danielebarchiesi@0
|
79 /**
|
danielebarchiesi@0
|
80 * A string indicating the creation date of %CKEditor.
|
danielebarchiesi@0
|
81 * Do not change it unless you want to force browsers to not use previously cached version of %CKEditor.
|
danielebarchiesi@0
|
82 */
|
danielebarchiesi@0
|
83 var $timestamp = "D03G5XL";
|
danielebarchiesi@0
|
84 /**
|
danielebarchiesi@0
|
85 * An array that holds event listeners.
|
danielebarchiesi@0
|
86 * \private
|
danielebarchiesi@0
|
87 */
|
danielebarchiesi@0
|
88 var $_events = array();
|
danielebarchiesi@0
|
89 /**
|
danielebarchiesi@0
|
90 * An array that holds global event listeners.
|
danielebarchiesi@0
|
91 * \private
|
danielebarchiesi@0
|
92 */
|
danielebarchiesi@0
|
93 var $_globalEvents = array();
|
danielebarchiesi@0
|
94
|
danielebarchiesi@0
|
95 /**
|
danielebarchiesi@0
|
96 * Main Constructor.
|
danielebarchiesi@0
|
97 *
|
danielebarchiesi@0
|
98 * @param $basePath (string) URL to the %CKEditor installation directory (optional).
|
danielebarchiesi@0
|
99 */
|
danielebarchiesi@0
|
100 function CKEditor($basePath = null) {
|
danielebarchiesi@0
|
101 if (!empty($basePath)) {
|
danielebarchiesi@0
|
102 $this->basePath = $basePath;
|
danielebarchiesi@0
|
103 }
|
danielebarchiesi@0
|
104 }
|
danielebarchiesi@0
|
105
|
danielebarchiesi@0
|
106 /**
|
danielebarchiesi@0
|
107 * Creates a %CKEditor instance.
|
danielebarchiesi@0
|
108 * In incompatible browsers %CKEditor will downgrade to plain HTML <textarea> element.
|
danielebarchiesi@0
|
109 *
|
danielebarchiesi@0
|
110 * @param $name (string) Name of the %CKEditor instance (this will be also the "name" attribute of textarea element).
|
danielebarchiesi@0
|
111 * @param $value (string) Initial value (optional).
|
danielebarchiesi@0
|
112 * @param $config (array) The specific configurations to apply to this editor instance (optional).
|
danielebarchiesi@0
|
113 * @param $events (array) Event listeners for this editor instance (optional).
|
danielebarchiesi@0
|
114 *
|
danielebarchiesi@0
|
115 * Example usage:
|
danielebarchiesi@0
|
116 * @code
|
danielebarchiesi@0
|
117 * $CKEditor = new CKEditor();
|
danielebarchiesi@0
|
118 * $CKEditor->editor("field1", "<p>Initial value.</p>");
|
danielebarchiesi@0
|
119 * @endcode
|
danielebarchiesi@0
|
120 *
|
danielebarchiesi@0
|
121 * Advanced example:
|
danielebarchiesi@0
|
122 * @code
|
danielebarchiesi@0
|
123 * $CKEditor = new CKEditor();
|
danielebarchiesi@0
|
124 * $config = array();
|
danielebarchiesi@0
|
125 * $config['toolbar'] = array(
|
danielebarchiesi@0
|
126 * array( 'Source', '-', 'Bold', 'Italic', 'Underline', 'Strike' ),
|
danielebarchiesi@0
|
127 * array( 'Image', 'Link', 'Unlink', 'Anchor' )
|
danielebarchiesi@0
|
128 * );
|
danielebarchiesi@0
|
129 * $events['instanceReady'] = 'function (ev) {
|
danielebarchiesi@0
|
130 * alert("Loaded: " + ev.editor.name);
|
danielebarchiesi@0
|
131 * }';
|
danielebarchiesi@0
|
132 * $CKEditor->editor("field1", "<p>Initial value.</p>", $config, $events);
|
danielebarchiesi@0
|
133 * @endcode
|
danielebarchiesi@0
|
134 */
|
danielebarchiesi@0
|
135 function editor($name, $value = "", $config = array(), $events = array())
|
danielebarchiesi@0
|
136 {
|
danielebarchiesi@0
|
137 $attr = "";
|
danielebarchiesi@0
|
138 foreach ($this->textareaAttributes as $key => $val) {
|
danielebarchiesi@0
|
139 $attr.= " " . $key . '="' . str_replace('"', '"', $val) . '"';
|
danielebarchiesi@0
|
140 }
|
danielebarchiesi@0
|
141 $out = "<textarea name=\"" . $name . "\"" . $attr . ">" . htmlspecialchars($value) . "</textarea>\n";
|
danielebarchiesi@0
|
142 if (!$this->initialized) {
|
danielebarchiesi@0
|
143 $out .= $this->init();
|
danielebarchiesi@0
|
144 }
|
danielebarchiesi@0
|
145
|
danielebarchiesi@0
|
146 $_config = $this->configSettings($config, $events);
|
danielebarchiesi@0
|
147
|
danielebarchiesi@0
|
148 $js = $this->returnGlobalEvents();
|
danielebarchiesi@0
|
149 if (!empty($_config))
|
danielebarchiesi@0
|
150 $js .= "CKEDITOR.replace('".$name."', ".$this->jsEncode($_config).");";
|
danielebarchiesi@0
|
151 else
|
danielebarchiesi@0
|
152 $js .= "CKEDITOR.replace('".$name."');";
|
danielebarchiesi@0
|
153
|
danielebarchiesi@0
|
154 $out .= $this->script($js);
|
danielebarchiesi@0
|
155
|
danielebarchiesi@0
|
156 if (!$this->returnOutput) {
|
danielebarchiesi@0
|
157 print $out;
|
danielebarchiesi@0
|
158 $out = "";
|
danielebarchiesi@0
|
159 }
|
danielebarchiesi@0
|
160
|
danielebarchiesi@0
|
161 return $out;
|
danielebarchiesi@0
|
162 }
|
danielebarchiesi@0
|
163
|
danielebarchiesi@0
|
164 /**
|
danielebarchiesi@0
|
165 * Replaces a <textarea> with a %CKEditor instance.
|
danielebarchiesi@0
|
166 *
|
danielebarchiesi@0
|
167 * @param $id (string) The id or name of textarea element.
|
danielebarchiesi@0
|
168 * @param $config (array) The specific configurations to apply to this editor instance (optional).
|
danielebarchiesi@0
|
169 * @param $events (array) Event listeners for this editor instance (optional).
|
danielebarchiesi@0
|
170 *
|
danielebarchiesi@0
|
171 * Example 1: adding %CKEditor to <textarea name="article"></textarea> element:
|
danielebarchiesi@0
|
172 * @code
|
danielebarchiesi@0
|
173 * $CKEditor = new CKEditor();
|
danielebarchiesi@0
|
174 * $CKEditor->replace("article");
|
danielebarchiesi@0
|
175 * @endcode
|
danielebarchiesi@0
|
176 */
|
danielebarchiesi@0
|
177 function replace($id, $config = array(), $events = array())
|
danielebarchiesi@0
|
178 {
|
danielebarchiesi@0
|
179 $out = "";
|
danielebarchiesi@0
|
180 if (!$this->initialized) {
|
danielebarchiesi@0
|
181 $out .= $this->init();
|
danielebarchiesi@0
|
182 }
|
danielebarchiesi@0
|
183
|
danielebarchiesi@0
|
184 $_config = $this->configSettings($config, $events);
|
danielebarchiesi@0
|
185
|
danielebarchiesi@0
|
186 $js = $this->returnGlobalEvents();
|
danielebarchiesi@0
|
187 if (!empty($_config)) {
|
danielebarchiesi@0
|
188 $js .= "CKEDITOR.replace('".$id."', ".$this->jsEncode($_config).");";
|
danielebarchiesi@0
|
189 }
|
danielebarchiesi@0
|
190 else {
|
danielebarchiesi@0
|
191 $js .= "CKEDITOR.replace('".$id."');";
|
danielebarchiesi@0
|
192 }
|
danielebarchiesi@0
|
193 $out .= $this->script($js);
|
danielebarchiesi@0
|
194
|
danielebarchiesi@0
|
195 if (!$this->returnOutput) {
|
danielebarchiesi@0
|
196 print $out;
|
danielebarchiesi@0
|
197 $out = "";
|
danielebarchiesi@0
|
198 }
|
danielebarchiesi@0
|
199
|
danielebarchiesi@0
|
200 return $out;
|
danielebarchiesi@0
|
201 }
|
danielebarchiesi@0
|
202
|
danielebarchiesi@0
|
203 /**
|
danielebarchiesi@0
|
204 * Replace all <textarea> elements available in the document with editor instances.
|
danielebarchiesi@0
|
205 *
|
danielebarchiesi@0
|
206 * @param $className (string) If set, replace all textareas with class className in the page.
|
danielebarchiesi@0
|
207 *
|
danielebarchiesi@0
|
208 * Example 1: replace all <textarea> elements in the page.
|
danielebarchiesi@0
|
209 * @code
|
danielebarchiesi@0
|
210 * $CKEditor = new CKEditor();
|
danielebarchiesi@0
|
211 * $CKEditor->replaceAll();
|
danielebarchiesi@0
|
212 * @endcode
|
danielebarchiesi@0
|
213 *
|
danielebarchiesi@0
|
214 * Example 2: replace all <textarea class="myClassName"> elements in the page.
|
danielebarchiesi@0
|
215 * @code
|
danielebarchiesi@0
|
216 * $CKEditor = new CKEditor();
|
danielebarchiesi@0
|
217 * $CKEditor->replaceAll( 'myClassName' );
|
danielebarchiesi@0
|
218 * @endcode
|
danielebarchiesi@0
|
219 */
|
danielebarchiesi@0
|
220 function replaceAll($className = null)
|
danielebarchiesi@0
|
221 {
|
danielebarchiesi@0
|
222 $out = "";
|
danielebarchiesi@0
|
223 if (!$this->initialized) {
|
danielebarchiesi@0
|
224 $out .= $this->init();
|
danielebarchiesi@0
|
225 }
|
danielebarchiesi@0
|
226
|
danielebarchiesi@0
|
227 $_config = $this->configSettings();
|
danielebarchiesi@0
|
228
|
danielebarchiesi@0
|
229 $js = $this->returnGlobalEvents();
|
danielebarchiesi@0
|
230 if (empty($_config)) {
|
danielebarchiesi@0
|
231 if (empty($className)) {
|
danielebarchiesi@0
|
232 $js .= "CKEDITOR.replaceAll();";
|
danielebarchiesi@0
|
233 }
|
danielebarchiesi@0
|
234 else {
|
danielebarchiesi@0
|
235 $js .= "CKEDITOR.replaceAll('".$className."');";
|
danielebarchiesi@0
|
236 }
|
danielebarchiesi@0
|
237 }
|
danielebarchiesi@0
|
238 else {
|
danielebarchiesi@0
|
239 $classDetection = "";
|
danielebarchiesi@0
|
240 $js .= "CKEDITOR.replaceAll( function(textarea, config) {\n";
|
danielebarchiesi@0
|
241 if (!empty($className)) {
|
danielebarchiesi@0
|
242 $js .= " var classRegex = new RegExp('(?:^| )' + '". $className ."' + '(?:$| )');\n";
|
danielebarchiesi@0
|
243 $js .= " if (!classRegex.test(textarea.className))\n";
|
danielebarchiesi@0
|
244 $js .= " return false;\n";
|
danielebarchiesi@0
|
245 }
|
danielebarchiesi@0
|
246 $js .= " CKEDITOR.tools.extend(config, ". $this->jsEncode($_config) .", true);";
|
danielebarchiesi@0
|
247 $js .= "} );";
|
danielebarchiesi@0
|
248
|
danielebarchiesi@0
|
249 }
|
danielebarchiesi@0
|
250
|
danielebarchiesi@0
|
251 $out .= $this->script($js);
|
danielebarchiesi@0
|
252
|
danielebarchiesi@0
|
253 if (!$this->returnOutput) {
|
danielebarchiesi@0
|
254 print $out;
|
danielebarchiesi@0
|
255 $out = "";
|
danielebarchiesi@0
|
256 }
|
danielebarchiesi@0
|
257
|
danielebarchiesi@0
|
258 return $out;
|
danielebarchiesi@0
|
259 }
|
danielebarchiesi@0
|
260
|
danielebarchiesi@0
|
261 /**
|
danielebarchiesi@0
|
262 * Adds event listener.
|
danielebarchiesi@0
|
263 * Events are fired by %CKEditor in various situations.
|
danielebarchiesi@0
|
264 *
|
danielebarchiesi@0
|
265 * @param $event (string) Event name.
|
danielebarchiesi@0
|
266 * @param $javascriptCode (string) Javascript anonymous function or function name.
|
danielebarchiesi@0
|
267 *
|
danielebarchiesi@0
|
268 * Example usage:
|
danielebarchiesi@0
|
269 * @code
|
danielebarchiesi@0
|
270 * $CKEditor->addEventHandler('instanceReady', 'function (ev) {
|
danielebarchiesi@0
|
271 * alert("Loaded: " + ev.editor.name);
|
danielebarchiesi@0
|
272 * }');
|
danielebarchiesi@0
|
273 * @endcode
|
danielebarchiesi@0
|
274 */
|
danielebarchiesi@0
|
275 function addEventHandler($event, $javascriptCode)
|
danielebarchiesi@0
|
276 {
|
danielebarchiesi@0
|
277 if (!isset($this->_events[$event])) {
|
danielebarchiesi@0
|
278 $this->_events[$event] = array();
|
danielebarchiesi@0
|
279 }
|
danielebarchiesi@0
|
280 // Avoid duplicates.
|
danielebarchiesi@0
|
281 if (!in_array($javascriptCode, $this->_events[$event])) {
|
danielebarchiesi@0
|
282 $this->_events[$event][] = $javascriptCode;
|
danielebarchiesi@0
|
283 }
|
danielebarchiesi@0
|
284 }
|
danielebarchiesi@0
|
285
|
danielebarchiesi@0
|
286 /**
|
danielebarchiesi@0
|
287 * Clear registered event handlers.
|
danielebarchiesi@0
|
288 * Note: this function will have no effect on already created editor instances.
|
danielebarchiesi@0
|
289 *
|
danielebarchiesi@0
|
290 * @param $event (string) Event name, if not set all event handlers will be removed (optional).
|
danielebarchiesi@0
|
291 */
|
danielebarchiesi@0
|
292 function clearEventHandlers($event = null)
|
danielebarchiesi@0
|
293 {
|
danielebarchiesi@0
|
294 if (!empty($event)) {
|
danielebarchiesi@0
|
295 $this->_events[$event] = array();
|
danielebarchiesi@0
|
296 }
|
danielebarchiesi@0
|
297 else {
|
danielebarchiesi@0
|
298 $this->_events = array();
|
danielebarchiesi@0
|
299 }
|
danielebarchiesi@0
|
300 }
|
danielebarchiesi@0
|
301
|
danielebarchiesi@0
|
302 /**
|
danielebarchiesi@0
|
303 * Adds global event listener.
|
danielebarchiesi@0
|
304 *
|
danielebarchiesi@0
|
305 * @param $event (string) Event name.
|
danielebarchiesi@0
|
306 * @param $javascriptCode (string) Javascript anonymous function or function name.
|
danielebarchiesi@0
|
307 *
|
danielebarchiesi@0
|
308 * Example usage:
|
danielebarchiesi@0
|
309 * @code
|
danielebarchiesi@0
|
310 * $CKEditor->addGlobalEventHandler('dialogDefinition', 'function (ev) {
|
danielebarchiesi@0
|
311 * alert("Loading dialog: " + ev.data.name);
|
danielebarchiesi@0
|
312 * }');
|
danielebarchiesi@0
|
313 * @endcode
|
danielebarchiesi@0
|
314 */
|
danielebarchiesi@0
|
315 function addGlobalEventHandler($event, $javascriptCode)
|
danielebarchiesi@0
|
316 {
|
danielebarchiesi@0
|
317 if (!isset($this->_globalEvents[$event])) {
|
danielebarchiesi@0
|
318 $this->_globalEvents[$event] = array();
|
danielebarchiesi@0
|
319 }
|
danielebarchiesi@0
|
320 // Avoid duplicates.
|
danielebarchiesi@0
|
321 if (!in_array($javascriptCode, $this->_globalEvents[$event])) {
|
danielebarchiesi@0
|
322 $this->_globalEvents[$event][] = $javascriptCode;
|
danielebarchiesi@0
|
323 }
|
danielebarchiesi@0
|
324 }
|
danielebarchiesi@0
|
325
|
danielebarchiesi@0
|
326 /**
|
danielebarchiesi@0
|
327 * Clear registered global event handlers.
|
danielebarchiesi@0
|
328 * Note: this function will have no effect if the event handler has been already printed/returned.
|
danielebarchiesi@0
|
329 *
|
danielebarchiesi@0
|
330 * @param $event (string) Event name, if not set all event handlers will be removed (optional).
|
danielebarchiesi@0
|
331 */
|
danielebarchiesi@0
|
332 function clearGlobalEventHandlers($event = null)
|
danielebarchiesi@0
|
333 {
|
danielebarchiesi@0
|
334 if (!empty($event)) {
|
danielebarchiesi@0
|
335 $this->_globalEvents[$event] = array();
|
danielebarchiesi@0
|
336 }
|
danielebarchiesi@0
|
337 else {
|
danielebarchiesi@0
|
338 $this->_globalEvents = array();
|
danielebarchiesi@0
|
339 }
|
danielebarchiesi@0
|
340 }
|
danielebarchiesi@0
|
341
|
danielebarchiesi@0
|
342 /**
|
danielebarchiesi@0
|
343 * Prints javascript code.
|
danielebarchiesi@0
|
344 * \private
|
danielebarchiesi@0
|
345 *
|
danielebarchiesi@0
|
346 * @param string $js
|
danielebarchiesi@0
|
347 */
|
danielebarchiesi@0
|
348 function script($js)
|
danielebarchiesi@0
|
349 {
|
danielebarchiesi@0
|
350 $out = "<script type=\"text/javascript\">";
|
danielebarchiesi@0
|
351 $out .= "//<![CDATA[\n";
|
danielebarchiesi@0
|
352 $out .= $js;
|
danielebarchiesi@0
|
353 $out .= "\n//]]>";
|
danielebarchiesi@0
|
354 $out .= "</script>\n";
|
danielebarchiesi@0
|
355
|
danielebarchiesi@0
|
356 return $out;
|
danielebarchiesi@0
|
357 }
|
danielebarchiesi@0
|
358
|
danielebarchiesi@0
|
359 /**
|
danielebarchiesi@0
|
360 * Returns the configuration array (global and instance specific settings are merged into one array).
|
danielebarchiesi@0
|
361 * \private
|
danielebarchiesi@0
|
362 *
|
danielebarchiesi@0
|
363 * @param $config (array) The specific configurations to apply to editor instance.
|
danielebarchiesi@0
|
364 * @param $events (array) Event listeners for editor instance.
|
danielebarchiesi@0
|
365 */
|
danielebarchiesi@0
|
366 function configSettings($config = array(), $events = array())
|
danielebarchiesi@0
|
367 {
|
danielebarchiesi@0
|
368 $_config = $this->config;
|
danielebarchiesi@0
|
369 $_events = $this->_events;
|
danielebarchiesi@0
|
370
|
danielebarchiesi@0
|
371 if (is_array($config) && !empty($config)) {
|
danielebarchiesi@0
|
372 $_config = array_merge($_config, $config);
|
danielebarchiesi@0
|
373 }
|
danielebarchiesi@0
|
374
|
danielebarchiesi@0
|
375 if (is_array($events) && !empty($events)) {
|
danielebarchiesi@0
|
376 foreach ($events as $eventName => $code) {
|
danielebarchiesi@0
|
377 if (!isset($_events[$eventName])) {
|
danielebarchiesi@0
|
378 $_events[$eventName] = array();
|
danielebarchiesi@0
|
379 }
|
danielebarchiesi@0
|
380 if (!in_array($code, $_events[$eventName])) {
|
danielebarchiesi@0
|
381 $_events[$eventName][] = $code;
|
danielebarchiesi@0
|
382 }
|
danielebarchiesi@0
|
383 }
|
danielebarchiesi@0
|
384 }
|
danielebarchiesi@0
|
385
|
danielebarchiesi@0
|
386 if (!empty($_events)) {
|
danielebarchiesi@0
|
387 foreach($_events as $eventName => $handlers) {
|
danielebarchiesi@0
|
388 if (empty($handlers)) {
|
danielebarchiesi@0
|
389 continue;
|
danielebarchiesi@0
|
390 }
|
danielebarchiesi@0
|
391 else if (count($handlers) == 1) {
|
danielebarchiesi@0
|
392 $_config['on'][$eventName] = '@@'.$handlers[0];
|
danielebarchiesi@0
|
393 }
|
danielebarchiesi@0
|
394 else {
|
danielebarchiesi@0
|
395 $_config['on'][$eventName] = '@@function (ev){';
|
danielebarchiesi@0
|
396 foreach ($handlers as $handler => $code) {
|
danielebarchiesi@0
|
397 $_config['on'][$eventName] .= '('.$code.')(ev);';
|
danielebarchiesi@0
|
398 }
|
danielebarchiesi@0
|
399 $_config['on'][$eventName] .= '}';
|
danielebarchiesi@0
|
400 }
|
danielebarchiesi@0
|
401 }
|
danielebarchiesi@0
|
402 }
|
danielebarchiesi@0
|
403
|
danielebarchiesi@0
|
404 return $_config;
|
danielebarchiesi@0
|
405 }
|
danielebarchiesi@0
|
406
|
danielebarchiesi@0
|
407 /**
|
danielebarchiesi@0
|
408 * Return global event handlers.
|
danielebarchiesi@0
|
409 * \private
|
danielebarchiesi@0
|
410 */
|
danielebarchiesi@0
|
411 function returnGlobalEvents()
|
danielebarchiesi@0
|
412 {
|
danielebarchiesi@0
|
413 static $returnedEvents;
|
danielebarchiesi@0
|
414 $out = "";
|
danielebarchiesi@0
|
415
|
danielebarchiesi@0
|
416 if (!isset($returnedEvents)) {
|
danielebarchiesi@0
|
417 $returnedEvents = array();
|
danielebarchiesi@0
|
418 }
|
danielebarchiesi@0
|
419
|
danielebarchiesi@0
|
420 if (!empty($this->_globalEvents)) {
|
danielebarchiesi@0
|
421 foreach ($this->_globalEvents as $eventName => $handlers) {
|
danielebarchiesi@0
|
422 foreach ($handlers as $handler => $code) {
|
danielebarchiesi@0
|
423 if (!isset($returnedEvents[$eventName])) {
|
danielebarchiesi@0
|
424 $returnedEvents[$eventName] = array();
|
danielebarchiesi@0
|
425 }
|
danielebarchiesi@0
|
426 // Return only new events
|
danielebarchiesi@0
|
427 if (!in_array($code, $returnedEvents[$eventName])) {
|
danielebarchiesi@0
|
428 $out .= ($code ? "\n" : "") . "CKEDITOR.on('". $eventName ."', $code);";
|
danielebarchiesi@0
|
429 $returnedEvents[$eventName][] = $code;
|
danielebarchiesi@0
|
430 }
|
danielebarchiesi@0
|
431 }
|
danielebarchiesi@0
|
432 }
|
danielebarchiesi@0
|
433 }
|
danielebarchiesi@0
|
434
|
danielebarchiesi@0
|
435 return $out;
|
danielebarchiesi@0
|
436 }
|
danielebarchiesi@0
|
437
|
danielebarchiesi@0
|
438 /**
|
danielebarchiesi@0
|
439 * Initializes CKEditor (executed only once).
|
danielebarchiesi@0
|
440 * \private
|
danielebarchiesi@0
|
441 */
|
danielebarchiesi@0
|
442 function init()
|
danielebarchiesi@0
|
443 {
|
danielebarchiesi@0
|
444 static $initComplete;
|
danielebarchiesi@0
|
445 $out = "";
|
danielebarchiesi@0
|
446
|
danielebarchiesi@0
|
447 if (!empty($initComplete)) {
|
danielebarchiesi@0
|
448 return "";
|
danielebarchiesi@0
|
449 }
|
danielebarchiesi@0
|
450
|
danielebarchiesi@0
|
451 if ($this->initialized) {
|
danielebarchiesi@0
|
452 $initComplete = true;
|
danielebarchiesi@0
|
453 return "";
|
danielebarchiesi@0
|
454 }
|
danielebarchiesi@0
|
455
|
danielebarchiesi@0
|
456 $args = "";
|
danielebarchiesi@0
|
457 $ckeditorPath = $this->ckeditorPath();
|
danielebarchiesi@0
|
458
|
danielebarchiesi@0
|
459 if (!empty($this->timestamp) && $this->timestamp != "%"."TIMESTAMP%") {
|
danielebarchiesi@0
|
460 $args = '?t=' . $this->timestamp;
|
danielebarchiesi@0
|
461 }
|
danielebarchiesi@0
|
462
|
danielebarchiesi@0
|
463 // Skip relative paths...
|
danielebarchiesi@0
|
464 if (strpos($ckeditorPath, '..') !== 0) {
|
danielebarchiesi@0
|
465 $out .= $this->script("window.CKEDITOR_BASEPATH='". $ckeditorPath ."';");
|
danielebarchiesi@0
|
466 }
|
danielebarchiesi@0
|
467
|
danielebarchiesi@0
|
468 $out .= "<script type=\"text/javascript\" src=\"" . $ckeditorPath . 'ckeditor.js' . $args . "\"></script>\n";
|
danielebarchiesi@0
|
469
|
danielebarchiesi@0
|
470 $extraCode = "";
|
danielebarchiesi@0
|
471 if ($this->timestamp != $this->_timestamp) {
|
danielebarchiesi@0
|
472 $extraCode .= ($extraCode ? "\n" : "") . "CKEDITOR.timestamp = '". $this->timestamp ."';";
|
danielebarchiesi@0
|
473 }
|
danielebarchiesi@0
|
474 if ($extraCode) {
|
danielebarchiesi@0
|
475 $out .= $this->script($extraCode);
|
danielebarchiesi@0
|
476 }
|
danielebarchiesi@0
|
477
|
danielebarchiesi@0
|
478 $initComplete = $this->initialized = true;
|
danielebarchiesi@0
|
479
|
danielebarchiesi@0
|
480 return $out;
|
danielebarchiesi@0
|
481 }
|
danielebarchiesi@0
|
482
|
danielebarchiesi@0
|
483 /**
|
danielebarchiesi@0
|
484 * Return path to ckeditor.js.
|
danielebarchiesi@0
|
485 * \private
|
danielebarchiesi@0
|
486 */
|
danielebarchiesi@0
|
487 function ckeditorPath()
|
danielebarchiesi@0
|
488 {
|
danielebarchiesi@0
|
489 if (!empty($this->basePath)) {
|
danielebarchiesi@0
|
490 return $this->basePath;
|
danielebarchiesi@0
|
491 }
|
danielebarchiesi@0
|
492
|
danielebarchiesi@0
|
493 /**
|
danielebarchiesi@0
|
494 * The absolute pathname of the currently executing script.
|
danielebarchiesi@0
|
495 * Note: If a script is executed with the CLI, as a relative path, such as file.php or ../file.php,
|
danielebarchiesi@0
|
496 * $_SERVER['SCRIPT_FILENAME'] will contain the relative path specified by the user.
|
danielebarchiesi@0
|
497 */
|
danielebarchiesi@0
|
498 if (isset($_SERVER['SCRIPT_FILENAME'])) {
|
danielebarchiesi@0
|
499 $realPath = dirname($_SERVER['SCRIPT_FILENAME']);
|
danielebarchiesi@0
|
500 }
|
danielebarchiesi@0
|
501 else {
|
danielebarchiesi@0
|
502 /**
|
danielebarchiesi@0
|
503 * realpath - Returns canonicalized absolute pathname
|
danielebarchiesi@0
|
504 */
|
danielebarchiesi@0
|
505 $realPath = realpath( './' ) ;
|
danielebarchiesi@0
|
506 }
|
danielebarchiesi@0
|
507
|
danielebarchiesi@0
|
508 /**
|
danielebarchiesi@0
|
509 * The filename of the currently executing script, relative to the document root.
|
danielebarchiesi@0
|
510 * For instance, $_SERVER['PHP_SELF'] in a script at the address http://example.com/test.php/foo.bar
|
danielebarchiesi@0
|
511 * would be /test.php/foo.bar.
|
danielebarchiesi@0
|
512 */
|
danielebarchiesi@0
|
513 $selfPath = dirname($_SERVER['PHP_SELF']);
|
danielebarchiesi@0
|
514 $file = str_replace("\\", "/", __FILE__);
|
danielebarchiesi@0
|
515
|
danielebarchiesi@0
|
516 if (!$selfPath || !$realPath || !$file) {
|
danielebarchiesi@0
|
517 return "/ckeditor/";
|
danielebarchiesi@0
|
518 }
|
danielebarchiesi@0
|
519
|
danielebarchiesi@0
|
520 $documentRoot = substr($realPath, 0, strlen($realPath) - strlen($selfPath));
|
danielebarchiesi@0
|
521 $fileUrl = substr($file, strlen($documentRoot));
|
danielebarchiesi@0
|
522 $ckeditorUrl = str_replace("ckeditor_php4.php", "", $fileUrl);
|
danielebarchiesi@0
|
523
|
danielebarchiesi@0
|
524 return $ckeditorUrl;
|
danielebarchiesi@0
|
525 }
|
danielebarchiesi@0
|
526
|
danielebarchiesi@0
|
527 /**
|
danielebarchiesi@0
|
528 * This little function provides a basic JSON support.
|
danielebarchiesi@0
|
529 * \private
|
danielebarchiesi@0
|
530 *
|
danielebarchiesi@0
|
531 * @param mixed $val
|
danielebarchiesi@0
|
532 * @return string
|
danielebarchiesi@0
|
533 */
|
danielebarchiesi@0
|
534 function jsEncode($val)
|
danielebarchiesi@0
|
535 {
|
danielebarchiesi@0
|
536 if (is_null($val)) {
|
danielebarchiesi@0
|
537 return 'null';
|
danielebarchiesi@0
|
538 }
|
danielebarchiesi@0
|
539 if (is_bool($val)) {
|
danielebarchiesi@0
|
540 return $val ? 'true' : 'false';
|
danielebarchiesi@0
|
541 }
|
danielebarchiesi@0
|
542 if (is_int($val)) {
|
danielebarchiesi@0
|
543 return $val;
|
danielebarchiesi@0
|
544 }
|
danielebarchiesi@0
|
545 if (is_float($val)) {
|
danielebarchiesi@0
|
546 return str_replace(',', '.', $val);
|
danielebarchiesi@0
|
547 }
|
danielebarchiesi@0
|
548 if (is_array($val) || is_object($val)) {
|
danielebarchiesi@0
|
549 if (is_array($val) && (array_keys($val) === range(0,count($val)-1))) {
|
danielebarchiesi@0
|
550 return '[' . implode(',', array_map(array($this, 'jsEncode'), $val)) . ']';
|
danielebarchiesi@0
|
551 }
|
danielebarchiesi@0
|
552 $temp = array();
|
danielebarchiesi@0
|
553 foreach ($val as $k => $v){
|
danielebarchiesi@0
|
554 $temp[] = $this->jsEncode("{$k}") . ':' . $this->jsEncode($v);
|
danielebarchiesi@0
|
555 }
|
danielebarchiesi@0
|
556 return '{' . implode(',', $temp) . '}';
|
danielebarchiesi@0
|
557 }
|
danielebarchiesi@0
|
558 // String otherwise
|
danielebarchiesi@0
|
559 if (strpos($val, '@@') === 0)
|
danielebarchiesi@0
|
560 return substr($val, 2);
|
danielebarchiesi@0
|
561 if (strtoupper(substr($val, 0, 9)) == 'CKEDITOR.')
|
danielebarchiesi@0
|
562 return $val;
|
danielebarchiesi@0
|
563
|
danielebarchiesi@0
|
564 return '"' . str_replace(array("\\", "/", "\n", "\t", "\r", "\x08", "\x0c", '"'), array('\\\\', '\\/', '\\n', '\\t', '\\r', '\\b', '\\f', '\"'), $val) . '"';
|
danielebarchiesi@0
|
565 }
|
danielebarchiesi@0
|
566 }
|