danielebarchiesi@0
|
1 <?php
|
danielebarchiesi@0
|
2
|
danielebarchiesi@0
|
3 /**
|
danielebarchiesi@0
|
4 * @file
|
danielebarchiesi@0
|
5 * Integrate Wysiwyg editors into Drupal.
|
danielebarchiesi@0
|
6 */
|
danielebarchiesi@0
|
7
|
danielebarchiesi@0
|
8 /**
|
danielebarchiesi@0
|
9 * Form builder for Wysiwyg profile form.
|
danielebarchiesi@0
|
10 */
|
danielebarchiesi@0
|
11 function wysiwyg_profile_form($form, &$form_state, $profile) {
|
danielebarchiesi@0
|
12 // Merge in defaults.
|
danielebarchiesi@0
|
13 $profile = (array) $profile;
|
danielebarchiesi@0
|
14 $profile += array(
|
danielebarchiesi@0
|
15 'format' => '',
|
danielebarchiesi@0
|
16 'editor' => '',
|
danielebarchiesi@0
|
17 );
|
danielebarchiesi@0
|
18 if (empty($profile['settings'])) {
|
danielebarchiesi@0
|
19 $profile['settings'] = array();
|
danielebarchiesi@0
|
20 }
|
danielebarchiesi@0
|
21 $profile['settings'] += array(
|
danielebarchiesi@0
|
22 'default' => TRUE,
|
danielebarchiesi@0
|
23 'user_choose' => FALSE,
|
danielebarchiesi@0
|
24 'show_toggle' => TRUE,
|
danielebarchiesi@0
|
25 'theme' => 'advanced',
|
danielebarchiesi@0
|
26 'language' => 'en',
|
danielebarchiesi@0
|
27 'access' => 1,
|
danielebarchiesi@0
|
28 'access_pages' => "node/*\nuser/*\ncomment/*",
|
danielebarchiesi@0
|
29 'buttons' => array(),
|
danielebarchiesi@0
|
30 'toolbar_loc' => 'top',
|
danielebarchiesi@0
|
31 'toolbar_align' => 'left',
|
danielebarchiesi@0
|
32 'path_loc' => 'bottom',
|
danielebarchiesi@0
|
33 'resizing' => TRUE,
|
danielebarchiesi@0
|
34 // Also available, but buggy in TinyMCE 2.x: blockquote,code,dt,dd,samp.
|
danielebarchiesi@0
|
35 'block_formats' => 'p,address,pre,h2,h3,h4,h5,h6,div',
|
danielebarchiesi@0
|
36 'verify_html' => TRUE,
|
danielebarchiesi@0
|
37 'preformatted' => FALSE,
|
danielebarchiesi@0
|
38 'convert_fonts_to_spans' => TRUE,
|
danielebarchiesi@0
|
39 'remove_linebreaks' => TRUE,
|
danielebarchiesi@0
|
40 'apply_source_formatting' => FALSE,
|
danielebarchiesi@0
|
41 'paste_auto_cleanup_on_paste' => FALSE,
|
danielebarchiesi@0
|
42 'css_setting' => 'theme',
|
danielebarchiesi@0
|
43 'css_path' => NULL,
|
danielebarchiesi@0
|
44 'css_classes' => NULL,
|
danielebarchiesi@0
|
45 );
|
danielebarchiesi@0
|
46 $profile = (object) $profile;
|
danielebarchiesi@0
|
47
|
danielebarchiesi@0
|
48 $formats = filter_formats();
|
danielebarchiesi@0
|
49 $editor = wysiwyg_get_editor($profile->editor);
|
danielebarchiesi@0
|
50 drupal_set_title(t('%editor profile for %format', array('%editor' => $editor['title'], '%format' => $formats[$profile->format]->name)), PASS_THROUGH);
|
danielebarchiesi@0
|
51
|
danielebarchiesi@0
|
52 $form['format'] = array('#type' => 'value', '#value' => $profile->format);
|
danielebarchiesi@0
|
53 $form['input_format'] = array('#type' => 'value', '#value' => $formats[$profile->format]->name);
|
danielebarchiesi@0
|
54 $form['editor'] = array('#type' => 'value', '#value' => $profile->editor);
|
danielebarchiesi@0
|
55
|
danielebarchiesi@0
|
56 $form['basic'] = array(
|
danielebarchiesi@0
|
57 '#type' => 'fieldset',
|
danielebarchiesi@0
|
58 '#title' => t('Basic setup'),
|
danielebarchiesi@0
|
59 '#collapsible' => TRUE,
|
danielebarchiesi@0
|
60 '#collapsed' => TRUE,
|
danielebarchiesi@0
|
61 );
|
danielebarchiesi@0
|
62
|
danielebarchiesi@0
|
63 $form['basic']['default'] = array(
|
danielebarchiesi@0
|
64 '#type' => 'checkbox',
|
danielebarchiesi@0
|
65 '#title' => t('Enabled by default'),
|
danielebarchiesi@0
|
66 '#default_value' => $profile->settings['default'],
|
danielebarchiesi@0
|
67 '#return_value' => 1,
|
danielebarchiesi@0
|
68 '#description' => t('The default editor state for users having access to this profile. Users are able to override this state if the next option is enabled.'),
|
danielebarchiesi@0
|
69 );
|
danielebarchiesi@0
|
70
|
danielebarchiesi@0
|
71 $form['basic']['user_choose'] = array(
|
danielebarchiesi@0
|
72 '#type' => 'checkbox',
|
danielebarchiesi@0
|
73 '#title' => t('Allow users to choose default'),
|
danielebarchiesi@0
|
74 '#default_value' => $profile->settings['user_choose'],
|
danielebarchiesi@0
|
75 '#return_value' => 1,
|
danielebarchiesi@0
|
76 '#description' => t('If allowed, users will be able to choose their own editor default state in their user account settings.'),
|
danielebarchiesi@0
|
77 );
|
danielebarchiesi@0
|
78
|
danielebarchiesi@0
|
79 $form['basic']['show_toggle'] = array(
|
danielebarchiesi@0
|
80 '#type' => 'checkbox',
|
danielebarchiesi@0
|
81 '#title' => t('Show <em>enable/disable rich text</em> toggle link'),
|
danielebarchiesi@0
|
82 '#default_value' => $profile->settings['show_toggle'],
|
danielebarchiesi@0
|
83 '#return_value' => 1,
|
danielebarchiesi@0
|
84 '#description' => t('Whether or not to show the <em>enable/disable rich text</em> toggle link below a textarea. If disabled, the user setting or global default is used (see above).'),
|
danielebarchiesi@0
|
85 );
|
danielebarchiesi@0
|
86
|
danielebarchiesi@0
|
87 $form['basic']['theme'] = array(
|
danielebarchiesi@0
|
88 '#type' => 'hidden',
|
danielebarchiesi@0
|
89 '#value' => $profile->settings['theme'],
|
danielebarchiesi@0
|
90 );
|
danielebarchiesi@0
|
91
|
danielebarchiesi@0
|
92 $form['basic']['language'] = array(
|
danielebarchiesi@0
|
93 '#type' => 'select',
|
danielebarchiesi@0
|
94 '#title' => t('Interface language'),
|
danielebarchiesi@0
|
95 '#default_value' => $profile->settings['language'],
|
danielebarchiesi@0
|
96 );
|
danielebarchiesi@0
|
97 // @see _locale_prepare_predefined_list()
|
danielebarchiesi@0
|
98 require_once DRUPAL_ROOT . '/includes/iso.inc';
|
danielebarchiesi@0
|
99 $predefined = _locale_get_predefined_list();
|
danielebarchiesi@0
|
100 foreach ($predefined as $key => $value) {
|
danielebarchiesi@0
|
101 // Include native name in output, if possible
|
danielebarchiesi@0
|
102 if (count($value) > 1) {
|
danielebarchiesi@0
|
103 $tname = t($value[0]);
|
danielebarchiesi@0
|
104 $predefined[$key] = ($tname == $value[1]) ? $tname : "$tname ($value[1])";
|
danielebarchiesi@0
|
105 }
|
danielebarchiesi@0
|
106 else {
|
danielebarchiesi@0
|
107 $predefined[$key] = t($value[0]);
|
danielebarchiesi@0
|
108 }
|
danielebarchiesi@0
|
109 }
|
danielebarchiesi@0
|
110 asort($predefined);
|
danielebarchiesi@0
|
111 $form['basic']['language']['#options'] = $predefined;
|
danielebarchiesi@0
|
112
|
danielebarchiesi@0
|
113 $form['buttons'] = array(
|
danielebarchiesi@0
|
114 '#type' => 'fieldset',
|
danielebarchiesi@0
|
115 '#title' => t('Buttons and plugins'),
|
danielebarchiesi@0
|
116 '#collapsible' => TRUE,
|
danielebarchiesi@0
|
117 '#collapsed' => TRUE,
|
danielebarchiesi@0
|
118 '#tree' => TRUE,
|
danielebarchiesi@0
|
119 '#theme' => 'wysiwyg_admin_button_table',
|
danielebarchiesi@0
|
120 );
|
danielebarchiesi@0
|
121
|
danielebarchiesi@0
|
122 $plugins = wysiwyg_get_plugins($profile->editor);
|
danielebarchiesi@0
|
123 // Generate the button list.
|
danielebarchiesi@0
|
124 foreach ($plugins as $name => $meta) {
|
danielebarchiesi@0
|
125 if (isset($meta['buttons']) && is_array($meta['buttons'])) {
|
danielebarchiesi@0
|
126 foreach ($meta['buttons'] as $button => $title) {
|
danielebarchiesi@0
|
127 $icon = '';
|
danielebarchiesi@0
|
128 if (!empty($meta['path'])) {
|
danielebarchiesi@0
|
129 // @todo Button icon locations are different in editors, editor versions,
|
danielebarchiesi@0
|
130 // and contrib/custom plugins (like Image Assist, f.e.).
|
danielebarchiesi@0
|
131 $img_src = $meta['path'] . "/images/$name.gif";
|
danielebarchiesi@0
|
132 // Handle plugins that have more than one button.
|
danielebarchiesi@0
|
133 if (!file_exists($img_src)) {
|
danielebarchiesi@0
|
134 $img_src = $meta['path'] . "/images/$button.gif";
|
danielebarchiesi@0
|
135 }
|
danielebarchiesi@0
|
136 $icon = file_exists($img_src) ? '<img src="' . base_path() . $img_src . '" title="' . $button . '" style="border: 1px solid grey; vertical-align: middle;" />' : '';
|
danielebarchiesi@0
|
137 }
|
danielebarchiesi@0
|
138 $title = (!empty($icon) ? $icon . ' ' . check_plain($title) : check_plain($title));
|
danielebarchiesi@0
|
139 $form['buttons'][$name][$button] = array(
|
danielebarchiesi@0
|
140 '#type' => 'checkbox',
|
danielebarchiesi@0
|
141 '#title' => $title,
|
danielebarchiesi@0
|
142 '#default_value' => !empty($profile->settings['buttons'][$name][$button]) ? $profile->settings['buttons'][$name][$button] : FALSE,
|
danielebarchiesi@0
|
143 '#description' => isset($meta['url']) ? l($meta['url'], $meta['url']) : NULL,
|
danielebarchiesi@0
|
144 );
|
danielebarchiesi@0
|
145 }
|
danielebarchiesi@0
|
146 }
|
danielebarchiesi@0
|
147 elseif (isset($meta['extensions']) && is_array($meta['extensions'])) {
|
danielebarchiesi@0
|
148 foreach ($meta['extensions'] as $extension => $title) {
|
danielebarchiesi@0
|
149 $form['buttons'][$name][$extension] = array(
|
danielebarchiesi@0
|
150 '#type' => 'checkbox',
|
danielebarchiesi@0
|
151 '#title' => check_plain($title),
|
danielebarchiesi@0
|
152 '#default_value' => !empty($profile->settings['buttons'][$name][$extension]) ? $profile->settings['buttons'][$name][$extension] : FALSE,
|
danielebarchiesi@0
|
153 '#description' => isset($meta['url']) ? l($meta['url'], $meta['url']) : NULL,
|
danielebarchiesi@0
|
154 );
|
danielebarchiesi@0
|
155 }
|
danielebarchiesi@0
|
156 }
|
danielebarchiesi@0
|
157 }
|
danielebarchiesi@0
|
158
|
danielebarchiesi@0
|
159 $form['appearance'] = array(
|
danielebarchiesi@0
|
160 '#type' => 'fieldset',
|
danielebarchiesi@0
|
161 '#title' => t('Editor appearance'),
|
danielebarchiesi@0
|
162 '#collapsible' => TRUE,
|
danielebarchiesi@0
|
163 '#collapsed' => TRUE,
|
danielebarchiesi@0
|
164 );
|
danielebarchiesi@0
|
165
|
danielebarchiesi@0
|
166 $form['appearance']['toolbar_loc'] = array(
|
danielebarchiesi@0
|
167 '#type' => 'select',
|
danielebarchiesi@0
|
168 '#title' => t('Toolbar location'),
|
danielebarchiesi@0
|
169 '#default_value' => $profile->settings['toolbar_loc'],
|
danielebarchiesi@0
|
170 '#options' => array('bottom' => t('Bottom'), 'top' => t('Top')),
|
danielebarchiesi@0
|
171 '#description' => t('This option controls whether the editor toolbar is displayed above or below the editing area.'),
|
danielebarchiesi@0
|
172 );
|
danielebarchiesi@0
|
173
|
danielebarchiesi@0
|
174 $form['appearance']['toolbar_align'] = array(
|
danielebarchiesi@0
|
175 '#type' => 'select',
|
danielebarchiesi@0
|
176 '#title' => t('Button alignment'),
|
danielebarchiesi@0
|
177 '#default_value' => $profile->settings['toolbar_align'],
|
danielebarchiesi@0
|
178 '#options' => array('center' => t('Center'), 'left' => t('Left'), 'right' => t('Right')),
|
danielebarchiesi@0
|
179 '#description' => t('This option controls the alignment of icons in the editor toolbar.'),
|
danielebarchiesi@0
|
180 );
|
danielebarchiesi@0
|
181
|
danielebarchiesi@0
|
182 $form['appearance']['path_loc'] = array(
|
danielebarchiesi@0
|
183 '#type' => 'select',
|
danielebarchiesi@0
|
184 '#title' => t('Path location'),
|
danielebarchiesi@0
|
185 '#default_value' => $profile->settings['path_loc'],
|
danielebarchiesi@0
|
186 '#options' => array('none' => t('Hide'), 'top' => t('Top'), 'bottom' => t('Bottom')),
|
danielebarchiesi@0
|
187 '#description' => t('Where to display the path to HTML elements (i.e. <code>body > table > tr > td</code>).'),
|
danielebarchiesi@0
|
188 );
|
danielebarchiesi@0
|
189
|
danielebarchiesi@0
|
190 $form['appearance']['resizing'] = array(
|
danielebarchiesi@0
|
191 '#type' => 'checkbox',
|
danielebarchiesi@0
|
192 '#title' => t('Enable resizing button'),
|
danielebarchiesi@0
|
193 '#default_value' => $profile->settings['resizing'],
|
danielebarchiesi@0
|
194 '#return_value' => 1,
|
danielebarchiesi@0
|
195 '#description' => t('This option gives you the ability to enable/disable the resizing button. If enabled, the Path location toolbar must be set to "Top" or "Bottom" in order to display the resize icon.'),
|
danielebarchiesi@0
|
196 );
|
danielebarchiesi@0
|
197
|
danielebarchiesi@0
|
198 $form['output'] = array(
|
danielebarchiesi@0
|
199 '#type' => 'fieldset',
|
danielebarchiesi@0
|
200 '#title' => t('Cleanup and output'),
|
danielebarchiesi@0
|
201 '#collapsible' => TRUE,
|
danielebarchiesi@0
|
202 '#collapsed' => TRUE,
|
danielebarchiesi@0
|
203 );
|
danielebarchiesi@0
|
204
|
danielebarchiesi@0
|
205 $form['output']['verify_html'] = array(
|
danielebarchiesi@0
|
206 '#type' => 'checkbox',
|
danielebarchiesi@0
|
207 '#title' => t('Verify HTML'),
|
danielebarchiesi@0
|
208 '#default_value' => $profile->settings['verify_html'],
|
danielebarchiesi@0
|
209 '#return_value' => 1,
|
danielebarchiesi@0
|
210 '#description' => t('If enabled, potentially malicious code like <code><HEAD></code> tags will be removed from HTML contents.'),
|
danielebarchiesi@0
|
211 );
|
danielebarchiesi@0
|
212
|
danielebarchiesi@0
|
213 $form['output']['preformatted'] = array(
|
danielebarchiesi@0
|
214 '#type' => 'checkbox',
|
danielebarchiesi@0
|
215 '#title' => t('Preformatted'),
|
danielebarchiesi@0
|
216 '#default_value' => $profile->settings['preformatted'],
|
danielebarchiesi@0
|
217 '#return_value' => 1,
|
danielebarchiesi@0
|
218 '#description' => t('If enabled, the editor will insert TAB characters on tab and preserve other whitespace characters just like a PRE element in HTML does.'),
|
danielebarchiesi@0
|
219 );
|
danielebarchiesi@0
|
220
|
danielebarchiesi@0
|
221 $form['output']['convert_fonts_to_spans'] = array(
|
danielebarchiesi@0
|
222 '#type' => 'checkbox',
|
danielebarchiesi@0
|
223 '#title' => t('Convert <font> tags to styles'),
|
danielebarchiesi@0
|
224 '#default_value' => $profile->settings['convert_fonts_to_spans'],
|
danielebarchiesi@0
|
225 '#return_value' => 1,
|
danielebarchiesi@0
|
226 '#description' => t('If enabled, HTML tags declaring the font size, font family, font color and font background color will be replaced by inline CSS styles.'),
|
danielebarchiesi@0
|
227 );
|
danielebarchiesi@0
|
228
|
danielebarchiesi@0
|
229 $form['output']['remove_linebreaks'] = array(
|
danielebarchiesi@0
|
230 '#type' => 'checkbox',
|
danielebarchiesi@0
|
231 '#title' => t('Remove linebreaks'),
|
danielebarchiesi@0
|
232 '#default_value' => $profile->settings['remove_linebreaks'],
|
danielebarchiesi@0
|
233 '#return_value' => 1,
|
danielebarchiesi@0
|
234 '#description' => t('If enabled, the editor will remove most linebreaks from contents. Disabling this option could avoid conflicts with other input filters.'),
|
danielebarchiesi@0
|
235 );
|
danielebarchiesi@0
|
236
|
danielebarchiesi@0
|
237 $form['output']['apply_source_formatting'] = array(
|
danielebarchiesi@0
|
238 '#type' => 'checkbox',
|
danielebarchiesi@0
|
239 '#title' => t('Apply source formatting'),
|
danielebarchiesi@0
|
240 '#default_value' => $profile->settings['apply_source_formatting'],
|
danielebarchiesi@0
|
241 '#return_value' => 1,
|
danielebarchiesi@0
|
242 '#description' => t('If enabled, the editor will re-format the HTML source code. Disabling this option could avoid conflicts with other input filters.'),
|
danielebarchiesi@0
|
243 );
|
danielebarchiesi@0
|
244
|
danielebarchiesi@0
|
245 $form['output']['paste_auto_cleanup_on_paste'] = array(
|
danielebarchiesi@0
|
246 '#type' => 'checkbox',
|
danielebarchiesi@0
|
247 '#title' => t('Force cleanup on standard paste'),
|
danielebarchiesi@0
|
248 '#default_value' => $profile->settings['paste_auto_cleanup_on_paste'],
|
danielebarchiesi@0
|
249 '#return_value' => 1,
|
danielebarchiesi@0
|
250 '#description' => t('If enabled, the default paste function (CTRL-V or SHIFT-INS) behaves like the "paste from word" plugin function.'),
|
danielebarchiesi@0
|
251 );
|
danielebarchiesi@0
|
252
|
danielebarchiesi@0
|
253 $form['css'] = array(
|
danielebarchiesi@0
|
254 '#type' => 'fieldset',
|
danielebarchiesi@0
|
255 '#title' => t('CSS'),
|
danielebarchiesi@0
|
256 '#collapsible' => TRUE,
|
danielebarchiesi@0
|
257 '#collapsed' => TRUE,
|
danielebarchiesi@0
|
258 );
|
danielebarchiesi@0
|
259
|
danielebarchiesi@0
|
260 $form['css']['block_formats'] = array(
|
danielebarchiesi@0
|
261 '#type' => 'textfield',
|
danielebarchiesi@0
|
262 '#title' => t('Block formats'),
|
danielebarchiesi@0
|
263 '#default_value' => $profile->settings['block_formats'],
|
danielebarchiesi@0
|
264 '#size' => 40,
|
danielebarchiesi@0
|
265 '#maxlength' => 250,
|
danielebarchiesi@0
|
266 '#description' => t('Comma separated list of HTML block formats. Possible values: <code>@format-list</code>.', array('@format-list' => 'p,h1,h2,h3,h4,h5,h6,div,blockquote,address,pre,code,dt,dd')),
|
danielebarchiesi@0
|
267 );
|
danielebarchiesi@0
|
268
|
danielebarchiesi@0
|
269 $form['css']['css_setting'] = array(
|
danielebarchiesi@0
|
270 '#type' => 'select',
|
danielebarchiesi@0
|
271 '#title' => t('Editor CSS'),
|
danielebarchiesi@0
|
272 '#default_value' => $profile->settings['css_setting'],
|
danielebarchiesi@0
|
273 '#options' => array('theme' => t('Use theme CSS'), 'self' => t('Define CSS'), 'none' => t('Editor default CSS')),
|
danielebarchiesi@0
|
274 '#description' => t('Defines the CSS to be used in the editor area.<br />Use theme CSS - loads stylesheets from current site theme.<br/>Define CSS - enter path for stylesheet files below.<br />Editor default CSS - uses default stylesheets from editor.'),
|
danielebarchiesi@0
|
275 );
|
danielebarchiesi@0
|
276
|
danielebarchiesi@0
|
277 $form['css']['css_path'] = array(
|
danielebarchiesi@0
|
278 '#type' => 'textfield',
|
danielebarchiesi@0
|
279 '#title' => t('CSS path'),
|
danielebarchiesi@0
|
280 '#default_value' => $profile->settings['css_path'],
|
danielebarchiesi@0
|
281 '#size' => 40,
|
danielebarchiesi@0
|
282 '#maxlength' => 255,
|
danielebarchiesi@0
|
283 '#description' => t('If "Define CSS" was selected above, enter path to a CSS file or a list of CSS files separated by a comma.') . '<br />' . t('Available tokens: <code>%b</code> (base path, eg: <code>/</code>), <code>%t</code> (path to theme, eg: <code>themes/garland</code>)') . '<br />' . t('Example:') . ' css/editor.css,/themes/garland/style.css,%b%t/style.css,http://example.com/external.css',
|
danielebarchiesi@0
|
284 );
|
danielebarchiesi@0
|
285
|
danielebarchiesi@0
|
286 $form['css']['css_classes'] = array(
|
danielebarchiesi@0
|
287 '#type' => 'textarea',
|
danielebarchiesi@0
|
288 '#title' => t('CSS classes'),
|
danielebarchiesi@0
|
289 '#default_value' => $profile->settings['css_classes'],
|
danielebarchiesi@0
|
290 '#description' => t('Optionally define CSS classes for the "Font style" dropdown list.<br />Enter one class on each line in the format: !format. Example: !example<br />If left blank, CSS classes are automatically imported from all loaded stylesheet(s).', array('!format' => '<code>[title]=[class]</code>', '!example' => 'My heading=header1')),
|
danielebarchiesi@0
|
291 );
|
danielebarchiesi@0
|
292
|
danielebarchiesi@0
|
293 $form['submit'] = array(
|
danielebarchiesi@0
|
294 '#type' => 'submit',
|
danielebarchiesi@0
|
295 '#value' => t('Save'),
|
danielebarchiesi@0
|
296 '#weight' => 100,
|
danielebarchiesi@0
|
297 );
|
danielebarchiesi@0
|
298 $form['cancel'] = array(
|
danielebarchiesi@0
|
299 '#value' => l(t('Cancel'), 'admin/config/content/wysiwyg'),
|
danielebarchiesi@0
|
300 '#weight' => 110,
|
danielebarchiesi@0
|
301 );
|
danielebarchiesi@0
|
302
|
danielebarchiesi@0
|
303 // Supply contextual information for other callbacks and handlers.
|
danielebarchiesi@0
|
304 // @todo Modernize this form for D7+ and declare these earlier.
|
danielebarchiesi@0
|
305 // $profile is the primary object of this form, and as an entity, usually
|
danielebarchiesi@0
|
306 // expected to live in $form_state[$entity_type].
|
danielebarchiesi@0
|
307 $form_state['wysiwyg_profile'] = $profile;
|
danielebarchiesi@0
|
308 $form_state['wysiwyg']['editor'] = $editor;
|
danielebarchiesi@0
|
309 $form_state['wysiwyg']['plugins'] = $plugins;
|
danielebarchiesi@0
|
310
|
danielebarchiesi@0
|
311 // Allow editor library specific changes to be made to the form.
|
danielebarchiesi@0
|
312 if (isset($editor['settings form callback'])) {
|
danielebarchiesi@0
|
313 $editor['settings form callback']($form, $form_state);
|
danielebarchiesi@0
|
314 }
|
danielebarchiesi@0
|
315
|
danielebarchiesi@0
|
316 return $form;
|
danielebarchiesi@0
|
317 }
|
danielebarchiesi@0
|
318
|
danielebarchiesi@0
|
319 /**
|
danielebarchiesi@0
|
320 * Submit callback for Wysiwyg profile form.
|
danielebarchiesi@0
|
321 *
|
danielebarchiesi@0
|
322 * @see wysiwyg_profile_form()
|
danielebarchiesi@0
|
323 */
|
danielebarchiesi@0
|
324 function wysiwyg_profile_form_submit($form, &$form_state) {
|
danielebarchiesi@0
|
325 $values = $form_state['values'];
|
danielebarchiesi@0
|
326 if (isset($values['buttons'])) {
|
danielebarchiesi@0
|
327 // Store only enabled buttons for each plugin.
|
danielebarchiesi@0
|
328 foreach ($values['buttons'] as $plugin => $buttons) {
|
danielebarchiesi@0
|
329 $values['buttons'][$plugin] = array_filter($values['buttons'][$plugin]);
|
danielebarchiesi@0
|
330 }
|
danielebarchiesi@0
|
331 // Store only enabled plugins.
|
danielebarchiesi@0
|
332 $values['buttons'] = array_filter($values['buttons']);
|
danielebarchiesi@0
|
333 }
|
danielebarchiesi@0
|
334 // Remove any white-space from 'block_formats' setting, since editor
|
danielebarchiesi@0
|
335 // implementations rely on a comma-separated list to explode().
|
danielebarchiesi@0
|
336 $values['block_formats'] = preg_replace('@\s+@', '', $values['block_formats']);
|
danielebarchiesi@0
|
337
|
danielebarchiesi@0
|
338 // Remove input format name.
|
danielebarchiesi@0
|
339 $format = $values['format'];
|
danielebarchiesi@0
|
340 $input_format = $values['input_format'];
|
danielebarchiesi@0
|
341 $editor = $values['editor'];
|
danielebarchiesi@0
|
342 unset($values['format'], $values['input_format'], $values['editor']);
|
danielebarchiesi@0
|
343
|
danielebarchiesi@0
|
344 // Remove FAPI values.
|
danielebarchiesi@0
|
345 // @see system_settings_form_submit()
|
danielebarchiesi@0
|
346 unset($values['submit'], $values['form_id'], $values['op'], $values['form_token'], $values['form_build_id']);
|
danielebarchiesi@0
|
347
|
danielebarchiesi@0
|
348 // Insert new profile data.
|
danielebarchiesi@0
|
349 db_merge('wysiwyg')
|
danielebarchiesi@0
|
350 ->key(array('format' => $format))
|
danielebarchiesi@0
|
351 ->fields(array(
|
danielebarchiesi@0
|
352 'editor' => $editor,
|
danielebarchiesi@0
|
353 'settings' => serialize($values),
|
danielebarchiesi@0
|
354 ))
|
danielebarchiesi@0
|
355 ->execute();
|
danielebarchiesi@0
|
356 wysiwyg_profile_cache_clear();
|
danielebarchiesi@0
|
357
|
danielebarchiesi@0
|
358 drupal_set_message(t('Wysiwyg profile for %format has been saved.', array('%format' => $input_format)));
|
danielebarchiesi@0
|
359
|
danielebarchiesi@0
|
360 $form_state['redirect'] = 'admin/config/content/wysiwyg';
|
danielebarchiesi@0
|
361 }
|
danielebarchiesi@0
|
362
|
danielebarchiesi@0
|
363 /**
|
danielebarchiesi@0
|
364 * Layout for the buttons in the Wysiwyg Editor profile form.
|
danielebarchiesi@0
|
365 */
|
danielebarchiesi@0
|
366 function theme_wysiwyg_admin_button_table($variables) {
|
danielebarchiesi@0
|
367 $form = $variables['form'];
|
danielebarchiesi@0
|
368 $buttons = array();
|
danielebarchiesi@0
|
369
|
danielebarchiesi@0
|
370 // Flatten forms array.
|
danielebarchiesi@0
|
371 foreach (element_children($form) as $name) {
|
danielebarchiesi@0
|
372 foreach (element_children($form[$name]) as $button) {
|
danielebarchiesi@0
|
373 $buttons[] = drupal_render($form[$name][$button]);
|
danielebarchiesi@0
|
374 }
|
danielebarchiesi@0
|
375 }
|
danielebarchiesi@0
|
376
|
danielebarchiesi@0
|
377 // Split checkboxes into rows with 3 columns.
|
danielebarchiesi@0
|
378 $total = count($buttons);
|
danielebarchiesi@0
|
379 $rows = array();
|
danielebarchiesi@0
|
380 for ($i = 0; $i < $total; $i += 3) {
|
danielebarchiesi@0
|
381 $row = array();
|
danielebarchiesi@0
|
382 $row_buttons = array_slice($buttons, $i, 3) + array_fill(0, 3, array());
|
danielebarchiesi@0
|
383 foreach ($row_buttons as $row_button) {
|
danielebarchiesi@0
|
384 $row[] = array('data' => $row_button);
|
danielebarchiesi@0
|
385 }
|
danielebarchiesi@0
|
386 $rows[] = $row;
|
danielebarchiesi@0
|
387 }
|
danielebarchiesi@0
|
388
|
danielebarchiesi@0
|
389 $output = theme('table', array('rows' => $rows, 'attributes' => array('width' => '100%')));
|
danielebarchiesi@0
|
390
|
danielebarchiesi@0
|
391 return $output;
|
danielebarchiesi@0
|
392 }
|
danielebarchiesi@0
|
393
|
danielebarchiesi@0
|
394 /**
|
danielebarchiesi@0
|
395 * Display overview of setup Wysiwyg Editor profiles; menu callback.
|
danielebarchiesi@0
|
396 */
|
danielebarchiesi@0
|
397 function wysiwyg_profile_overview($form, &$form_state) {
|
danielebarchiesi@0
|
398 include_once './includes/install.inc';
|
danielebarchiesi@0
|
399
|
danielebarchiesi@0
|
400 // Check which wysiwyg editors are installed.
|
danielebarchiesi@0
|
401 $editors = wysiwyg_get_all_editors();
|
danielebarchiesi@0
|
402 $count = count($editors);
|
danielebarchiesi@0
|
403 $status = array();
|
danielebarchiesi@0
|
404 $options = array('' => t('No editor'));
|
danielebarchiesi@0
|
405
|
danielebarchiesi@0
|
406 // D7's seven theme displays links in table headers as block elements.
|
danielebarchiesi@0
|
407 drupal_add_css('table.system-status-report th a {display: inline;}', 'inline');
|
danielebarchiesi@0
|
408
|
danielebarchiesi@0
|
409 foreach ($editors as $name => $editor) {
|
danielebarchiesi@0
|
410 $status[$name] = array(
|
danielebarchiesi@0
|
411 'severity' => (isset($editor['error']) ? REQUIREMENT_ERROR : ($editor['installed'] ? REQUIREMENT_OK : REQUIREMENT_INFO)),
|
danielebarchiesi@0
|
412 'title' => t('<a href="!vendor-url">@editor</a> (<a href="!download-url">Download</a>)', array('!vendor-url' => $editor['vendor url'], '@editor' => $editor['title'], '!download-url' => $editor['download url'])),
|
danielebarchiesi@0
|
413 'value' => (isset($editor['installed version']) ? $editor['installed version'] : t('Not installed.')),
|
danielebarchiesi@0
|
414 'description' => (isset($editor['error']) ? $editor['error'] : ''),
|
danielebarchiesi@0
|
415 );
|
danielebarchiesi@0
|
416 if ($editor['installed']) {
|
danielebarchiesi@0
|
417 $options[$name] = $editor['title'] . (isset($editor['installed version']) ? ' ' . $editor['installed version'] : '');
|
danielebarchiesi@0
|
418 }
|
danielebarchiesi@0
|
419 else {
|
danielebarchiesi@0
|
420 // Build on-site installation instructions.
|
danielebarchiesi@0
|
421 // @todo Setup $library in wysiwyg_load_editor() already.
|
danielebarchiesi@0
|
422 $library = (isset($editor['library']) ? $editor['library'] : key($editor['libraries']));
|
danielebarchiesi@0
|
423 $targs = array(
|
danielebarchiesi@0
|
424 '@editor-path' => $editor['editor path'],
|
danielebarchiesi@0
|
425 '@library-filepath' => $editor['library path'] . '/' . (isset($editor['libraries'][$library]['files'][0]) ? $editor['libraries'][$library]['files'][0] : key($editor['libraries'][$library]['files'])),
|
danielebarchiesi@0
|
426 );
|
danielebarchiesi@0
|
427 $instructions = '<p>' . t('Extract the archive and copy its contents into a new folder in the following location:<br /><code>@editor-path</code>', $targs) . '</p>';
|
danielebarchiesi@0
|
428 $instructions .= '<p>' . t('So the actual library can be found at:<br /><code>@library-filepath</code>', $targs) . '</p>';
|
danielebarchiesi@0
|
429
|
danielebarchiesi@0
|
430 // Add any install notes.
|
danielebarchiesi@0
|
431 if (!empty($editor['install note callback']) && function_exists($editor['install note callback'])) {
|
danielebarchiesi@0
|
432 $instructions .= '<div class="editor-install-note">' . $editor['install note callback']() . '</div>';
|
danielebarchiesi@0
|
433 }
|
danielebarchiesi@0
|
434
|
danielebarchiesi@0
|
435 $status[$name]['description'] .= $instructions;
|
danielebarchiesi@0
|
436 $count--;
|
danielebarchiesi@0
|
437 }
|
danielebarchiesi@0
|
438 // In case there is an error, always show installation instructions.
|
danielebarchiesi@0
|
439 if (isset($editor['error'])) {
|
danielebarchiesi@0
|
440 $show_instructions = TRUE;
|
danielebarchiesi@0
|
441 }
|
danielebarchiesi@0
|
442 }
|
danielebarchiesi@0
|
443 if (!$count) {
|
danielebarchiesi@0
|
444 $show_instructions = TRUE;
|
danielebarchiesi@0
|
445 }
|
danielebarchiesi@0
|
446 $form['status'] = array(
|
danielebarchiesi@0
|
447 '#type' => 'fieldset',
|
danielebarchiesi@0
|
448 '#title' => t('Installation instructions'),
|
danielebarchiesi@0
|
449 '#collapsible' => TRUE,
|
danielebarchiesi@0
|
450 '#collapsed' => !isset($show_instructions),
|
danielebarchiesi@0
|
451 '#description' => (!$count ? t('There are no editor libraries installed currently. The following list contains a list of currently supported editors:') : ''),
|
danielebarchiesi@0
|
452 '#weight' => 10,
|
danielebarchiesi@0
|
453 );
|
danielebarchiesi@0
|
454 $form['status']['report'] = array('#markup' => theme('status_report', array('requirements' => $status)));
|
danielebarchiesi@0
|
455
|
danielebarchiesi@0
|
456 if (!$count) {
|
danielebarchiesi@0
|
457 return $form;
|
danielebarchiesi@0
|
458 }
|
danielebarchiesi@0
|
459
|
danielebarchiesi@0
|
460 $formats = filter_formats();
|
danielebarchiesi@0
|
461 $profiles = wysiwyg_profile_load_all();
|
danielebarchiesi@0
|
462 $form['formats'] = array(
|
danielebarchiesi@0
|
463 '#type' => 'item',
|
danielebarchiesi@0
|
464 '#description' => t('To assign a different editor to a text format, click "delete" to remove the existing first.'),
|
danielebarchiesi@0
|
465 '#tree' => TRUE,
|
danielebarchiesi@0
|
466 );
|
danielebarchiesi@0
|
467
|
danielebarchiesi@0
|
468 $enable_save = FALSE;
|
danielebarchiesi@0
|
469 foreach ($formats as $id => $format) {
|
danielebarchiesi@0
|
470 $form['formats'][$id]['name'] = array(
|
danielebarchiesi@0
|
471 '#markup' => check_plain($format->name),
|
danielebarchiesi@0
|
472 );
|
danielebarchiesi@0
|
473 // Only display editor selection for associated input formats to avoid
|
danielebarchiesi@0
|
474 // confusion about disabled selection.
|
danielebarchiesi@0
|
475 if (isset($profiles[$id]) && !empty($profiles[$id]->editor)) {
|
danielebarchiesi@0
|
476 $editor_name = $profiles[$id]->editor;
|
danielebarchiesi@0
|
477 $installed = !empty($editors[$editor_name]['installed']);
|
danielebarchiesi@0
|
478 $form['formats'][$id]['editor'] = array(
|
danielebarchiesi@0
|
479 '#wysiwyg-editor-name' => $editor_name,
|
danielebarchiesi@0
|
480 );
|
danielebarchiesi@0
|
481 if ($installed) {
|
danielebarchiesi@0
|
482 $form['formats'][$id]['editor']['#markup'] = $options[$editor_name];
|
danielebarchiesi@0
|
483 }
|
danielebarchiesi@0
|
484 else {
|
danielebarchiesi@0
|
485 drupal_set_message(t('Missing %editor library for %format format. Re-install the %editor library or delete the editor profile.', array(
|
danielebarchiesi@0
|
486 '%editor' => $editors[$editor_name]['title'],
|
danielebarchiesi@0
|
487 '%format' => $format->name,
|
danielebarchiesi@0
|
488 )), 'warning');
|
danielebarchiesi@0
|
489 }
|
danielebarchiesi@0
|
490 }
|
danielebarchiesi@0
|
491 else {
|
danielebarchiesi@0
|
492 $form['formats'][$id]['editor'] = array(
|
danielebarchiesi@0
|
493 '#type' => 'select',
|
danielebarchiesi@0
|
494 '#default_value' => '',
|
danielebarchiesi@0
|
495 '#options' => $options,
|
danielebarchiesi@0
|
496 );
|
danielebarchiesi@0
|
497 $enable_save = TRUE;
|
danielebarchiesi@0
|
498 }
|
danielebarchiesi@0
|
499 if (isset($profiles[$id]) && !empty($profiles[$id]->editor)) {
|
danielebarchiesi@0
|
500 $form['formats'][$id]['edit'] = array(
|
danielebarchiesi@0
|
501 '#markup' => l(t('Edit'), "admin/config/content/wysiwyg/profile/$id/edit"),
|
danielebarchiesi@0
|
502 );
|
danielebarchiesi@0
|
503 $form['formats'][$id]['delete'] = array(
|
danielebarchiesi@0
|
504 '#markup' => l(t('Delete'), "admin/config/content/wysiwyg/profile/$id/delete"),
|
danielebarchiesi@0
|
505 );
|
danielebarchiesi@0
|
506 }
|
danielebarchiesi@0
|
507 }
|
danielebarchiesi@0
|
508
|
danielebarchiesi@0
|
509 // Submitting the form when no editors can be selected causes errors.
|
danielebarchiesi@0
|
510 if ($enable_save) {
|
danielebarchiesi@0
|
511 $form['submit'] = array('#type' => 'submit', '#value' => t('Save'));
|
danielebarchiesi@0
|
512 }
|
danielebarchiesi@0
|
513 return $form;
|
danielebarchiesi@0
|
514 }
|
danielebarchiesi@0
|
515
|
danielebarchiesi@0
|
516 /**
|
danielebarchiesi@0
|
517 * Return HTML for the Wysiwyg profile overview form.
|
danielebarchiesi@0
|
518 */
|
danielebarchiesi@0
|
519 function theme_wysiwyg_profile_overview($variables) {
|
danielebarchiesi@0
|
520 $form = $variables['form'];
|
danielebarchiesi@0
|
521 if (!isset($form['formats'])) {
|
danielebarchiesi@0
|
522 return;
|
danielebarchiesi@0
|
523 }
|
danielebarchiesi@0
|
524 $editors = wysiwyg_get_all_editors();
|
danielebarchiesi@0
|
525 $output = '';
|
danielebarchiesi@0
|
526 $header = array(t('Text format'), t('Editor'), array('data' => t('Operations'), 'colspan' => 2));
|
danielebarchiesi@0
|
527 $rows = array();
|
danielebarchiesi@0
|
528 foreach (element_children($form['formats']) as $item) {
|
danielebarchiesi@0
|
529 $format = &$form['formats'][$item];
|
danielebarchiesi@0
|
530 $row = array(
|
danielebarchiesi@0
|
531 'data' => array(
|
danielebarchiesi@0
|
532 drupal_render($format['name']),
|
danielebarchiesi@0
|
533 drupal_render($format['editor']),
|
danielebarchiesi@0
|
534 isset($format['edit']) ? drupal_render($format['edit']) : '',
|
danielebarchiesi@0
|
535 isset($format['delete']) ? drupal_render($format['delete']) : '',
|
danielebarchiesi@0
|
536 ),
|
danielebarchiesi@0
|
537 );
|
danielebarchiesi@0
|
538 if (empty($row['data'][1])) {
|
danielebarchiesi@0
|
539 $row['data'][1] = array(
|
danielebarchiesi@0
|
540 'data' => t('Missing library: @library', array('@library' => $editors[$format['editor']['#wysiwyg-editor-name']]['title'])),
|
danielebarchiesi@0
|
541 'class' => 'error',
|
danielebarchiesi@0
|
542 );
|
danielebarchiesi@0
|
543 $row['class'] = array('error');
|
danielebarchiesi@0
|
544 }
|
danielebarchiesi@0
|
545 $rows[] = $row;
|
danielebarchiesi@0
|
546 }
|
danielebarchiesi@0
|
547 $form['formats']['table']['#markup'] = theme('table', array('header' => $header, 'rows' => $rows));
|
danielebarchiesi@0
|
548 $output .= drupal_render_children($form);
|
danielebarchiesi@0
|
549 return $output;
|
danielebarchiesi@0
|
550 }
|
danielebarchiesi@0
|
551
|
danielebarchiesi@0
|
552 /**
|
danielebarchiesi@0
|
553 * Submit callback for Wysiwyg profile overview form.
|
danielebarchiesi@0
|
554 */
|
danielebarchiesi@0
|
555 function wysiwyg_profile_overview_submit($form, &$form_state) {
|
danielebarchiesi@0
|
556 foreach ($form_state['values']['formats'] as $format => $values) {
|
danielebarchiesi@0
|
557 db_merge('wysiwyg')
|
danielebarchiesi@0
|
558 ->key(array('format' => $format))
|
danielebarchiesi@0
|
559 ->fields(array(
|
danielebarchiesi@0
|
560 'editor' => $values['editor'],
|
danielebarchiesi@0
|
561 ))
|
danielebarchiesi@0
|
562 ->execute();
|
danielebarchiesi@0
|
563 }
|
danielebarchiesi@0
|
564 wysiwyg_profile_cache_clear();
|
danielebarchiesi@0
|
565 }
|
danielebarchiesi@0
|
566
|
danielebarchiesi@0
|
567 /**
|
danielebarchiesi@0
|
568 * Delete editor profile confirmation form.
|
danielebarchiesi@0
|
569 */
|
danielebarchiesi@0
|
570 function wysiwyg_profile_delete_confirm($form, &$form_state, $profile) {
|
danielebarchiesi@0
|
571 $formats = filter_formats();
|
danielebarchiesi@0
|
572 $format = $formats[$profile->format];
|
danielebarchiesi@0
|
573 $form['format'] = array('#type' => 'value', '#value' => $format);
|
danielebarchiesi@0
|
574 return confirm_form(
|
danielebarchiesi@0
|
575 $form,
|
danielebarchiesi@0
|
576 t('Are you sure you want to remove the profile for %name?', array('%name' => $format->name)),
|
danielebarchiesi@0
|
577 'admin/config/content/wysiwyg',
|
danielebarchiesi@0
|
578 t('This action cannot be undone.'), t('Remove'), t('Cancel')
|
danielebarchiesi@0
|
579 );
|
danielebarchiesi@0
|
580 }
|
danielebarchiesi@0
|
581
|
danielebarchiesi@0
|
582 /**
|
danielebarchiesi@0
|
583 * Submit callback for Wysiwyg profile delete form.
|
danielebarchiesi@0
|
584 *
|
danielebarchiesi@0
|
585 * @see wysiwyg_profile_delete_confirm()
|
danielebarchiesi@0
|
586 */
|
danielebarchiesi@0
|
587 function wysiwyg_profile_delete_confirm_submit($form, &$form_state) {
|
danielebarchiesi@0
|
588 $format = $form_state['values']['format'];
|
danielebarchiesi@0
|
589 wysiwyg_profile_delete($format->format);
|
danielebarchiesi@0
|
590 wysiwyg_profile_cache_clear();
|
danielebarchiesi@0
|
591
|
danielebarchiesi@0
|
592 drupal_set_message(t('Wysiwyg profile for %name has been deleted.', array('%name' => $format->name)));
|
danielebarchiesi@0
|
593 $form_state['redirect'] = 'admin/config/content/wysiwyg';
|
danielebarchiesi@0
|
594 }
|