Project

General

Profile

Paste
Download (15.4 KB) Statistics
| Branch: | Revision:

root / drupal7 / modules / filter / filter.install @ 27e02aed

1
<?php
2

    
3
/**
4
 * @file
5
 * Install, update, and uninstall functions for the Filter module.
6
 */
7

    
8
/**
9
 * Implements hook_schema().
10
 */
11
function filter_schema() {
12
  $schema['filter'] = array(
13
    'description' => 'Table that maps filters (HTML corrector) to text formats (Filtered HTML).',
14
    'fields' => array(
15
      'format' => array(
16
        'type' => 'varchar',
17
        'length' => 255,
18
        'not null' => TRUE,
19
        'description' => 'Foreign key: The {filter_format}.format to which this filter is assigned.',
20
      ),
21
      'module' => array(
22
        'type' => 'varchar',
23
        'length' => 64,
24
        'not null' => TRUE,
25
        'default' => '',
26
        'description' => 'The origin module of the filter.',
27
      ),
28
      'name' => array(
29
        'type' => 'varchar',
30
        'length' => 32,
31
        'not null' => TRUE,
32
        'default' => '',
33
        'description' => 'Name of the filter being referenced.',
34
      ),
35
      'weight' => array(
36
        'type' => 'int',
37
        'not null' => TRUE,
38
        'default' => 0,
39
        'description' => 'Weight of filter within format.',
40
      ),
41
      'status' => array(
42
        'type' => 'int',
43
        'not null' => TRUE,
44
        'default' => 0,
45
        'description' => 'Filter enabled status. (1 = enabled, 0 = disabled)',
46
      ),
47
      'settings' => array(
48
        'type' => 'blob',
49
        'not null' => FALSE,
50
        'size' => 'big',
51
        'serialize' => TRUE,
52
        'description' => 'A serialized array of name value pairs that store the filter settings for the specific format.',
53
      ),
54
    ),
55
    'primary key' => array('format', 'name'),
56
    'indexes' => array(
57
      'list' => array('weight', 'module', 'name'),
58
    ),
59
  );
60
  $schema['filter_format'] = array(
61
    'description' => 'Stores text formats: custom groupings of filters, such as Filtered HTML.',
62
    'fields' => array(
63
      'format' => array(
64
        'type' => 'varchar',
65
        'length' => 255,
66
        'not null' => TRUE,
67
        'description' => 'Primary Key: Unique machine name of the format.',
68
      ),
69
      'name' => array(
70
        'type' => 'varchar',
71
        'length' => 255,
72
        'not null' => TRUE,
73
        'default' => '',
74
        'description' => 'Name of the text format (Filtered HTML).',
75
        'translatable' => TRUE,
76
      ),
77
      'cache' => array(
78
        'type' => 'int',
79
        'not null' => TRUE,
80
        'default' => 0,
81
        'size' => 'tiny',
82
        'description' => 'Flag to indicate whether format is cacheable. (1 = cacheable, 0 = not cacheable)',
83
      ),
84
      'status' => array(
85
        'type' => 'int',
86
        'unsigned' => TRUE,
87
        'not null' => TRUE,
88
        'default' => 1,
89
        'size' => 'tiny',
90
        'description' => 'The status of the text format. (1 = enabled, 0 = disabled)',
91
      ),
92
      'weight' => array(
93
        'type' => 'int',
94
        'not null' => TRUE,
95
        'default' => 0,
96
        'description' => 'Weight of text format to use when listing.',
97
      ),
98
    ),
99
    'primary key' => array('format'),
100
    'unique keys' => array(
101
      'name' => array('name'),
102
    ),
103
    'indexes' => array(
104
      'status_weight' => array('status', 'weight'),
105
    ),
106
  );
107

    
108
  $schema['cache_filter'] = drupal_get_schema_unprocessed('system', 'cache');
109
  $schema['cache_filter']['description'] = 'Cache table for the Filter module to store already filtered pieces of text, identified by text format and hash of the text.';
110

    
111
  return $schema;
112
}
113

    
114
/**
115
 * Implements hook_install().
116
 */
