t('Stores Wysiwyg profiles.'), 'fields' => array( 'format' => array('type' => 'int', 'not null' => TRUE, 'default' => 0), 'editor' => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''), 'settings' => array('type' => 'text', 'size' => 'normal'), ), 'primary key' => array('format'), ); return $schema; } /** * Implementation of hook_install(). */ function wysiwyg_install() { drupal_install_schema('wysiwyg'); } /** * Implementation of hook_uninstall() */ function wysiwyg_uninstall() { drupal_uninstall_schema('wysiwyg'); } /** * Implementation of hook_enable(). */ function wysiwyg_enable() { // Disable conflicting, obsolete editor integration modules whenever this // module is enabled. This is crude, but the only way to ensure no conflicts. module_disable(array( 'editarea', 'editonpro', 'editor', 'fckeditor', 'freerte', 'htmlarea', 'htmlbox', 'jwysiwyg', 'markitup', 'nicedit', 'openwysiwyg', 'pegoeditor', 'quicktext', 'tinymce', 'tinymce_autoconf', 'tinytinymce', 'whizzywig', 'widgeditor', 'wymeditor', 'xstandard', 'yui_editor', )); } /** * Retrieve a list of input formats to associate profiles to. */ function _wysiwyg_install_get_formats() { $formats = array(); $result = db_query("SELECT format, name FROM {filter_formats}"); while ($format = db_fetch_object($result)) { // Build a list of all formats. $formats[$format->format] = $format->name; // Fetch filters. $result2 = db_query("SELECT module, delta FROM {filters} WHERE format = %d", $format->format); while ($filter = db_fetch_object($result2)) { // If PHP filter is enabled, remove this format. if ($filter->module == 'php') { unset($formats[$format->format]); break; } } } return $formats; } /** * Associate Wysiwyg profiles with input formats. * * Since there was no association yet, we can only assume that there is one * profile only, and that profile must be duplicated and assigned to all input * formats (except PHP code format). Also, input formats already have * titles/names, so Wysiwyg profiles do not need an own. * * Because input formats are already granted to certain user roles only, we can * remove our custom Wysiwyg profile permissions. A 1:1 relationship between * input formats and permissions makes plugin_count obsolete, too. * * Since the resulting table is completely different, a new schema is installed. */ function wysiwyg_update_6001() { $ret = array(); if (db_table_exists('wysiwyg')) { return $ret; } // Install new schema. db_create_table($ret, 'wysiwyg', array( 'fields' => array( 'format' => array('type' => 'int', 'not null' => TRUE, 'default' => 0), 'editor' => array('type' => 'varchar', 'length' => 128, 'not null' => TRUE, 'default' => ''), 'settings' => array('type' => 'text', 'size' => 'normal'), ), 'primary key' => array('format'), )); // Fetch all input formats. $formats = _wysiwyg_install_get_formats(); // Fetch all profiles. $result = db_query("SELECT name, settings FROM {wysiwyg_profile}"); while ($profile = db_fetch_object($result)) { $profile->settings = unserialize($profile->settings); // Extract editor name from profile settings. $profile->editor = $profile->settings['editor']; // Clean-up. unset($profile->settings['editor']); unset($profile->settings['old_name']); unset($profile->settings['name']); unset($profile->settings['rids']); // Sorry. There Can Be Only One. ;) break; } if ($profile) { // Rebuild profiles and associate with input formats. foreach ($formats as $format => $name) { // Insert profiles. // We can't use update_sql() here because of curly braces in serialized // array. db_query("INSERT INTO {wysiwyg} (format, editor, settings) VALUES (%d, '%s', '%s')", $format, $profile->editor, serialize($profile->settings)); $ret[] = array( 'success' => TRUE, 'query' => strtr('Wysiwyg profile %profile converted and associated with input format %format.', array('%profile' => check_plain($profile->name), '%format' => check_plain($name))), ); } } // Drop obsolete tables {wysiwyg_profile} and {wysiwyg_role}. db_drop_table($ret, 'wysiwyg_profile'); db_drop_table($ret, 'wysiwyg_role'); return $ret; } /** * Clear JS/CSS caches to ensure that clients load fresh copies. */ function wysiwyg_update_6200() { $ret = array(); // Change query-strings on css/js files to enforce reload for all users. _drupal_flush_css_js(); drupal_clear_css_cache(); drupal_clear_js_cache(); // Rebuild the menu to remove old admin/settings/wysiwyg/profile item. menu_rebuild(); // Flush content caches. cache_clear_all(); $ret[] = array( 'success' => TRUE, 'query' => 'Caches have been flushed.', ); return $ret; }