annotate sites/all/modules/wysiwyg/wysiwyg.admin.inc @ 0:ff03f76ab3fe

initial version
author danieleb <danielebarchiesi@me.com>
date Wed, 21 Aug 2013 18:51:11 +0100
parents
children
rev   line source
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>&lt;HEAD&gt;</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 &lt;font&gt; 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 }