? .DS_Store ? 232327-improve-ability-to-handle-orphan-node-types-02.patch ? 232327-improve-ability-to-handle-orphan-node-types-03.patch ? 232327-improve-ability-to-handle-orphan-node-types.patch ? sites/.DS_Store ? sites/default/.DS_Store ? sites/default/files ? sites/default/settings.php Index: modules/node/node.admin.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/node/node.admin.inc,v retrieving revision 1.97 diff -u -p -r1.97 node.admin.inc --- modules/node/node.admin.inc 7 Jul 2010 17:56:42 -0000 1.97 +++ modules/node/node.admin.inc 22 Aug 2010 13:18:15 -0000 @@ -90,11 +90,20 @@ function node_filters() { ); } + $types = node_type_get_names(); + // If content orphaned by type deletion must be added to the select list + // so that the orphaned content can be cleaned up. + $items = db_query("SELECT type FROM {node} GROUP BY type")->fetchCol(); + foreach($items as $item) { + if (!array_key_exists($item, $types)) { + $types[$item] = $item . t(' [Deleted Content Type]'); + } + } $filters['type'] = array( 'title' => t('type'), 'options' => array( '[any]' => t('any'), - ) + node_type_get_names(), + ) + $types, ); // Language filter if there is a list of languages @@ -162,6 +171,9 @@ function node_filter_form() { } else { $value = $filters[$type]['options'][$value]; + if (isset($filters[$type]['options'][$value])) { + $value = $filters[$type]['options'][$value]; + } } if ($i++) { $form['filters']['current'][] = array('#markup' => t('and where %type is %value', array('%type' => $filters[$type]['title'], '%value' => $value))); @@ -472,7 +484,7 @@ function node_admin_nodes() { '#suffix' => ' ' . theme('mark', array('type' => node_mark($node->nid, $node->changed))), ), ), - 'type' => check_plain(node_type_get_name($node)), + 'type' => node_type_get_name($node) ? check_plain(node_type_get_name($node)) : check_plain($node->type) . t(' [Deleted Content Type]'), 'author' => theme('username', array('account' => $node)), 'status' => $node->status ? t('published') : t('not published'), 'changed' => format_date($node->changed, 'short'), Index: modules/node/node.pages.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/node/node.pages.inc,v retrieving revision 1.130 diff -u -p -r1.130 node.pages.inc --- modules/node/node.pages.inc 20 Aug 2010 01:23:43 -0000 1.130 +++ modules/node/node.pages.inc 22 Aug 2010 13:18:15 -0000 @@ -13,7 +13,15 @@ function node_page_edit($node) { $type_name = node_type_get_name($node); drupal_set_title(t('Edit @type @title', array('@type' => $type_name, '@title' => $node->title)), PASS_THROUGH); - return drupal_get_form($node->type . '_node_form', $node); + if ($type_name) { + return drupal_get_form($node->type . '_node_form', $node); + } + else { + $page = array(); + $types_link = user_access('administer content types') ? l(t(' Edit content types.'), 'admin/structure/types') : ''; + drupal_set_message(t('This content cannot be edited because the content type %type has been disabled or removed.', array('%type' => $node->type)) . $types_link, 'error'); + return $page; + } } function node_add_page() { @@ -486,50 +494,59 @@ function node_delete_confirm_submit($for */ function node_revision_overview($node) { drupal_set_title(t('Revisions for %title', array('%title' => $node->title)), PASS_THROUGH); - - $header = array(t('Revision'), array('data' => t('Operations'), 'colspan' => 2)); - - $revisions = node_revision_list($node); - - $rows = array(); - $revert_permission = FALSE; - if ((user_access('revert revisions') || user_access('administer nodes')) && node_access('update', $node)) { - $revert_permission = TRUE; - } - $delete_permission = FALSE; - if ((user_access('delete revisions') || user_access('administer nodes')) && node_access('delete', $node)) { - $delete_permission = TRUE; - } - foreach ($revisions as $revision) { - $row = array(); - $operations = array(); - - if ($revision->current_vid > 0) { - $row[] = array('data' => t('!date by !username', array('!date' => l(format_date($revision->timestamp, 'short'), "node/$node->nid"), '!username' => theme('username', array('account' => $revision)))) - . (($revision->log != '') ? '

' . filter_xss($revision->log) . '

