diff --git a/modules/block/block.module b/modules/block/block.module index 3df293701ee26c49c0095a54d80f7dfe7c2980c7..e7eed75546a6640d9110afde8c8250fe156b8f4d 100644 --- a/modules/block/block.module +++ b/modules/block/block.module @@ -954,16 +954,6 @@ function block_user_role_delete($role) { ->execute(); } -/** - * Implements hook_filter_format_delete(). - */ -function block_filter_format_delete($format, $fallback) { - db_update('block_custom') - ->fields(array('format' => $fallback->format)) - ->condition('format', $format->format) - ->execute(); -} - /** * Implements hook_menu_delete(). */ diff --git a/modules/field/modules/text/text.module b/modules/field/modules/text/text.module index 1399bcdbd2c0758db88bb3e400e5cce31a085cfb..16de61de5a0511c1bf91a8071c1678abf3c7695c 100644 --- a/modules/field/modules/text/text.module +++ b/modules/field/modules/text/text.module @@ -600,16 +600,13 @@ function text_field_prepare_translation($entity_type, $entity, $field, $instance /** * Implements hook_filter_format_update(). */ -function text_filter_format_update() { +function text_filter_format_update($format) { field_cache_clear(); } /** - * Implements hook_filter_format_delete(). - * - * @todo D8: Properly update filter format references in all fields. See - * http://drupal.org/node/556022 for details. + * Implements hook_filter_format_disable(). */ -function text_filter_format_delete() { +function text_filter_format_disable($format) { field_cache_clear(); } diff --git a/modules/field/modules/text/text.test b/modules/field/modules/text/text.test index 67aad26b033f3ac2e61e14c662628f989c0807f8..9256277d9e0ec4af8ea8afd47cc668fa4e71e305 100644 --- a/modules/field/modules/text/text.test +++ b/modules/field/modules/text/text.test @@ -163,11 +163,11 @@ class TextFieldTestCase extends DrupalWebTestCase { field_create_instance($this->instance); $langcode = LANGUAGE_NONE; - // Delete all text formats besides the plain text fallback format. + // Disable all text formats besides the plain text fallback format. $this->drupalLogin($this->admin_user); foreach (filter_formats() as $format) { if ($format->format != filter_fallback_format()) { - $this->drupalPost('admin/config/content/formats/' . $format->format . '/delete', array(), t('Delete')); + $this->drupalPost('admin/config/content/formats/' . $format->format . '/disable', array(), t('Disable')); } } $this->drupalLogin($this->web_user); diff --git a/modules/filter/filter.admin.inc b/modules/filter/filter.admin.inc index 008b2391e71f079859799ca7587f1a64915a9ed7..9464f98d0f14a918bcbb6b5d8d2982a9e6fa4222 100644 --- a/modules/filter/filter.admin.inc +++ b/modules/filter/filter.admin.inc @@ -20,7 +20,7 @@ function filter_admin_overview($form) { $form['#tree'] = TRUE; foreach ($formats as $id => $format) { // Check whether this is the fallback text format. This format is available - // to all roles and cannot be deleted via the admin interface. + // to all roles and cannot be disabled via the admin interface. $form['formats'][$id]['#is_fallback'] = ($id == $fallback_format); if ($form['formats'][$id]['#is_fallback']) { $form['formats'][$id]['name'] = array('#markup' => drupal_placeholder($format->name)); @@ -33,7 +33,7 @@ function filter_admin_overview($form) { } $form['formats'][$id]['roles'] = array('#markup' => $roles_markup); $form['formats'][$id]['configure'] = array('#type' => 'link', '#title' => t('configure'), '#href' => 'admin/config/content/formats/' . $id); - $form['formats'][$id]['delete'] = array('#type' => 'link', '#title' => t('delete'), '#href' => 'admin/config/content/formats/' . $id . '/delete', '#access' => !$form['formats'][$id]['#is_fallback']); + $form['formats'][$id]['disable'] = array('#type' => 'link', '#title' => t('disable'), '#href' => 'admin/config/content/formats/' . $id . '/disable', '#access' => !$form['formats'][$id]['#is_fallback']); $form['formats'][$id]['weight'] = array('#type' => 'weight', '#default_value' => $format->weight); } $form['actions'] = array('#type' => 'actions'); @@ -76,7 +76,7 @@ function theme_filter_admin_overview($variables) { drupal_render($form['formats'][$id]['roles']), drupal_render($form['formats'][$id]['weight']), drupal_render($form['formats'][$id]['configure']), - drupal_render($form['formats'][$id]['delete']), + drupal_render($form['formats'][$id]['disable']), ), 'class' => array('draggable'), ); @@ -317,40 +317,26 @@ function filter_admin_format_form_submit($form, &$form_state) { * Menu callback; confirm deletion of a format. * * @ingroup forms - * @see filter_admin_delete_submit() + * @see filter_admin_disable_submit() */ -function filter_admin_delete($form, &$form_state, $format) { +function filter_admin_disable($form, &$form_state, $format) { $form['#format'] = $format; - $fallback_options = array(); - foreach (filter_formats() as $id => $fallback_format) { - if ($id != $format->format) { - $fallback_options[$id] = $fallback_format->name; - } - } - $form['fallback'] = array( - '#type' => 'select', - '#title' => t('Replacement text format'), - '#options' => $fallback_options, - '#default_value' => filter_fallback_format(), - '#description' => t('Content assigned to the deleted text format will be reassigned to the chosen one.'), - ); - return confirm_form($form, - t('Are you sure you want to delete the text format %format?', array('%format' => $format->name)), + t('Are you sure you want to disable the text format %format?', array('%format' => $format->name)), 'admin/config/content/formats', - NULL, - t('Delete') + t('This action cannot be undone.'), + t('Disable') ); } /** - * Process filter delete form submission. + * Process filter disable form submission. */ -function filter_admin_delete_submit($form, &$form_state) { +function filter_admin_disable_submit($form, &$form_state) { $format = $form['#format']; - filter_format_delete($format, $form_state['values']['fallback']); - drupal_set_message(t('Deleted text format %format.', array('%format' => $format->name))); + filter_format_disable($format); + drupal_set_message(t('Disabled text format %format.', array('%format' => $format->name))); $form_state['redirect'] = 'admin/config/content/formats'; } diff --git a/modules/filter/filter.api.php b/modules/filter/filter.api.php index cffcf272eac8d4dd8b59c387846a46f03622f986..399d564a13aaedd12846a8b64dcd646707f748a0 100644 --- a/modules/filter/filter.api.php +++ b/modules/filter/filter.api.php @@ -209,7 +209,7 @@ function hook_filter_info_alter(&$info) { * The format object of the format being updated. * * @see hook_filter_format_update() - * @see hook_filter_format_delete() + * @see hook_filter_format_disable() */ function hook_filter_format_insert($format) { mymodule_cache_rebuild(); @@ -226,34 +226,23 @@ function hook_filter_format_insert($format) { * The format object of the format being updated. * * @see hook_filter_format_insert() - * @see hook_filter_format_delete() + * @see hook_filter_format_disable() */ function hook_filter_format_update($format) { mymodule_cache_rebuild(); } /** - * Perform actions when a text format has been deleted. - * - * All modules storing references to text formats have to implement this hook. - * - * When a text format is deleted, all content that previously had that format - * assigned needs to be switched to the passed fallback format. + * Perform actions when a text format has been disabled. * * @param $format - * The format object of the format being deleted. - * @param $fallback - * The format object of the format to use as replacement. + * The format object of the format being disabled. * * @see hook_filter_format_insert() * @see hook_filter_format_update() */ -function hook_filter_format_delete($format, $fallback) { - // Replace the deleted format with the fallback format. - db_update('my_module_table') - ->fields(array('format' => $fallback->format)) - ->condition('format', $format->format) - ->execute(); +function hook_filter_format_disable($format) { + mymodule_cache_rebuild(); } /** diff --git a/modules/filter/filter.install b/modules/filter/filter.install index 52334a4fad1cd6e21bb934aef1eac2869ba00591..534b9296a58aa20035e18385ca274d7e80d9245c 100644 --- a/modules/filter/filter.install +++ b/modules/filter/filter.install @@ -81,19 +81,27 @@ function filter_schema() { 'size' => 'tiny', 'description' => 'Flag to indicate whether format is cacheable. (1 = cacheable, 0 = not cacheable)', ), + 'status' => array( + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'default' => 1, + 'size' => 'tiny', + 'description' => 'The status of the text format. (1 = enabled, 0 = disabled)', + ), 'weight' => array( 'type' => 'int', 'not null' => TRUE, 'default' => 0, 'description' => 'Weight of text format to use when listing.', - ) + ), ), 'primary key' => array('format'), 'unique keys' => array( 'name' => array('name'), ), 'indexes' => array( - 'weight' => array('weight'), + 'status_weight' => array('status', 'weight'), ), ); @@ -162,7 +170,15 @@ function filter_update_dependencies() { function filter_update_7000() { db_rename_table('filter_formats', 'filter_format'); - // Add a new filter_format.weight column. + // Add the new {filter_format}.status and {filter_format}.weight column. + db_add_field('filter_format', 'status', array( + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'default' => 1, + 'size' => 'tiny', + 'description' => 'The status of the text format. (1 = enabled, 0 = disabled)', + )); db_add_field('filter_format', 'weight', array( 'type' => 'int', 'not null' => TRUE, @@ -170,7 +186,7 @@ function filter_update_7000() { 'description' => 'Weight of text format to use when listing.', ), array( 'indexes' => array( - 'weight' => array('weight'), + 'status_weight' => array('status', 'weight'), ), )); } @@ -367,6 +383,7 @@ function filter_update_7005() { 'name' => $format_name, 'cache' => 1, 'weight' => 1, + 'status' => 1, )) ->execute(); diff --git a/modules/filter/filter.module b/modules/filter/filter.module index bf1b6f4775e1fef5a07148ca5f18952a511747eb..85fb20fec1eda460bedff85e4aa4592393760c3c 100644 --- a/modules/filter/filter.module +++ b/modules/filter/filter.module @@ -122,11 +122,11 @@ function filter_menu() { 'access arguments' => array('administer filters'), 'file' => 'filter.admin.inc', ); - $items['admin/config/content/formats/%filter_format/delete'] = array( - 'title' => 'Delete text format', + $items['admin/config/content/formats/%filter_format/disable'] = array( + 'title' => 'Disable text format', 'page callback' => 'drupal_get_form', - 'page arguments' => array('filter_admin_delete', 4), - 'access callback' => '_filter_delete_format_access', + 'page arguments' => array('filter_admin_disable', 4), + 'access callback' => '_filter_disable_format_access', 'access arguments' => array(4), 'type' => MENU_CALLBACK, 'file' => 'filter.admin.inc', @@ -140,11 +140,11 @@ function filter_menu() { * @param $format * A text format object. * @return - * TRUE if the text format can be deleted by the current user, FALSE + * TRUE if the text format can be disabled by the current user, FALSE * otherwise. */ -function _filter_delete_format_access($format) { - // The fallback format can never be deleted. +function _filter_disable_format_access($format) { + // The fallback format can never be disabled. return user_access('administer filters') && ($format->format != filter_fallback_format()); } @@ -187,6 +187,7 @@ function filter_format_load($format_id) { function filter_format_save(&$format) { $format->name = trim($format->name); $format->cache = _filter_format_is_cacheable($format); + $format->status = 1; // Programmatic saves may not contain any filters. if (!isset($format->filters)) { $format->filters = array(); @@ -256,31 +257,26 @@ function filter_format_save(&$format) { } /** - * Delete a text format. + * Disable a text format. + * + * There is no core facility to re-enable a disabled format. It is not deleted + * to keep information for contrib and to make sure the format auto increment + * id is never reused. As there might be content using the disabled format, + * this would lead to data corruption. * * @param $format - * The text format object to be deleted. - * @param $fallback_id - * (optional) The ID of the text format to use to reassign content that is - * currently using $format. If omitted, the currently stored - * filter_fallback_format() is used. + * The text format object to be disabled. */ -function filter_format_delete($format, $fallback_id = NULL) { - db_delete('filter_format') - ->condition('format', $format->format) - ->execute(); - db_delete('filter') +function filter_format_disable($format) { + db_update('filter_format') + ->fields(array('status' => 0)) ->condition('format', $format->format) ->execute(); // Allow modules to react on text format deletion. - if (empty($fallback_id)) { - $fallback_id = filter_fallback_format(); - } - $fallback = filter_format_load($fallback_id); - module_invoke_all('filter_format_delete', $format, $fallback); + module_invoke_all('filter_format_disable', $format); - // Clear the filter cache whenever a text format is deleted. + // Clear the filter cache whenever a text format is disabled. filter_formats_reset(); cache_clear_all($format->format . ':', 'cache_filter', TRUE); } @@ -381,6 +377,7 @@ function filter_formats($account = NULL) { $formats['all'] = db_select('filter_format', 'ff') ->addTag('translatable') ->fields('ff') + ->condition('status', 1) ->orderBy('weight') ->execute() ->fetchAllAssoc('format'); @@ -488,7 +485,7 @@ function filter_default_format($account = NULL) { * * The fallback text format is a regular text format in every respect, except * it does not participate in the filter permission system and cannot be - * deleted. It needs to exist because any user who has permission to create + * disabled. It needs to exist because any user who has permission to create * formatted content must always have at least one text format they can use. * * Because the fallback format is available to all users, it should always be @@ -503,15 +500,19 @@ function filter_default_format($account = NULL) { * the fallback format's weight determines its placement with respect to the * user's other formats. * - * @see hook_filter_format_delete() + * Any modules implementing a format deletion functionality must not delete + * this format. + * + * @see hook_filter_format_disable() * @see filter_default_format() */ function filter_fallback_format() { // This variable is automatically set in the database for all installations - // of Drupal. In the event that it gets deleted somehow, there is no safe - // default to return, since we do not want to risk making an existing (and - // potentially unsafe) text format on the site automatically available to all - // users. Returning NULL at least guarantees that this cannot happen. + // of Drupal. In the event that it gets disabled or deleted somehow, there + // is no safe default to return, since we do not want to risk making an + // existing (and potentially unsafe) text format on the site automatically + // available to all users. Returning NULL at least guarantees that this + // cannot happen. return variable_get('filter_fallback_format'); } diff --git a/modules/filter/filter.test b/modules/filter/filter.test index 254256bf8875a3bb5a3fd1cf70949cae715cb4af..9297356e2d1309f592a5d9e76bacd2a2d6ff27aa 100644 --- a/modules/filter/filter.test +++ b/modules/filter/filter.test @@ -57,14 +57,13 @@ class FilterCRUDTestCase extends DrupalWebTestCase { $this->verifyTextFormat($format); $this->verifyFilters($format); - // Delete the text format. - filter_format_delete($format); + // Disable the text format. + filter_format_disable($format); + $db_format = db_query("SELECT * FROM {filter_format} WHERE format = :format", array(':format' => $format->format))->fetchObject(); - $this->assertFalse($db_format, t('Database: Deleted text format no longer exists.')); - $db_filters = db_query("SELECT * FROM {filter} WHERE format = :format", array(':format' => $format->format))->fetchObject(); - $this->assertFalse($db_filters, t('Database: Filters for deleted text format no longer exist.')); + $this->assertFalse($db_format->status, t('Database: Disabled text format is marked as disabled.')); $formats = filter_formats(); - $this->assertTrue(!isset($formats[$format->format]), t('filter_formats: Deleted text format no longer exists.')); + $this->assertTrue(!isset($formats[$format->format]), t('filter_formats: Disabled text format no longer exists.')); } /** @@ -196,15 +195,15 @@ class FilterAdminTestCase extends DrupalWebTestCase { $this->drupalGet('admin/config/content/formats/' . $format->format); $this->drupalPost(NULL, array(), t('Save configuration')); - // Delete text format. + // Disable text format. $this->drupalGet('admin/config/content/formats'); - $this->assertRaw('admin/config/content/formats/' . $format->format . '/delete'); - $this->drupalGet('admin/config/content/formats/' . $format->format . '/delete'); - $this->drupalPost(NULL, array(), t('Delete')); + $this->assertRaw('admin/config/content/formats/' . $format->format . '/disable'); + $this->drupalGet('admin/config/content/formats/' . $format->format . '/disable'); + $this->drupalPost(NULL, array(), t('Disable')); - // Verify that deleted text format no longer exists. + // Verify that disabled text format no longer exists. $this->drupalGet('admin/config/content/formats/' . $format->format); - $this->assertResponse(404, t('Deleted text format no longer exists.')); + $this->assertResponse(404, t('Disabled text format no longer exists.')); } /** @@ -218,12 +217,12 @@ class FilterAdminTestCase extends DrupalWebTestCase { list($filtered, $full, $plain) = $this->checkFilterFormats(); - // Check that the fallback format exists and cannot be deleted. + // Check that the fallback format exists and cannot be disabled. $this->assertTrue(!empty($plain) && $plain == filter_fallback_format(), t('The fallback format is set to plain text.')); $this->drupalGet('admin/config/content/formats'); - $this->assertNoRaw('admin/config/content/formats/' . $plain . '/delete', t('Delete link for the fallback format not found.')); - $this->drupalGet('admin/config/content/formats/' . $plain . '/delete'); - $this->assertResponse(403, t('The fallback format cannot be deleted.')); + $this->assertNoRaw('admin/config/content/formats/' . $plain . '/disable', t('Disable link for the fallback format not found.')); + $this->drupalGet('admin/config/content/formats/' . $plain . '/disable'); + $this->assertResponse(403, t('The fallback format cannot be disabled.')); // Verify access permissions to Full HTML format. $this->assertTrue(filter_access(filter_format_load($full), $this->admin_user), t('Admin user may use Full HTML.')); @@ -283,9 +282,9 @@ class FilterAdminTestCase extends DrupalWebTestCase { $this->assertFieldByName('filters[' . $second_filter . '][status]', '', t('Line break filter found.')); $this->assertFieldByName('filters[' . $first_filter . '][status]', '', t('Url filter found.')); - // Delete new filter. - $this->drupalPost('admin/config/content/formats/' . $format->format . '/delete', array(), t('Delete')); - $this->assertRaw(t('Deleted text format %format.', array('%format' => $edit['name'])), t('Format successfully deleted.')); + // Disable new filter. + $this->drupalPost('admin/config/content/formats/' . $format->format . '/disable', array(), t('Disable')); + $this->assertRaw(t('Disabled text format %format.', array('%format' => $edit['name'])), t('Format successfully disabled.')); // Allow authenticated users on full HTML. $format = filter_format_load($full); @@ -530,8 +529,8 @@ class FilterFormatAccessTestCase extends DrupalWebTestCase { $this->assertText($new_edit['title'], t('New title found.')); $this->assertText($edit[$body_value_key], t('Old body found.')); - // Delete the Full HTML text format. - filter_format_delete($this->full_html_format); + // Disable the Full HTML text format. + filter_format_disable($this->full_html_format); $this->resetFilterCaches(); // Verify that body field can be edited and a new format can be selected. @@ -679,8 +678,8 @@ class FilterSecurityTestCase extends DrupalWebTestCase { $this->assertNoText($body_raw, t('Node body not found.')); $this->assertText('Filter: Testing filter', t('Testing filter output found.')); - // Delete the text format entirely. - $this->drupalPost('admin/config/content/formats/' . $format_id . '/delete', array(), t('Delete')); + // Disable the text format entirely. + $this->drupalPost('admin/config/content/formats/' . $format_id . '/disable', array(), t('Disable')); // Verify that the content is empty, because the text format does not exist. $this->drupalGet('node/' . $node->nid); @@ -1587,7 +1586,7 @@ class FilterHooksTestCase extends DrupalWebTestCase { public static function getInfo() { return array( 'name' => 'Filter format hooks', - 'description' => 'Test hooks for text formats insert/update/delete.', + 'description' => 'Test hooks for text formats insert/update/disable.', 'group' => 'Filter', ); } @@ -1634,18 +1633,10 @@ class FilterHooksTestCase extends DrupalWebTestCase { $bid = db_query("SELECT bid FROM {block_custom} WHERE info = :info", array(':info' => $custom_block['info']))->fetchField(); $this->assertNotNull($bid, t('New block found in database')); - // Delete the text format. - $this->drupalPost('admin/config/content/formats/' . $format_id . '/delete', array(), t('Delete')); - $this->assertRaw(t('Deleted text format %format.', array('%format' => $name)), t('Format successfully deleted.')); - $this->assertText('hook_filter_format_delete invoked.', t('hook_filter_format_delete() was invoked.')); - - // Verify that the deleted format was replaced with the fallback format. - $current_format = db_select('block_custom', 'b') - ->fields('b', array('format')) - ->condition('bid', $bid) - ->execute() - ->fetchField(); - $this->assertEqual($current_format, filter_fallback_format(), t('Deleted text format replaced with the fallback format.')); + // Disable the text format. + $this->drupalPost('admin/config/content/formats/' . $format_id . '/disable', array(), t('Disable')); + $this->assertRaw(t('Disabled text format %format.', array('%format' => $name)), t('Format successfully disabled.')); + $this->assertText('hook_filter_format_disable invoked.', t('hook_filter_format_disable() was invoked.')); } } diff --git a/modules/simpletest/tests/filter_test.module b/modules/simpletest/tests/filter_test.module index 01a69315bc25b032f54efb22a0b155860c782ec3..fa386164607b9f328d887a4a209dfdfd3b082b4b 100644 --- a/modules/simpletest/tests/filter_test.module +++ b/modules/simpletest/tests/filter_test.module @@ -21,10 +21,10 @@ function filter_test_filter_format_update($format) { } /** - * Implements hook_filter_format_delete(). + * Implements hook_filter_format_disable(). */ -function filter_test_filter_format_delete($format, $default) { - drupal_set_message('hook_filter_format_delete invoked.'); +function filter_test_filter_format_disable($format) { + drupal_set_message('hook_filter_format_disable invoked.'); } /** diff --git a/modules/user/user.module b/modules/user/user.module index 1895b3fdea438fce2cac2781347de58a93eb7537..c1eae4fb8748a2f8f5ae1ca3c654da58ae87100c 100644 --- a/modules/user/user.module +++ b/modules/user/user.module @@ -3597,16 +3597,6 @@ function user_modules_uninstalled($modules) { ->execute(); } -/** - * Implements hook_filter_format_delete(). - */ -function user_filter_format_delete($format, $fallback) { - db_update('users') - ->fields(array('signature_format' => $fallback->format)) - ->condition('signature_format', $format->format) - ->execute(); -} - /** * Helper function to rewrite the destination to avoid redirecting to login page after login. *