313 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			313 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
/**
 | 
						|
 * @file
 | 
						|
 * Installation functions for Wysiwyg module.
 | 
						|
 */
 | 
						|
 | 
						|
/**
 | 
						|
 * Implementation of hook_schema().
 | 
						|
 */
 | 
						|
function wysiwyg_schema() {
 | 
						|
  $schema['wysiwyg'] = array(
 | 
						|
    'description' => 'Stores Wysiwyg profiles.',
 | 
						|
    'fields' => array(
 | 
						|
      'format' => array(
 | 
						|
        'description' => 'The {filter_format}.format of the text format.',
 | 
						|
        'type' => 'varchar',
 | 
						|
        'length' => 255,
 | 
						|
        // Primary keys are implicitly not null.
 | 
						|
        'not null' => TRUE,
 | 
						|
      ),
 | 
						|
      'editor' => array(
 | 
						|
        'description' => 'Internal name of the editor attached to the text format.',
 | 
						|
        'type' => 'varchar',
 | 
						|
        'length' => 128,
 | 
						|
        'not null' => TRUE,
 | 
						|
        'default' => '',
 | 
						|
      ),
 | 
						|
      'settings' => array(
 | 
						|
        'description' => 'Configuration settings for the editor.',
 | 
						|
        'type' => 'text',
 | 
						|
        'size' => 'normal',
 | 
						|
      ),
 | 
						|
    ),
 | 
						|
    'primary key' => array('format'),
 | 
						|
    'foreign keys' => array(
 | 
						|
      'format' => array(
 | 
						|
        'table' => 'filter_format',
 | 
						|
        'columns' => array('format' => 'format'),
 | 
						|
      ),
 | 
						|
    ),
 | 
						|
  );
 | 
						|
  $schema['wysiwyg_user'] = array(
 | 
						|
    'description' => 'Stores user preferences for wysiwyg profiles.',
 | 
						|
    'fields' => array(
 | 
						|
      'uid' => array(
 | 
						|
        'description' => 'The {users}.uid of the user.',
 | 
						|
        'type' => 'int',
 | 
						|
        'unsigned' => TRUE,
 | 
						|
        'not null' => TRUE,
 | 
						|
        'default' => 0,
 | 
						|
      ),
 | 
						|
      'format' => array(
 | 
						|
        'description' => 'The {filter_format}.format of the text format.',
 | 
						|
        'type' => 'varchar',
 | 
						|
        'length' => 255,
 | 
						|
        'not null' => FALSE,
 | 
						|
      ),
 | 
						|
      'status' => array(
 | 
						|
        'description' => 'Boolean indicating whether the format is enabled by default.',
 | 
						|
        'type' => 'int',
 | 
						|
        'unsigned' => TRUE,
 | 
						|
        'not null' => TRUE,
 | 
						|
        'default' => 0,
 | 
						|
        'size' => 'tiny',
 | 
						|
      ),
 | 
						|
    ),
 | 
						|
    'indexes' => array(
 | 
						|
      'uid' => array('uid'),
 | 
						|
      'format' => array('format'),
 | 
						|
    ),
 | 
						|
    'foreign keys' => array(
 | 
						|
      'uid' => array(
 | 
						|
        'table' => 'users',
 | 
						|
        'columns' => array('uid' => 'uid'),
 | 
						|
      ),
 | 
						|
      'format' => array(
 | 
						|
        'table' => 'filter_format',
 | 
						|
        'columns' => array('format' => 'format'),
 | 
						|
      ),
 | 
						|
    ),
 | 
						|
  );
 | 
						|
  return $schema;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * 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(
 | 
						|
    'ckeditor',
 | 
						|
    'editarea',
 | 
						|
    'editonpro',
 | 
						|
    'editor',
 | 
						|
    'fckeditor',
 | 
						|
    'freerte',
 | 
						|
    'htmlarea',
 | 
						|
    'htmlbox',
 | 
						|
    'jwysiwyg',
 | 
						|
    'markitup',
 | 
						|
    'nicedit',
 | 
						|
    'openwysiwyg',
 | 
						|
    'pegoeditor',
 | 
						|
    'quicktext',
 | 
						|
    'tinymce',
 | 
						|
    'tinymce_autoconf',
 | 
						|
    'tinytinymce',
 | 
						|
    'whizzywig',
 | 
						|
    'widgeditor',
 | 
						|
    'wymeditor',
 | 
						|
    'xstandard',
 | 
						|
    'yui_editor',
 | 
						|
  ));
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Implements hook_update_dependencies().
 | 
						|
 */
 | 
						|