' : ''), - 'class' => array('revision-current')); - $operations[] = array('data' => drupal_placeholder(t('current revision')), 'class' => array('revision-current'), 'colspan' => 2); + + $type_name = node_type_get_name($node); + if ($type_name) { + $header = array(t('Revision'), array('data' => t('Operations'), 'colspan' => 2)); + + $revisions = node_revision_list($node); + + $rows = array(); + $revert_permission = FALSE; + if ((user_access('revert revisions') || user_access('administer nodes')) && node_access('update', $node)) { + $revert_permission = TRUE; + } + $delete_permission = FALSE; + if ((user_access('delete revisions') || user_access('administer nodes')) && node_access('delete', $node)) { + $delete_permission = TRUE; } - else { - $row[] = t('!date by !username', array('!date' => l(format_date($revision->timestamp, 'short'), "node/$node->nid/revisions/$revision->vid/view"), '!username' => theme('username', array('account' => $revision)))) - . (($revision->log != '') ? '

' . filter_xss($revision->log) . '

' : ''); - if ($revert_permission) { - $operations[] = l(t('revert'), "node/$node->nid/revisions/$revision->vid/revert"); + foreach ($revisions as $revision) { + $row = array(); + $operations = array(); + + if ($revision->current_vid > 0) { + $row[] = array('data' => t('!date by !username', array('!date' => l(format_date($revision->timestamp, 'short'), "node/$node->nid"), '!username' => theme('username', array('account' => $revision)))) + . (($revision->log != '') ? '

' . filter_xss($revision->log) . '

' : ''), + 'class' => array('revision-current')); + $operations[] = array('data' => drupal_placeholder(t('current revision')), 'class' => array('revision-current'), 'colspan' => 2); } - if ($delete_permission) { - $operations[] = l(t('delete'), "node/$node->nid/revisions/$revision->vid/delete"); + else { + $row[] = t('!date by !username', array('!date' => l(format_date($revision->timestamp, 'short'), "node/$node->nid/revisions/$revision->vid/view"), '!username' => theme('username', array('account' => $revision)))) + . (($revision->log != '') ? '

' . filter_xss($revision->log) . '

' : ''); + if ($revert_permission) { + $operations[] = l(t('revert'), "node/$node->nid/revisions/$revision->vid/revert"); + } + if ($delete_permission) { + $operations[] = l(t('delete'), "node/$node->nid/revisions/$revision->vid/delete"); + } } + $rows[] = array_merge($row, $operations); } - $rows[] = array_merge($row, $operations); - } - $build['node_revisions_table'] = array( - '#theme' => 'table', - '#rows' => $rows, - '#header' => $header, - ); + $build['node_revisions_table'] = array( + '#theme' => 'table', + '#rows' => $rows, + '#header' => $header, + ); - return $build; + return $build; + } + else { + $page = array(); + $types_link = user_access('administer content types') ? l(t(' Edit content types.'), 'admin/structure/types') : ''; + drupal_set_message(t('This content cannot be reverted to a previous revision because the content type %type has been disabled or removed.', array('%type' => $node->type)) . $types_link, 'error'); + return $page; + } } /** Index: modules/node/node.test =================================================================== RCS file: /cvs/drupal/drupal/modules/node/node.test,v retrieving revision 1.92 diff -u -p -r1.92 node.test --- modules/node/node.test 8 Aug 2010 13:02:37 -0000 1.92 +++ modules/node/node.test 22 Aug 2010 13:18:17 -0000 @@ -298,6 +298,14 @@ class PageEditTestCase extends DrupalWeb $first_node_version = node_load($node->nid, $node->vid); $second_node_version = node_load($node->nid, $revised_node->vid); $this->assertNotIdentical($first_node_version->revision_uid, $second_node_version->revision_uid, 'Each revision has a distinct user.'); + + // Ensure that the node edit screen throws a message when type no longer exists. + module_enable(array('poll')); + $this->drupalLogin($this->admin_user); + $node = $this->drupalCreateNode(array('type' => 'poll')); + module_disable(array('poll')); + $this->drupalGet("node/$node->nid/edit"); + $this->assertRaw(t('This content cannot be edited because the content type %type has been disabled or removed.', array('%type' => $node->type)), 'Nodes cannot be edited if their type no longer exists.'); } /**