117
function filter_install() {
118
  // All sites require at least one text format (the fallback format) that all
119
  // users have access to, so add it here. We initialize it as a simple, safe
120
  // plain text format with very basic formatting, but it can be modified by
121
  // installation profiles to have other properties.
122
  $plain_text_format = array(
123
    'format' => 'plain_text',
124
    'name' => 'Plain text',
125
    'weight' => 10,
126
    'filters' => array(
127
      // Escape all HTML.
128
      'filter_html_escape' => array(
129
        'weight' => 0,
130
        'status' => 1,
131
      ),
132
      // URL filter.
133
      'filter_url' => array(
134
        'weight' => 1,
135
        'status' => 1,
136
      ),
137
      // Line break filter.
138
      'filter_autop' => array(
139
        'weight' => 2,
140
        'status' => 1,
141
      ),
142
    ),
143
  );
144
  $plain_text_format = (object) $plain_text_format;
145
  filter_format_save($plain_text_format);
146

    
147
  // Set the fallback format to plain text.
148
  variable_set('filter_fallback_format', $plain_text_format->format);
149
}
150

    
151
/**
152
 * Implements hook_update_dependencies().
153
 */
154
function filter_update_dependencies() {
155
  // filter_update_7005() migrates role permissions and therefore must run
156
  // after the {role} and {role_permission} tables are properly set up, which
157
  // happens in user_update_7007().
158
  $dependencies['filter'][7005] = array(
159
    'user' => 7007,
160
  );
161

    
162
  return $dependencies;
163
}
164
/**
165
 * @addtogroup updates-6.x-to-7.x
166
 * @{
167
 */
168

    
169
/**
170
 * Upgrade the {filter_formats} table and rename it to {filter_format}.
171
 */
172
function filter_update_7000() {
173
  db_rename_table('filter_formats', 'filter_format');
174

    
175
  // Add the new {filter_format}.status and {filter_format}.weight column.
176
  db_add_field('filter_format', 'status', array(
177
    'type' => 'int',
178
    'unsigned' => TRUE,
179
    'not null' => TRUE,
180
    'default' => 1,
181
    'size' => 'tiny',
182
    'description' => 'The status of the text format. (1 = enabled, 0 = disabled)',
183
  ));
184
  db_add_field('filter_format', 'weight', array(
185
    'type' => 'int',
186
    'not null' => TRUE,
187
    'default' => 0,
188
    'description' => 'Weight of text format to use when listing.',
189
  ), array(
190
    'indexes' => array(
191
      'status_weight' => array('status', 'weight'),
192
    ),
193
  ));
194
}
195

    
196
/**
197
 * Break out "escape HTML filter" option to its own filter.
198
 */
199
function filter_update_7001() {
200
  $result = db_query("SELECT format FROM {filter_format}")->fetchCol();
201
  $insert = db_insert('filters')->fields(array('format', 'module', 'delta', 'weight'));
202

    
203
  foreach ($result as $format_id) {
204
    // Deprecated constants FILTER_HTML_STRIP = 1 and FILTER_HTML_ESCAPE = 2.
205
    if (variable_get('filter_html_' . $format_id, 1) == 2) {
206
      $insert->values(array(
207
        'format' => $format_id,
208
        'module' => 'filter',
209
        'delta' => 4,
210
        'weight' => 0,
211
      ));
212
    }
213
    variable_del('filter_html_' . $format_id);
214
  }
215

    
216
  $insert->execute();
217
}
218

    
219
/**
220
 * Upgrade the {filter} table for core filters.
221
 */