function wysiwyg_update_dependencies() {
 | 
						|
  // Ensure that format columns are only changed after Filter module has changed
 | 
						|
  // the primary records.
 | 
						|
  $dependencies['wysiwyg'][7000] = array(
 | 
						|
    'filter' => 7010,
 | 
						|
  );
 | 
						|
 | 
						|
  return $dependencies;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * 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;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Change {wysiwyg}.format into a string.
 | 
						|
 */
 | 
						|
function wysiwyg_update_7000() {
 | 
						|
  db_drop_primary_key('wysiwyg');
 | 
						|
  db_change_field('wysiwyg', 'format', 'format', array(
 | 
						|
    'type' => 'varchar',
 | 
						|
    'length' => 255,
 | 
						|
    'not null' => TRUE,
 | 
						|
  ));
 | 
						|
  db_add_primary_key('wysiwyg', array('format'));
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Create the {wysiwyg_user} table.
 | 
						|
 */
 | 
						|
function wysiwyg_update_7200() {
 | 
						|
  if (!db_table_exists('wysiwyg_user')) {
 | 
						|
    db_create_table('wysiwyg_user', array(
 | 
						|
      'description' => 'Stores user preferences for wysiwyg profiles.',
 | 
						|
      'fields' => array(
 | 
						|
        'uid' => array(
 | 
						|
          'description' => 'The {users}.uid of the user.',
 | 
						|
          'type' => 'int',
 | 
						|
          'unsigned' => TRUE,
 | 
						|
          'not null' => TRUE,
 | 
						|
          'default' => 0,
 | 
						|
        ),
 | 
						|
        'format' => array(
 | 
						|
          'description' => 'The {filter_format}.format of the text format.',
 | 
						|
          'type' => 'varchar',
 | 
						|
          'length' => 255,
 | 
						|
          'not null' => FALSE,
 | 
						|
        ),
 | 
						|
        'status' => array(
 | 
						|
          'description' => 'Boolean indicating whether the format is enabled by default.',
 | 
						|
          'type' => 'int',
 | 
						|
          'unsigned' => TRUE,
 | 
						|
          'not null' => TRUE,
 | 
						|
          'default' => 0,
 | 
						|
          'size' => 'tiny',
 | 
						|
        ),
 | 
						|
      ),
 | 
						|
      'indexes' => array(
 | 
						|
        'uid' => array('uid'),
 | 
						|
        'format' => array('format'),
 | 
						|
      ),
 | 
						|
      'foreign keys' => array(
 | 
						|
        'uid' => array(
 | 
						|
          'table' => 'users',
 | 
						|
          'columns' => array('uid' => 'uid'),
 | 
						|
        ),
 | 
						|
        'format' => array(
 | 
						|
          'table' => 'filter_format',
 | 
						|
          'columns' => array('format' => 'format'),
 | 
						|
        ),
 | 
						|
      ),
 | 
						|
    ));
 | 
						|
  }
 | 
						|
  else {
 | 
						|
    db_change_field('wysiwyg_user', 'format', 'format', array(
 | 
						|
      'description' => 'The {filter_format}.format of the text format.',
 | 
						|
      'type' => 'varchar',
 | 
						|
      'length' => 255,
 | 
						|
      'not null' => FALSE,
 | 
						|
    ));
 | 
						|
  }
 | 
						|
}
 |