summaryrefslogtreecommitdiffstats
path: root/wysiwyg.install
blob: 038ba46be781a7545f5e02a399217aed6c092b88 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
<?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,
    ));
  }
}