222
function filter_update_7003() {
223
  // Duplicates the {filters} table since core cannot take care of the potential
224
  // contributed module filters.
225
  db_rename_table('filters', 'd6_upgrade_filter');
226
  // Creates the Drupal 7 filter table.
227
  $filter_table =  array(
228
    'description' => 'Table that maps filters (HTML corrector) to text formats (Filtered HTML).',
229
    'fields' => array(
230
      'format' => array(
231
        'type' => 'int',
232
        'not null' => TRUE,
233
        'default' => 0,
234
        'description' => 'Foreign key: The {filter_format}.format to which this filter is assigned.',
235
      ),
236
      'module' => array(
237
        'type' => 'varchar',
238
        'length' => 64,
239
        'not null' => TRUE,
240
        'default' => '',
241
        'description' => 'The origin module of the filter.',
242
      ),
243
      'name' => array(
244
        'type' => 'varchar',
245
        'length' => 32,
246
        'not null' => TRUE,
247
        'default' => '',
248
        'description' => 'Name of the filter being referenced.',
249
      ),
250
      'weight' => array(
251
        'type' => 'int',
252
        'not null' => TRUE,
253
        'default' => 0,
254
        'description' => 'Weight of filter within format.',
255
      ),
256
      'status' => array(
257
        'type' => 'int',
258
        'not null' => TRUE,
259
        'default' => 0,
260
        'description' => 'Filter enabled status. (1 = enabled, 0 = disabled)',
261
      ),
262
      'settings' => array(
263
        'type' => 'blob',
264
        'not null' => FALSE,
265
        'size' => 'big',
266
        'serialize' => TRUE,
267
        'description' => 'A serialized array of name value pairs that store the filter settings for the specific format.',
268
      ),
269
    ),
270
    'primary key' => array('format', 'name'),
271
    'indexes' => array(
272
      'list' => array('weight', 'module', 'name'),
273
    ),
274
  );
275
  db_create_table('filter', $filter_table);
276

    
277
  // Get an array of the renamed filter deltas, organized by module.
278
  $renamed_deltas = array(
279
    'filter' => array(
280
      '0' => 'filter_html',
281
      '1' => 'filter_autop',
282
      '2' => 'filter_url',
283
      '3' => 'filter_htmlcorrector',
284
      '4' => 'filter_html_escape',
285
    ),
286
    'php' => array(
287
      '0' => 'php_code',
288
    ),
289
  );
290

    
291
  // Loop through each filter and make changes to the core filter table by
292
  // each record from the old to the new table.
293
  foreach ($renamed_deltas as $module => $deltas) {
294
    foreach ($deltas as $old_delta => $new_name) {
295
      $query = db_select('d6_upgrade_filter')
296
        ->fields('d6_upgrade_filter', array('format', 'weight'))
297
        ->condition('module', $module)
298
        ->condition('delta', $old_delta)
299
        ->distinct();
300

    
301
      foreach ($query->execute() as $record) {
302
        // Port the filter settings.
303
        $settings = array();
304
        if ($new_name == 'filter_html') {
305
          if ($setting = variable_get("allowed_html_{$record->format}", NULL)) {
306
            $settings['allowed_html'] = $setting;
307
            variable_del("allowed_html_{$record->format}");
308
          }
309
          if ($setting = variable_get("filter_html_help_{$record->format}", NULL)) {
310
            $settings['filter_html_help'] = $setting;
311
            variable_del("filter_html_help_{$record->format}");
312
          }
313
          if ($setting = variable_get("filter_html_nofollow_{$record->format}", NULL)) {
314
            $settings['filter_html_nofollow'] = $setting;
315
            variable_del("filter_html_nofollow_{$record->format}");
316
          }
317
        }
318
        elseif ($new_name == 'filter_url') {
319
          if ($setting = variable_get("filter_url_length_{$record->format}", NULL)) {
320
            $settings['filter_url_length'] = $setting;
321
            variable_del("filter_url_length_{$record->format}");
322
          }
323
        }
324

    
325
        db_insert('filter')
326
          ->fields(array(
327
            'format' => $record->format,
328
            'module' => $module,
329
            'name' => $new_name,
330
            'weight' => $record->weight,
331
            'settings' => serialize($settings),
332
            'status' => 1,
333
          ))
334
          ->execute();
335
      }
336
      db_delete('d6_upgrade_filter')
337
        ->condition('module', $module)
338
        ->condition('delta', $old_delta)
339
        ->execute();
340
    }
341
  }
342
}
343

    
344
/**
345
 * Integrate text formats with the user permissions system.
346
 *
347
 * This function converts text format role assignments to use the new text
348
 * format permissions introduced in Drupal 7, creates a fallback (plain text)
349
 * format that is available to all users, and explicitly sets the text format
350
 * in cases that used to rely on a single site-wide default.
351
 */
