danielebarchiesi@0
|
1 <?php
|
danielebarchiesi@0
|
2
|
danielebarchiesi@0
|
3 /**
|
danielebarchiesi@0
|
4 * @file
|
danielebarchiesi@0
|
5 * Wysiwyg dialog page handling functions.
|
danielebarchiesi@0
|
6 */
|
danielebarchiesi@0
|
7
|
danielebarchiesi@0
|
8 /**
|
danielebarchiesi@0
|
9 * Page callback; Outputs a dialog page for a wysiwyg plugin.
|
danielebarchiesi@0
|
10 *
|
danielebarchiesi@0
|
11 * A Wysiwyg dialog is a bare minimum, simple HTML page; presented in a
|
danielebarchiesi@0
|
12 * modal/popup window, triggered via JavaScript.
|
danielebarchiesi@0
|
13 *
|
danielebarchiesi@0
|
14 * However, Drupal core does not support such a concept, at all.
|
danielebarchiesi@0
|
15 * Insanity happens on two separate layers:
|
danielebarchiesi@0
|
16 * - All HTML pages go through the default delivery callback of
|
danielebarchiesi@0
|
17 * drupal_deliver_html_page(), which calls into drupal_render_page(), which
|
danielebarchiesi@0
|
18 * in turn *unconditionally* invokes hook_page_build() implementations. Thus,
|
danielebarchiesi@0
|
19 * block_page_build() and similar implementations add the entirety of their
|
danielebarchiesi@0
|
20 * page regions and blocks to our simple dialog page.
|
danielebarchiesi@0
|
21 * Obviously, we don't want that.
|
danielebarchiesi@0
|
22 * - There is a nice default 'page' theme template implementation, which
|
danielebarchiesi@0
|
23 * performs all the heavy-lifting that is required for outputting a sane HTML
|
danielebarchiesi@0
|
24 * page through preprocess and process functions. The theme system does not
|
danielebarchiesi@0
|
25 * support to "inherit" preprocess and process hooks to alternative
|
danielebarchiesi@0
|
26 * implementations. Even a very basic HTML page requires almost all of that.
|
danielebarchiesi@0
|
27 * However, the default page template (normally overridden by a theme)
|
danielebarchiesi@0
|
28 * contains too many regions and usually also huge a header and footer.
|
danielebarchiesi@0
|
29 * Obviously, we don't want that.
|
danielebarchiesi@0
|
30 *
|
danielebarchiesi@0
|
31 * The poor workaround would be to follow the Overlay module's implementation in
|
danielebarchiesi@0
|
32 * core: override the theme, build everything, and after doing all of that,
|
danielebarchiesi@0
|
33 * strip away what isn't needed. Obviously, we don't want that.
|
danielebarchiesi@0
|
34 *
|
danielebarchiesi@0
|
35 * Instead, we bend Drupal to sane rules:
|
danielebarchiesi@0
|
36 * - This page callback returns the actual main content.
|
danielebarchiesi@0
|
37 * - wysiwyg_menu() defines a custom delivery callback that replaces
|
danielebarchiesi@0
|
38 * drupal_deliver_html_page(), just because we need to replace
|
danielebarchiesi@0
|
39 * drupal_render_page().
|
danielebarchiesi@0
|
40 * - Our replacement for drupal_render_page() builds a $page that does not use
|
danielebarchiesi@0
|
41 * #type 'page' but #type 'wysiwyg_dialog_page' instead.
|
danielebarchiesi@0
|
42 * - #type 'wysiwyg_dialog_page' is defined like #type 'page' in
|
danielebarchiesi@0
|
43 * system_element_info(), but is required, because there's no way to inherit
|
danielebarchiesi@0
|
44 * a theme definition but override the page template file to be used.
|
danielebarchiesi@0
|
45 * - As a consequence, #type 'wysiwyg_dialog_page' uses
|
danielebarchiesi@0
|
46 * #theme 'wysiwyg_dialog_page', for which we have to implement stub
|
danielebarchiesi@0
|
47 * preprocess and process callbacks in order to call into the ones for
|
danielebarchiesi@0
|
48 * #theme 'page'.
|
danielebarchiesi@0
|
49 *
|
danielebarchiesi@0
|
50 * As a result we get:
|
danielebarchiesi@0
|
51 * - A HTML response.
|
danielebarchiesi@0
|
52 * - A HTML page wrapped into html.tpl.php.
|
danielebarchiesi@0
|
53 * - A page title, title prefix/suffix, messages, help, etc.pp.
|
danielebarchiesi@0
|
54 * - A simple page without regions and blocks (neither built nor rendered).
|
danielebarchiesi@0
|
55 *
|
danielebarchiesi@0
|
56 * @see wysiwyg_menu()
|
danielebarchiesi@0
|
57 * @see wysiwyg_deliver_dialog_page
|
danielebarchiesi@0
|
58 * @see wysiwyg_render_dialog_page()
|
danielebarchiesi@0
|
59 * @see wysiwyg_element_info()
|
danielebarchiesi@0
|
60 * @see wysiwyg_theme()
|
danielebarchiesi@0
|
61 * @see template_preprocess_wysiwyg_dialog_page()
|
danielebarchiesi@0
|
62 * @see template_process_wysiwyg_dialog_page()
|
danielebarchiesi@0
|
63 *
|
danielebarchiesi@0
|
64 * @see drupal_deliver_page()
|
danielebarchiesi@0
|
65 * @see drupal_deliver_html_page()
|
danielebarchiesi@0
|
66 * @see drupal_render_page()
|
danielebarchiesi@0
|
67 * @see system_element_info()
|
danielebarchiesi@0
|
68 * @see drupal_common_theme()
|
danielebarchiesi@0
|
69 * @see template_preprocess_page()
|
danielebarchiesi@0
|
70 * @see template_process_page()
|
danielebarchiesi@0
|
71 */
|
danielebarchiesi@0
|
72 function wysiwyg_dialog($plugin, $instance) {
|
danielebarchiesi@0
|
73 $plugins = wysiwyg_get_all_plugins();
|
danielebarchiesi@0
|
74 if (!isset($plugins[$plugin])) {
|
danielebarchiesi@0
|
75 return drupal_access_denied();
|
danielebarchiesi@0
|
76 }
|
danielebarchiesi@0
|
77 $callback = $plugin . '_wysiwyg_dialog';
|
danielebarchiesi@0
|
78 if (!function_exists($callback)) {
|
danielebarchiesi@0
|
79 return drupal_not_found();
|
danielebarchiesi@0
|
80 }
|
danielebarchiesi@0
|
81
|
danielebarchiesi@0
|
82 // Suppress admin menu.
|
danielebarchiesi@0
|
83 module_invoke('admin_menu', 'suppress');
|
danielebarchiesi@0
|
84 // Add editor instance id to Drupal.settings.
|
danielebarchiesi@0
|
85 $settings = array(
|
danielebarchiesi@0
|
86 'plugin' => $plugin,
|
danielebarchiesi@0
|
87 'instance' => $instance,
|
danielebarchiesi@0
|
88 );
|
danielebarchiesi@0
|
89 drupal_add_js(array('wysiwyg' => $settings), 'setting');
|
danielebarchiesi@0
|
90
|
danielebarchiesi@0
|
91 $build = $callback($instance);
|
danielebarchiesi@0
|
92 if (!is_array($build)) {
|
danielebarchiesi@0
|
93 $build = array('#markup' => $build);
|
danielebarchiesi@0
|
94 }
|
danielebarchiesi@0
|
95 $build += array(
|
danielebarchiesi@0
|
96 '#instance' => $instance,
|
danielebarchiesi@0
|
97 '#plugin' => $plugin,
|
danielebarchiesi@0
|
98 );
|
danielebarchiesi@0
|
99 return $build;
|
danielebarchiesi@0
|
100 }
|
danielebarchiesi@0
|
101
|
danielebarchiesi@0
|
102 /**
|
danielebarchiesi@0
|
103 * @see drupal_deliver_html_page()
|
danielebarchiesi@0
|
104 */
|
danielebarchiesi@0
|
105 function wysiwyg_deliver_dialog_page($page_callback_result) {
|
danielebarchiesi@0
|
106 // Menu status constants are integers; page content is a string or array.
|
danielebarchiesi@0
|
107 if (is_int($page_callback_result)) {
|
danielebarchiesi@0
|
108 return drupal_deliver_html_page($page_callback_result);
|
danielebarchiesi@0
|
109 }
|
danielebarchiesi@0
|
110
|
danielebarchiesi@0
|
111 // Emit the correct charset HTTP header, but not if the page callback
|
danielebarchiesi@0
|
112 // result is NULL, since that likely indicates that it printed something
|
danielebarchiesi@0
|
113 // in which case, no further headers may be sent, and not if code running
|
danielebarchiesi@0
|
114 // for this page request has already set the content type header.
|
danielebarchiesi@0
|
115 if (isset($page_callback_result) && is_null(drupal_get_http_header('Content-Type'))) {
|
danielebarchiesi@0
|
116 drupal_add_http_header('Content-Type', 'text/html; charset=utf-8');
|
danielebarchiesi@0
|
117 }
|
danielebarchiesi@0
|
118
|
danielebarchiesi@0
|
119 // Send appropriate HTTP-Header for browsers and search engines.
|
danielebarchiesi@0
|
120 global $language;
|
danielebarchiesi@0
|
121 drupal_add_http_header('Content-Language', $language->language);
|
danielebarchiesi@0
|
122
|
danielebarchiesi@0
|
123 if (isset($page_callback_result)) {
|
danielebarchiesi@0
|
124 // Print anything besides a menu constant, assuming it's not NULL or
|
danielebarchiesi@0
|
125 // undefined.
|
danielebarchiesi@0
|
126 print wysiwyg_render_dialog_page($page_callback_result);
|
danielebarchiesi@0
|
127 }
|
danielebarchiesi@0
|
128
|
danielebarchiesi@0
|
129 // Perform end-of-request tasks.
|
danielebarchiesi@0
|
130 drupal_page_footer();
|
danielebarchiesi@0
|
131 }
|
danielebarchiesi@0
|
132
|
danielebarchiesi@0
|
133 /**
|
danielebarchiesi@0
|
134 * @see drupal_render_page()
|
danielebarchiesi@0
|
135 */
|
danielebarchiesi@0
|
136 function wysiwyg_render_dialog_page($page) {
|
danielebarchiesi@0
|
137 $main_content_display = &drupal_static('system_main_content_added', FALSE);
|
danielebarchiesi@0
|
138
|
danielebarchiesi@0
|
139 // Allow menu callbacks to return strings or arbitrary arrays to render.
|
danielebarchiesi@0
|
140 // If the array returned is not of #type page directly, we need to fill
|
danielebarchiesi@0
|
141 // in the page with defaults.
|
danielebarchiesi@0
|
142 if (is_string($page) || (is_array($page) && (!isset($page['#type']) || ($page['#type'] != 'page')))) {
|
danielebarchiesi@0
|
143 drupal_set_page_content($page);
|
danielebarchiesi@0
|
144 $page = element_info('wysiwyg_dialog_page');
|
danielebarchiesi@0
|
145 }
|
danielebarchiesi@0
|
146
|
danielebarchiesi@0
|
147 // Modules alter the $page as needed. Blocks are populated into regions like
|
danielebarchiesi@0
|
148 // 'sidebar_first', 'footer', etc.
|
danielebarchiesi@0
|
149 drupal_alter(array('wysiwyg_dialog_page', 'page'), $page);
|
danielebarchiesi@0
|
150
|
danielebarchiesi@0
|
151 // If no module has taken care of the main content, add it to the page now.
|
danielebarchiesi@0
|
152 // This allows the site to still be usable even if no modules that
|
danielebarchiesi@0
|
153 // control page regions (for example, the Block module) are enabled.
|
danielebarchiesi@0
|
154 if (!$main_content_display) {
|
danielebarchiesi@0
|
155 $page['content']['system_main'] = drupal_set_page_content();
|
danielebarchiesi@0
|
156 }
|
danielebarchiesi@0
|
157
|
danielebarchiesi@0
|
158 return drupal_render($page);
|
danielebarchiesi@0
|
159 }
|
danielebarchiesi@0
|
160
|
danielebarchiesi@0
|
161 /**
|
danielebarchiesi@0
|
162 * Template preprocess function for theme_wysiwyg_dialog_page().
|
danielebarchiesi@0
|
163 *
|
danielebarchiesi@0
|
164 * @see wysiwyg_dialog()
|
danielebarchiesi@0
|
165 * @see wysiwyg-dialog-page.tpl.php
|
danielebarchiesi@0
|
166 * @see template_preprocess_page()
|
danielebarchiesi@0
|
167 */
|
danielebarchiesi@0
|
168 function template_preprocess_wysiwyg_dialog_page(&$variables) {
|
danielebarchiesi@0
|
169 template_preprocess_page($variables);
|
danielebarchiesi@0
|
170 }
|
danielebarchiesi@0
|
171
|
danielebarchiesi@0
|
172
|
danielebarchiesi@0
|
173 /**
|
danielebarchiesi@0
|
174 * Template process function for theme_wysiwyg_dialog_page().
|
danielebarchiesi@0
|
175 *
|
danielebarchiesi@0
|
176 * @see wysiwyg_dialog()
|
danielebarchiesi@0
|
177 * @see wysiwyg-dialog-page.tpl.php
|
danielebarchiesi@0
|
178 * @see template_process_page()
|
danielebarchiesi@0
|
179 */
|
danielebarchiesi@0
|
180 function template_process_wysiwyg_dialog_page(&$variables) {
|
danielebarchiesi@0
|
181 template_process_page($variables);
|
danielebarchiesi@0
|
182 }
|
danielebarchiesi@0
|
183
|