danielebarchiesi@0: '', danielebarchiesi@0: 'editor' => '', danielebarchiesi@0: ); danielebarchiesi@0: if (empty($profile['settings'])) { danielebarchiesi@0: $profile['settings'] = array(); danielebarchiesi@0: } danielebarchiesi@0: $profile['settings'] += array( danielebarchiesi@0: 'default' => TRUE, danielebarchiesi@0: 'user_choose' => FALSE, danielebarchiesi@0: 'show_toggle' => TRUE, danielebarchiesi@0: 'theme' => 'advanced', danielebarchiesi@0: 'language' => 'en', danielebarchiesi@0: 'access' => 1, danielebarchiesi@0: 'access_pages' => "node/*\nuser/*\ncomment/*", danielebarchiesi@0: 'buttons' => array(), danielebarchiesi@0: 'toolbar_loc' => 'top', danielebarchiesi@0: 'toolbar_align' => 'left', danielebarchiesi@0: 'path_loc' => 'bottom', danielebarchiesi@0: 'resizing' => TRUE, danielebarchiesi@0: // Also available, but buggy in TinyMCE 2.x: blockquote,code,dt,dd,samp. danielebarchiesi@0: 'block_formats' => 'p,address,pre,h2,h3,h4,h5,h6,div', danielebarchiesi@0: 'verify_html' => TRUE, danielebarchiesi@0: 'preformatted' => FALSE, danielebarchiesi@0: 'convert_fonts_to_spans' => TRUE, danielebarchiesi@0: 'remove_linebreaks' => TRUE, danielebarchiesi@0: 'apply_source_formatting' => FALSE, danielebarchiesi@0: 'paste_auto_cleanup_on_paste' => FALSE, danielebarchiesi@0: 'css_setting' => 'theme', danielebarchiesi@0: 'css_path' => NULL, danielebarchiesi@0: 'css_classes' => NULL, danielebarchiesi@0: ); danielebarchiesi@0: $profile = (object) $profile; danielebarchiesi@0: danielebarchiesi@0: $formats = filter_formats(); danielebarchiesi@0: $editor = wysiwyg_get_editor($profile->editor); danielebarchiesi@0: drupal_set_title(t('%editor profile for %format', array('%editor' => $editor['title'], '%format' => $formats[$profile->format]->name)), PASS_THROUGH); danielebarchiesi@0: danielebarchiesi@0: $form['format'] = array('#type' => 'value', '#value' => $profile->format); danielebarchiesi@0: $form['input_format'] = array('#type' => 'value', '#value' => $formats[$profile->format]->name); danielebarchiesi@0: $form['editor'] = array('#type' => 'value', '#value' => $profile->editor); danielebarchiesi@0: danielebarchiesi@0: $form['basic'] = array( danielebarchiesi@0: '#type' => 'fieldset', danielebarchiesi@0: '#title' => t('Basic setup'), danielebarchiesi@0: '#collapsible' => TRUE, danielebarchiesi@0: '#collapsed' => TRUE, danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $form['basic']['default'] = array( danielebarchiesi@0: '#type' => 'checkbox', danielebarchiesi@0: '#title' => t('Enabled by default'), danielebarchiesi@0: '#default_value' => $profile->settings['default'], danielebarchiesi@0: '#return_value' => 1, danielebarchiesi@0: '#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: ); danielebarchiesi@0: danielebarchiesi@0: $form['basic']['user_choose'] = array( danielebarchiesi@0: '#type' => 'checkbox', danielebarchiesi@0: '#title' => t('Allow users to choose default'), danielebarchiesi@0: '#default_value' => $profile->settings['user_choose'], danielebarchiesi@0: '#return_value' => 1, danielebarchiesi@0: '#description' => t('If allowed, users will be able to choose their own editor default state in their user account settings.'), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $form['basic']['show_toggle'] = array( danielebarchiesi@0: '#type' => 'checkbox', danielebarchiesi@0: '#title' => t('Show enable/disable rich text toggle link'), danielebarchiesi@0: '#default_value' => $profile->settings['show_toggle'], danielebarchiesi@0: '#return_value' => 1, danielebarchiesi@0: '#description' => t('Whether or not to show the enable/disable rich text toggle link below a textarea. If disabled, the user setting or global default is used (see above).'), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $form['basic']['theme'] = array( danielebarchiesi@0: '#type' => 'hidden', danielebarchiesi@0: '#value' => $profile->settings['theme'], danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $form['basic']['language'] = array( danielebarchiesi@0: '#type' => 'select', danielebarchiesi@0: '#title' => t('Interface language'), danielebarchiesi@0: '#default_value' => $profile->settings['language'], danielebarchiesi@0: ); danielebarchiesi@0: // @see _locale_prepare_predefined_list() danielebarchiesi@0: require_once DRUPAL_ROOT . '/includes/iso.inc'; danielebarchiesi@0: $predefined = _locale_get_predefined_list(); danielebarchiesi@0: foreach ($predefined as $key => $value) { danielebarchiesi@0: // Include native name in output, if possible danielebarchiesi@0: if (count($value) > 1) { danielebarchiesi@0: $tname = t($value[0]); danielebarchiesi@0: $predefined[$key] = ($tname == $value[1]) ? $tname : "$tname ($value[1])"; danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: $predefined[$key] = t($value[0]); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: asort($predefined); danielebarchiesi@0: $form['basic']['language']['#options'] = $predefined; danielebarchiesi@0: danielebarchiesi@0: $form['buttons'] = array( danielebarchiesi@0: '#type' => 'fieldset', danielebarchiesi@0: '#title' => t('Buttons and plugins'), danielebarchiesi@0: '#collapsible' => TRUE, danielebarchiesi@0: '#collapsed' => TRUE, danielebarchiesi@0: '#tree' => TRUE, danielebarchiesi@0: '#theme' => 'wysiwyg_admin_button_table', danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $plugins = wysiwyg_get_plugins($profile->editor); danielebarchiesi@0: // Generate the button list. danielebarchiesi@0: foreach ($plugins as $name => $meta) { danielebarchiesi@0: if (isset($meta['buttons']) && is_array($meta['buttons'])) { danielebarchiesi@0: foreach ($meta['buttons'] as $button => $title) { danielebarchiesi@0: $icon = ''; danielebarchiesi@0: if (!empty($meta['path'])) { danielebarchiesi@0: // @todo Button icon locations are different in editors, editor versions, danielebarchiesi@0: // and contrib/custom plugins (like Image Assist, f.e.). danielebarchiesi@0: $img_src = $meta['path'] . "/images/$name.gif"; danielebarchiesi@0: // Handle plugins that have more than one button. danielebarchiesi@0: if (!file_exists($img_src)) { danielebarchiesi@0: $img_src = $meta['path'] . "/images/$button.gif"; danielebarchiesi@0: } danielebarchiesi@0: $icon = file_exists($img_src) ? '' : ''; danielebarchiesi@0: } danielebarchiesi@0: $title = (!empty($icon) ? $icon . ' ' . check_plain($title) : check_plain($title)); danielebarchiesi@0: $form['buttons'][$name][$button] = array( danielebarchiesi@0: '#type' => 'checkbox', danielebarchiesi@0: '#title' => $title, danielebarchiesi@0: '#default_value' => !empty($profile->settings['buttons'][$name][$button]) ? $profile->settings['buttons'][$name][$button] : FALSE, danielebarchiesi@0: '#description' => isset($meta['url']) ? l($meta['url'], $meta['url']) : NULL, danielebarchiesi@0: ); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: elseif (isset($meta['extensions']) && is_array($meta['extensions'])) { danielebarchiesi@0: foreach ($meta['extensions'] as $extension => $title) { danielebarchiesi@0: $form['buttons'][$name][$extension] = array( danielebarchiesi@0: '#type' => 'checkbox', danielebarchiesi@0: '#title' => check_plain($title), danielebarchiesi@0: '#default_value' => !empty($profile->settings['buttons'][$name][$extension]) ? $profile->settings['buttons'][$name][$extension] : FALSE, danielebarchiesi@0: '#description' => isset($meta['url']) ? l($meta['url'], $meta['url']) : NULL, danielebarchiesi@0: ); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $form['appearance'] = array( danielebarchiesi@0: '#type' => 'fieldset', danielebarchiesi@0: '#title' => t('Editor appearance'), danielebarchiesi@0: '#collapsible' => TRUE, danielebarchiesi@0: '#collapsed' => TRUE, danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $form['appearance']['toolbar_loc'] = array( danielebarchiesi@0: '#type' => 'select', danielebarchiesi@0: '#title' => t('Toolbar location'), danielebarchiesi@0: '#default_value' => $profile->settings['toolbar_loc'], danielebarchiesi@0: '#options' => array('bottom' => t('Bottom'), 'top' => t('Top')), danielebarchiesi@0: '#description' => t('This option controls whether the editor toolbar is displayed above or below the editing area.'), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $form['appearance']['toolbar_align'] = array( danielebarchiesi@0: '#type' => 'select', danielebarchiesi@0: '#title' => t('Button alignment'), danielebarchiesi@0: '#default_value' => $profile->settings['toolbar_align'], danielebarchiesi@0: '#options' => array('center' => t('Center'), 'left' => t('Left'), 'right' => t('Right')), danielebarchiesi@0: '#description' => t('This option controls the alignment of icons in the editor toolbar.'), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $form['appearance']['path_loc'] = array( danielebarchiesi@0: '#type' => 'select', danielebarchiesi@0: '#title' => t('Path location'), danielebarchiesi@0: '#default_value' => $profile->settings['path_loc'], danielebarchiesi@0: '#options' => array('none' => t('Hide'), 'top' => t('Top'), 'bottom' => t('Bottom')), danielebarchiesi@0: '#description' => t('Where to display the path to HTML elements (i.e. body > table > tr > td).'), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $form['appearance']['resizing'] = array( danielebarchiesi@0: '#type' => 'checkbox', danielebarchiesi@0: '#title' => t('Enable resizing button'), danielebarchiesi@0: '#default_value' => $profile->settings['resizing'], danielebarchiesi@0: '#return_value' => 1, danielebarchiesi@0: '#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: ); danielebarchiesi@0: danielebarchiesi@0: $form['output'] = array( danielebarchiesi@0: '#type' => 'fieldset', danielebarchiesi@0: '#title' => t('Cleanup and output'), danielebarchiesi@0: '#collapsible' => TRUE, danielebarchiesi@0: '#collapsed' => TRUE, danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $form['output']['verify_html'] = array( danielebarchiesi@0: '#type' => 'checkbox', danielebarchiesi@0: '#title' => t('Verify HTML'), danielebarchiesi@0: '#default_value' => $profile->settings['verify_html'], danielebarchiesi@0: '#return_value' => 1, danielebarchiesi@0: '#description' => t('If enabled, potentially malicious code like <HEAD> tags will be removed from HTML contents.'), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $form['output']['preformatted'] = array( danielebarchiesi@0: '#type' => 'checkbox', danielebarchiesi@0: '#title' => t('Preformatted'), danielebarchiesi@0: '#default_value' => $profile->settings['preformatted'], danielebarchiesi@0: '#return_value' => 1, danielebarchiesi@0: '#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: ); danielebarchiesi@0: danielebarchiesi@0: $form['output']['convert_fonts_to_spans'] = array( danielebarchiesi@0: '#type' => 'checkbox', danielebarchiesi@0: '#title' => t('Convert <font> tags to styles'), danielebarchiesi@0: '#default_value' => $profile->settings['convert_fonts_to_spans'], danielebarchiesi@0: '#return_value' => 1, danielebarchiesi@0: '#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: ); danielebarchiesi@0: danielebarchiesi@0: $form['output']['remove_linebreaks'] = array( danielebarchiesi@0: '#type' => 'checkbox', danielebarchiesi@0: '#title' => t('Remove linebreaks'), danielebarchiesi@0: '#default_value' => $profile->settings['remove_linebreaks'], danielebarchiesi@0: '#return_value' => 1, danielebarchiesi@0: '#description' => t('If enabled, the editor will remove most linebreaks from contents. Disabling this option could avoid conflicts with other input filters.'), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $form['output']['apply_source_formatting'] = array( danielebarchiesi@0: '#type' => 'checkbox', danielebarchiesi@0: '#title' => t('Apply source formatting'), danielebarchiesi@0: '#default_value' => $profile->settings['apply_source_formatting'], danielebarchiesi@0: '#return_value' => 1, danielebarchiesi@0: '#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: ); danielebarchiesi@0: danielebarchiesi@0: $form['output']['paste_auto_cleanup_on_paste'] = array( danielebarchiesi@0: '#type' => 'checkbox', danielebarchiesi@0: '#title' => t('Force cleanup on standard paste'), danielebarchiesi@0: '#default_value' => $profile->settings['paste_auto_cleanup_on_paste'], danielebarchiesi@0: '#return_value' => 1, danielebarchiesi@0: '#description' => t('If enabled, the default paste function (CTRL-V or SHIFT-INS) behaves like the "paste from word" plugin function.'), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $form['css'] = array( danielebarchiesi@0: '#type' => 'fieldset', danielebarchiesi@0: '#title' => t('CSS'), danielebarchiesi@0: '#collapsible' => TRUE, danielebarchiesi@0: '#collapsed' => TRUE, danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $form['css']['block_formats'] = array( danielebarchiesi@0: '#type' => 'textfield', danielebarchiesi@0: '#title' => t('Block formats'), danielebarchiesi@0: '#default_value' => $profile->settings['block_formats'], danielebarchiesi@0: '#size' => 40, danielebarchiesi@0: '#maxlength' => 250, danielebarchiesi@0: '#description' => t('Comma separated list of HTML block formats. Possible values: @format-list.', array('@format-list' => 'p,h1,h2,h3,h4,h5,h6,div,blockquote,address,pre,code,dt,dd')), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $form['css']['css_setting'] = array( danielebarchiesi@0: '#type' => 'select', danielebarchiesi@0: '#title' => t('Editor CSS'), danielebarchiesi@0: '#default_value' => $profile->settings['css_setting'], danielebarchiesi@0: '#options' => array('theme' => t('Use theme CSS'), 'self' => t('Define CSS'), 'none' => t('Editor default CSS')), danielebarchiesi@0: '#description' => t('Defines the CSS to be used in the editor area.
Use theme CSS - loads stylesheets from current site theme.
Define CSS - enter path for stylesheet files below.
Editor default CSS - uses default stylesheets from editor.'), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $form['css']['css_path'] = array( danielebarchiesi@0: '#type' => 'textfield', danielebarchiesi@0: '#title' => t('CSS path'), danielebarchiesi@0: '#default_value' => $profile->settings['css_path'], danielebarchiesi@0: '#size' => 40, danielebarchiesi@0: '#maxlength' => 255, danielebarchiesi@0: '#description' => t('If "Define CSS" was selected above, enter path to a CSS file or a list of CSS files separated by a comma.') . '
' . t('Available tokens: %b (base path, eg: /), %t (path to theme, eg: themes/garland)') . '
' . t('Example:') . ' css/editor.css,/themes/garland/style.css,%b%t/style.css,http://example.com/external.css', danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $form['css']['css_classes'] = array( danielebarchiesi@0: '#type' => 'textarea', danielebarchiesi@0: '#title' => t('CSS classes'), danielebarchiesi@0: '#default_value' => $profile->settings['css_classes'], danielebarchiesi@0: '#description' => t('Optionally define CSS classes for the "Font style" dropdown list.
Enter one class on each line in the format: !format. Example: !example
If left blank, CSS classes are automatically imported from all loaded stylesheet(s).', array('!format' => '[title]=[class]', '!example' => 'My heading=header1')), danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $form['submit'] = array( danielebarchiesi@0: '#type' => 'submit', danielebarchiesi@0: '#value' => t('Save'), danielebarchiesi@0: '#weight' => 100, danielebarchiesi@0: ); danielebarchiesi@0: $form['cancel'] = array( danielebarchiesi@0: '#value' => l(t('Cancel'), 'admin/config/content/wysiwyg'), danielebarchiesi@0: '#weight' => 110, danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: // Supply contextual information for other callbacks and handlers. danielebarchiesi@0: // @todo Modernize this form for D7+ and declare these earlier. danielebarchiesi@0: // $profile is the primary object of this form, and as an entity, usually danielebarchiesi@0: // expected to live in $form_state[$entity_type]. danielebarchiesi@0: $form_state['wysiwyg_profile'] = $profile; danielebarchiesi@0: $form_state['wysiwyg']['editor'] = $editor; danielebarchiesi@0: $form_state['wysiwyg']['plugins'] = $plugins; danielebarchiesi@0: danielebarchiesi@0: // Allow editor library specific changes to be made to the form. danielebarchiesi@0: if (isset($editor['settings form callback'])) { danielebarchiesi@0: $editor['settings form callback']($form, $form_state); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: return $form; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Submit callback for Wysiwyg profile form. danielebarchiesi@0: * danielebarchiesi@0: * @see wysiwyg_profile_form() danielebarchiesi@0: */ danielebarchiesi@0: function wysiwyg_profile_form_submit($form, &$form_state) { danielebarchiesi@0: $values = $form_state['values']; danielebarchiesi@0: if (isset($values['buttons'])) { danielebarchiesi@0: // Store only enabled buttons for each plugin. danielebarchiesi@0: foreach ($values['buttons'] as $plugin => $buttons) { danielebarchiesi@0: $values['buttons'][$plugin] = array_filter($values['buttons'][$plugin]); danielebarchiesi@0: } danielebarchiesi@0: // Store only enabled plugins. danielebarchiesi@0: $values['buttons'] = array_filter($values['buttons']); danielebarchiesi@0: } danielebarchiesi@0: // Remove any white-space from 'block_formats' setting, since editor danielebarchiesi@0: // implementations rely on a comma-separated list to explode(). danielebarchiesi@0: $values['block_formats'] = preg_replace('@\s+@', '', $values['block_formats']); danielebarchiesi@0: danielebarchiesi@0: // Remove input format name. danielebarchiesi@0: $format = $values['format']; danielebarchiesi@0: $input_format = $values['input_format']; danielebarchiesi@0: $editor = $values['editor']; danielebarchiesi@0: unset($values['format'], $values['input_format'], $values['editor']); danielebarchiesi@0: danielebarchiesi@0: // Remove FAPI values. danielebarchiesi@0: // @see system_settings_form_submit() danielebarchiesi@0: unset($values['submit'], $values['form_id'], $values['op'], $values['form_token'], $values['form_build_id']); danielebarchiesi@0: danielebarchiesi@0: // Insert new profile data. danielebarchiesi@0: db_merge('wysiwyg') danielebarchiesi@0: ->key(array('format' => $format)) danielebarchiesi@0: ->fields(array( danielebarchiesi@0: 'editor' => $editor, danielebarchiesi@0: 'settings' => serialize($values), danielebarchiesi@0: )) danielebarchiesi@0: ->execute(); danielebarchiesi@0: wysiwyg_profile_cache_clear(); danielebarchiesi@0: danielebarchiesi@0: drupal_set_message(t('Wysiwyg profile for %format has been saved.', array('%format' => $input_format))); danielebarchiesi@0: danielebarchiesi@0: $form_state['redirect'] = 'admin/config/content/wysiwyg'; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Layout for the buttons in the Wysiwyg Editor profile form. danielebarchiesi@0: */ danielebarchiesi@0: function theme_wysiwyg_admin_button_table($variables) { danielebarchiesi@0: $form = $variables['form']; danielebarchiesi@0: $buttons = array(); danielebarchiesi@0: danielebarchiesi@0: // Flatten forms array. danielebarchiesi@0: foreach (element_children($form) as $name) { danielebarchiesi@0: foreach (element_children($form[$name]) as $button) { danielebarchiesi@0: $buttons[] = drupal_render($form[$name][$button]); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Split checkboxes into rows with 3 columns. danielebarchiesi@0: $total = count($buttons); danielebarchiesi@0: $rows = array(); danielebarchiesi@0: for ($i = 0; $i < $total; $i += 3) { danielebarchiesi@0: $row = array(); danielebarchiesi@0: $row_buttons = array_slice($buttons, $i, 3) + array_fill(0, 3, array()); danielebarchiesi@0: foreach ($row_buttons as $row_button) { danielebarchiesi@0: $row[] = array('data' => $row_button); danielebarchiesi@0: } danielebarchiesi@0: $rows[] = $row; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $output = theme('table', array('rows' => $rows, 'attributes' => array('width' => '100%'))); danielebarchiesi@0: danielebarchiesi@0: return $output; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Display overview of setup Wysiwyg Editor profiles; menu callback. danielebarchiesi@0: */ danielebarchiesi@0: function wysiwyg_profile_overview($form, &$form_state) { danielebarchiesi@0: include_once './includes/install.inc'; danielebarchiesi@0: danielebarchiesi@0: // Check which wysiwyg editors are installed. danielebarchiesi@0: $editors = wysiwyg_get_all_editors(); danielebarchiesi@0: $count = count($editors); danielebarchiesi@0: $status = array(); danielebarchiesi@0: $options = array('' => t('No editor')); danielebarchiesi@0: danielebarchiesi@0: // D7's seven theme displays links in table headers as block elements. danielebarchiesi@0: drupal_add_css('table.system-status-report th a {display: inline;}', 'inline'); danielebarchiesi@0: danielebarchiesi@0: foreach ($editors as $name => $editor) { danielebarchiesi@0: $status[$name] = array( danielebarchiesi@0: 'severity' => (isset($editor['error']) ? REQUIREMENT_ERROR : ($editor['installed'] ? REQUIREMENT_OK : REQUIREMENT_INFO)), danielebarchiesi@0: 'title' => t('@editor (Download)', array('!vendor-url' => $editor['vendor url'], '@editor' => $editor['title'], '!download-url' => $editor['download url'])), danielebarchiesi@0: 'value' => (isset($editor['installed version']) ? $editor['installed version'] : t('Not installed.')), danielebarchiesi@0: 'description' => (isset($editor['error']) ? $editor['error'] : ''), danielebarchiesi@0: ); danielebarchiesi@0: if ($editor['installed']) { danielebarchiesi@0: $options[$name] = $editor['title'] . (isset($editor['installed version']) ? ' ' . $editor['installed version'] : ''); danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: // Build on-site installation instructions. danielebarchiesi@0: // @todo Setup $library in wysiwyg_load_editor() already. danielebarchiesi@0: $library = (isset($editor['library']) ? $editor['library'] : key($editor['libraries'])); danielebarchiesi@0: $targs = array( danielebarchiesi@0: '@editor-path' => $editor['editor path'], danielebarchiesi@0: '@library-filepath' => $editor['library path'] . '/' . (isset($editor['libraries'][$library]['files'][0]) ? $editor['libraries'][$library]['files'][0] : key($editor['libraries'][$library]['files'])), danielebarchiesi@0: ); danielebarchiesi@0: $instructions = '

' . t('Extract the archive and copy its contents into a new folder in the following location:
@editor-path', $targs) . '

'; danielebarchiesi@0: $instructions .= '

' . t('So the actual library can be found at:
@library-filepath', $targs) . '

'; danielebarchiesi@0: danielebarchiesi@0: // Add any install notes. danielebarchiesi@0: if (!empty($editor['install note callback']) && function_exists($editor['install note callback'])) { danielebarchiesi@0: $instructions .= '
' . $editor['install note callback']() . '
'; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $status[$name]['description'] .= $instructions; danielebarchiesi@0: $count--; danielebarchiesi@0: } danielebarchiesi@0: // In case there is an error, always show installation instructions. danielebarchiesi@0: if (isset($editor['error'])) { danielebarchiesi@0: $show_instructions = TRUE; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: if (!$count) { danielebarchiesi@0: $show_instructions = TRUE; danielebarchiesi@0: } danielebarchiesi@0: $form['status'] = array( danielebarchiesi@0: '#type' => 'fieldset', danielebarchiesi@0: '#title' => t('Installation instructions'), danielebarchiesi@0: '#collapsible' => TRUE, danielebarchiesi@0: '#collapsed' => !isset($show_instructions), danielebarchiesi@0: '#description' => (!$count ? t('There are no editor libraries installed currently. The following list contains a list of currently supported editors:') : ''), danielebarchiesi@0: '#weight' => 10, danielebarchiesi@0: ); danielebarchiesi@0: $form['status']['report'] = array('#markup' => theme('status_report', array('requirements' => $status))); danielebarchiesi@0: danielebarchiesi@0: if (!$count) { danielebarchiesi@0: return $form; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $formats = filter_formats(); danielebarchiesi@0: $profiles = wysiwyg_profile_load_all(); danielebarchiesi@0: $form['formats'] = array( danielebarchiesi@0: '#type' => 'item', danielebarchiesi@0: '#description' => t('To assign a different editor to a text format, click "delete" to remove the existing first.'), danielebarchiesi@0: '#tree' => TRUE, danielebarchiesi@0: ); danielebarchiesi@0: danielebarchiesi@0: $enable_save = FALSE; danielebarchiesi@0: foreach ($formats as $id => $format) { danielebarchiesi@0: $form['formats'][$id]['name'] = array( danielebarchiesi@0: '#markup' => check_plain($format->name), danielebarchiesi@0: ); danielebarchiesi@0: // Only display editor selection for associated input formats to avoid danielebarchiesi@0: // confusion about disabled selection. danielebarchiesi@0: if (isset($profiles[$id]) && !empty($profiles[$id]->editor)) { danielebarchiesi@0: $editor_name = $profiles[$id]->editor; danielebarchiesi@0: $installed = !empty($editors[$editor_name]['installed']); danielebarchiesi@0: $form['formats'][$id]['editor'] = array( danielebarchiesi@0: '#wysiwyg-editor-name' => $editor_name, danielebarchiesi@0: ); danielebarchiesi@0: if ($installed) { danielebarchiesi@0: $form['formats'][$id]['editor']['#markup'] = $options[$editor_name]; danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: drupal_set_message(t('Missing %editor library for %format format. Re-install the %editor library or delete the editor profile.', array( danielebarchiesi@0: '%editor' => $editors[$editor_name]['title'], danielebarchiesi@0: '%format' => $format->name, danielebarchiesi@0: )), 'warning'); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: $form['formats'][$id]['editor'] = array( danielebarchiesi@0: '#type' => 'select', danielebarchiesi@0: '#default_value' => '', danielebarchiesi@0: '#options' => $options, danielebarchiesi@0: ); danielebarchiesi@0: $enable_save = TRUE; danielebarchiesi@0: } danielebarchiesi@0: if (isset($profiles[$id]) && !empty($profiles[$id]->editor)) { danielebarchiesi@0: $form['formats'][$id]['edit'] = array( danielebarchiesi@0: '#markup' => l(t('Edit'), "admin/config/content/wysiwyg/profile/$id/edit"), danielebarchiesi@0: ); danielebarchiesi@0: $form['formats'][$id]['delete'] = array( danielebarchiesi@0: '#markup' => l(t('Delete'), "admin/config/content/wysiwyg/profile/$id/delete"), danielebarchiesi@0: ); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Submitting the form when no editors can be selected causes errors. danielebarchiesi@0: if ($enable_save) { danielebarchiesi@0: $form['submit'] = array('#type' => 'submit', '#value' => t('Save')); danielebarchiesi@0: } danielebarchiesi@0: return $form; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Return HTML for the Wysiwyg profile overview form. danielebarchiesi@0: */ danielebarchiesi@0: function theme_wysiwyg_profile_overview($variables) { danielebarchiesi@0: $form = $variables['form']; danielebarchiesi@0: if (!isset($form['formats'])) { danielebarchiesi@0: return; danielebarchiesi@0: } danielebarchiesi@0: $editors = wysiwyg_get_all_editors(); danielebarchiesi@0: $output = ''; danielebarchiesi@0: $header = array(t('Text format'), t('Editor'), array('data' => t('Operations'), 'colspan' => 2)); danielebarchiesi@0: $rows = array(); danielebarchiesi@0: foreach (element_children($form['formats']) as $item) { danielebarchiesi@0: $format = &$form['formats'][$item]; danielebarchiesi@0: $row = array( danielebarchiesi@0: 'data' => array( danielebarchiesi@0: drupal_render($format['name']), danielebarchiesi@0: drupal_render($format['editor']), danielebarchiesi@0: isset($format['edit']) ? drupal_render($format['edit']) : '', danielebarchiesi@0: isset($format['delete']) ? drupal_render($format['delete']) : '', danielebarchiesi@0: ), danielebarchiesi@0: ); danielebarchiesi@0: if (empty($row['data'][1])) { danielebarchiesi@0: $row['data'][1] = array( danielebarchiesi@0: 'data' => t('Missing library: @library', array('@library' => $editors[$format['editor']['#wysiwyg-editor-name']]['title'])), danielebarchiesi@0: 'class' => 'error', danielebarchiesi@0: ); danielebarchiesi@0: $row['class'] = array('error'); danielebarchiesi@0: } danielebarchiesi@0: $rows[] = $row; danielebarchiesi@0: } danielebarchiesi@0: $form['formats']['table']['#markup'] = theme('table', array('header' => $header, 'rows' => $rows)); danielebarchiesi@0: $output .= drupal_render_children($form); danielebarchiesi@0: return $output; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Submit callback for Wysiwyg profile overview form. danielebarchiesi@0: */ danielebarchiesi@0: function wysiwyg_profile_overview_submit($form, &$form_state) { danielebarchiesi@0: foreach ($form_state['values']['formats'] as $format => $values) { danielebarchiesi@0: db_merge('wysiwyg') danielebarchiesi@0: ->key(array('format' => $format)) danielebarchiesi@0: ->fields(array( danielebarchiesi@0: 'editor' => $values['editor'], danielebarchiesi@0: )) danielebarchiesi@0: ->execute(); danielebarchiesi@0: } danielebarchiesi@0: wysiwyg_profile_cache_clear(); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Delete editor profile confirmation form. danielebarchiesi@0: */ danielebarchiesi@0: function wysiwyg_profile_delete_confirm($form, &$form_state, $profile) { danielebarchiesi@0: $formats = filter_formats(); danielebarchiesi@0: $format = $formats[$profile->format]; danielebarchiesi@0: $form['format'] = array('#type' => 'value', '#value' => $format); danielebarchiesi@0: return confirm_form( danielebarchiesi@0: $form, danielebarchiesi@0: t('Are you sure you want to remove the profile for %name?', array('%name' => $format->name)), danielebarchiesi@0: 'admin/config/content/wysiwyg', danielebarchiesi@0: t('This action cannot be undone.'), t('Remove'), t('Cancel') danielebarchiesi@0: ); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Submit callback for Wysiwyg profile delete form. danielebarchiesi@0: * danielebarchiesi@0: * @see wysiwyg_profile_delete_confirm() danielebarchiesi@0: */ danielebarchiesi@0: function wysiwyg_profile_delete_confirm_submit($form, &$form_state) { danielebarchiesi@0: $format = $form_state['values']['format']; danielebarchiesi@0: wysiwyg_profile_delete($format->format); danielebarchiesi@0: wysiwyg_profile_cache_clear(); danielebarchiesi@0: danielebarchiesi@0: drupal_set_message(t('Wysiwyg profile for %name has been deleted.', array('%name' => $format->name))); danielebarchiesi@0: $form_state['redirect'] = 'admin/config/content/wysiwyg'; danielebarchiesi@0: }