352
function filter_update_7005() {
353
  // Move role data from the filter system to the user permission system.
354
  $all_roles = array_keys(user_roles());
355
  $default_format = variable_get('filter_default_format', 1);
356
  $result = db_query("SELECT * FROM {filter_format}");
357
  foreach ($result as $format) {
358
    // We need to assign the default format to all roles (regardless of what
359
    // was stored in the database) to preserve the behavior of the site at the
360
    // moment of the upgrade.
361
    $format_roles = ($format->format == $default_format ? $all_roles : explode(',', $format->roles));
362
    foreach ($format_roles as $format_role) {
363
      if (in_array($format_role, $all_roles)) {
364
        _update_7000_user_role_grant_permissions($format_role, array('use text format ' . $format->format), 'filter');
365
      }
366
    }
367
  }
368

    
369
  // Drop the roles field from the {filter_format} table.
370
  db_drop_field('filter_format', 'roles');
371

    
372
  // Add a fallback text format which outputs plain text and appears last on
373
  // the list for all users. Generate a unique name for it, starting with
374
  // "Plain text".
375
  $start_name = 'Plain text';
376
  $format_name = $start_name;
377
  while ($format = db_query('SELECT format FROM {filter_format} WHERE name = :name', array(':name' => $format_name))->fetchField()) {
378
    $id = empty($id) ? 2 : $id + 1;
379
    $format_name = $start_name . ' ' . $id;
380
  }
381

    
382
  // Insert the filter format.
383
  $format_id = db_insert('filter_format')
384
    ->fields(array(
385
      'name' => $format_name,
386
      'cache' => 1,
387
      'weight' => 1,
388
      'status' => 1,
389
    ))
390
    ->execute();
391

    
392
  // This format should output plain text, so we escape all HTML and apply the
393
  // line break and URL filters only.
394
  db_insert('filter')
395
    ->fields(array(
396
      'format',
397
      'name',
398
      'weight',
399
      'status',
400
      'module',
401
      'settings',
402
    ))
403
    ->values(array(
404
      'format' => $format_id,
405
      'name' => 'filter_html_escape',
406
      'weight' => 0,
407
      'status' => 1,
408
      'module' => 'filter',
409
      'settings' => serialize(array()),
410
    ))
411
    ->values(array(
412
      'format' => $format_id,
413
      'name' => 'filter_url',
414
      'weight' => 1,
415
      'status' => 1,
416
      'module' => 'filter',
417
      'settings' => serialize(array()),
418
    ))
419
    ->values(array(
420
      'format' => $format_id,
421
      'name' => 'filter_autop',
422
      'weight' => 2,
423
      'status' => 1,
424
      'module' => 'filter',
425
      'settings' => serialize(array()),
426
    ))
427
    ->execute();
428

    
429
  variable_set('filter_fallback_format', $format_id);
430
  drupal_set_message('A new <em>Plain text</em> format has been created which will be available to all users. You can configure this text format on the <a href="' . url('admin/config/content/formats/' . $format) . '">text format configuration page</a>.');
431

    
432
  // Move the former site-wide default text format to the top of the list, so
433
  // that it continues to be the default text format for all users.
434
  db_update('filter_format')
435
    ->fields(array('weight' => -1))
436
    ->condition('format', $default_format)
437
    ->execute();
438

    
439
  // We do not delete the 'filter_default_format' variable, since other modules
440
  // need it in their update functions; for an example, see user_update_7010().
441
  // @todo This variable can be deleted in Drupal 8.
442
}
443

    
444
/**
445
 * Grant usage of all text formats to user roles having the 'administer filters' permission.
446
 */
447
function filter_update_7008() {
448
  // Build the list of permissions to grant.
449
  $permissions = array();
450
  foreach (db_query('SELECT format FROM {filter_format}')->fetchCol() as $format_id) {
451
    if ($format_id != variable_get('filter_fallback_format')) {
452
      $permissions[] = 'use text format ' . $format_id;
453
    }
454
  }
455
  // Grant text format permissions to all roles that can 'administer filters'.
456
  // Albeit anonymous users *should not* have the permission, we cannot presume
457
  // that they do not or must not.
458
  if ($roles = user_roles(FALSE, 'administer filters')) {
459
    foreach ($roles as $rid => $name) {
460
      _update_7000_user_role_grant_permissions($rid, $permissions, 'filter');
461
    }
462
  }
463
}
464

    
465
/**
466
 * Converts fields that store serialized variables from text to blob.
467
 */
468
function filter_update_7009() {
469
  $schema = system_schema_cache_7054();
470
  db_drop_table('cache_filter');
471
  db_create_table('cache_filter', $schema);
472
}
473

    
474
/**
475
 * Change {filter_format}.format and {filter}.format into varchar.
476
 */
477
function filter_update_7010() {
478
  db_change_field('filter_format', 'format', 'format', array(
479
    'type' => 'varchar',
480
    'length' => 255,
481
    'not null' => TRUE,
482
    'description' => 'Primary Key: Unique machine name of the format.',
483
  ));
484
  db_change_field('filter', 'format', 'format', array(
485
    'type' => 'varchar',
486
    'length' => 255,
487
    'not null' => TRUE,
488
    'description' => 'Foreign key: The {filter_format}.format to which this filter is assigned.',
489
  ));
490
}
491

    
492
/**
493
 * @} End of "addtogroup updates-6.x-to-7.x".
494
 */