From cab88a70149d7a1302d1e1e930fc19f909086a25 Mon Sep 17 00:00:00 2001
From: Angie Byron <webchick@24967.no-reply.drupal.org>
Date: Thu, 4 Jun 2009 03:33:29 +0000
Subject: [PATCH] #220233 by Berdir, marcingy, et al: Add useful API functions
 for extracting node type data.

---
 modules/blog/blog.module                    |   2 +-
 modules/blogapi/blogapi.module              |   4 +-
 modules/book/book.admin.inc                 |   2 +-
 modules/comment/comment.install             |   6 +-
 modules/field/field.api.php                 |   2 +-
 modules/forum/forum.module                  |   4 +-
 modules/locale/locale.install               |   4 +-
 modules/node/content_types.inc              |  10 +-
 modules/node/node.admin.inc                 |   4 +-
 modules/node/node.api.php                   |   2 +-
 modules/node/node.module                    | 228 ++++++++++++--------
 modules/node/node.pages.inc                 |  14 +-
 modules/node/node.test                      |  32 +++
 modules/poll/poll.module                    |   2 +-
 modules/poll/poll.test                      |   4 +-
 modules/search/search.api.php               |   2 +-
 modules/simpletest/drupal_web_test_case.php |   2 +-
 modules/system/system.api.php               |   2 +-
 modules/system/system.install               |   2 +-
 modules/system/system.module                |   4 +-
 modules/taxonomy/taxonomy.admin.inc         |   4 +-
 modules/tracker/tracker.pages.inc           |   2 +-
 22 files changed, 211 insertions(+), 127 deletions(-)

diff --git a/modules/blog/blog.module b/modules/blog/blog.module
index c5fd506cdff1..d4e1171b1d94 100644
--- a/modules/blog/blog.module
+++ b/modules/blog/blog.module
@@ -74,7 +74,7 @@ function blog_help($path, $arg) {
  */
 function blog_form($node, $form_state) {
   global $nid;
-  $type = node_get_types('type', $node);
+  $type = node_type_get_type($node);
 
   $form['title'] = array('#type' => 'textfield', '#title' => check_plain($type->title_label), '#required' => TRUE, '#default_value' => !empty($node->title) ? $node->title : NULL, '#weight' => -5);
   $form['body_field'] = node_body_field($node, $type->body_label, $type->min_word_count);
diff --git a/modules/blogapi/blogapi.module b/modules/blogapi/blogapi.module
index 8f6f36099b15..52ebbb0ebc41 100644
--- a/modules/blogapi/blogapi.module
+++ b/modules/blogapi/blogapi.module
@@ -719,7 +719,7 @@ function blogapi_blogger_title(&$contents) {
  * Add some settings to the admin_settings form.
  */
 function blogapi_admin_settings() {
-  $node_types = array_map('check_plain', node_get_types('names'));
+  $node_types = array_map('check_plain', node_type_get_names());
   $defaults = isset($node_types['blog']) ? array('blog' => 1) : array();
   $form['blogapi_node_types'] = array(
     '#type' => 'checkboxes',
@@ -959,7 +959,7 @@ function _blogapi_validate_blogid($blogid) {
 function _blogapi_get_node_types() {
   $available_types = array_keys(array_filter(variable_get('blogapi_node_types', array('blog' => 1))));
   $types = array();
-  foreach (node_get_types() as $type => $name) {
+  foreach (node_type_get_types() as $type => $name) {
     if (node_access('create', $type) && in_array($type, $available_types)) {
       $types[] = $type;
     }
diff --git a/modules/book/book.admin.inc b/modules/book/book.admin.inc
index 00c812923bb1..1205a1a3b360 100644
--- a/modules/book/book.admin.inc
+++ b/modules/book/book.admin.inc
@@ -35,7 +35,7 @@ function book_admin_overview() {
  * @ingroup forms
  */
 function book_admin_settings() {
-  $types = node_get_types('names');
+  $types = node_type_get_names();
   $form['book_allowed_types'] = array(
     '#type' => 'checkboxes',
     '#title' => t('Allowed book outline types'),
diff --git a/modules/comment/comment.install b/modules/comment/comment.install
index 894a070e8d36..119e96a9cd08 100644
--- a/modules/comment/comment.install
+++ b/modules/comment/comment.install
@@ -23,7 +23,7 @@ function comment_uninstall() {
 
   // Remove variables.
   variable_del('comment_block_count');
-  $node_types = array_keys(node_get_types());
+  $node_types = array_keys(node_type_get_types());
   foreach ($node_types as $node_type) {
     variable_del('comment_' . $node_type);
     variable_del('comment_anonymous_' . $node_type);
@@ -90,7 +90,7 @@ function comment_update_6002() {
     'comment_preview' => COMMENT_PREVIEW_REQUIRED,
     'comment_form_location' => COMMENT_FORM_SEPARATE_PAGE,
   );
-  $types = node_get_types();
+  $types = node_type_get_types();
   foreach ($settings as $setting => $default) {
     $value = variable_get($setting, $default);
     foreach ($types as $type => $object) {
@@ -125,7 +125,7 @@ function comment_update_6003() {
  * Remove comment settings for page ordering.
  */
 function comment_update_7000() {
-  $types = node_get_types();
+  $types = node_type_get_types();
   foreach ($types as $type => $object) {
     variable_del('comment_default_order' . $type);
   }
diff --git a/modules/field/field.api.php b/modules/field/field.api.php
index f887b8a323a1..b83dc8db26ac 100644
--- a/modules/field/field.api.php
+++ b/modules/field/field.api.php
@@ -47,7 +47,7 @@ function hook_fieldable_info() {
       'cacheable' => FALSE,
       // Bundles must provide human readable name so
       // we can create help and error messages about them.
-      'bundles' => node_get_types('names'),
+      'bundles' => node_type_get_names(),
     ),
   );
   return $return;
diff --git a/modules/forum/forum.module b/modules/forum/forum.module
index c34f666bf193..17f70059ac4b 100644
--- a/modules/forum/forum.module
+++ b/modules/forum/forum.module
@@ -538,7 +538,7 @@ function forum_block_view($delta = '') {
  * Implement hook_form().
  */
 function forum_form($node, $form_state) {
-  $type = node_get_types('type', $node);
+  $type = node_type_get_type($node);
   $form['title'] = array('#type' => 'textfield', '#title' => check_plain($type->title_label), '#default_value' => !empty($node->title) ? $node->title : '', '#required' => TRUE, '#weight' => -5);
 
   if (!empty($node->nid)) {
@@ -746,7 +746,7 @@ function template_preprocess_forums(&$variables) {
       if (node_access('create', $type)) {
         // Fetch the "General" name of the content type;
         // Push the link with title and url to the array.
-        $forum_types[$type] = array('title' => t('Post new @node_type', array('@node_type' => node_get_types('name', $type))), 'href' => 'node/add/' . str_replace('_', '-', $type) . '/' . $variables['tid']);
+        $forum_types[$type] = array('title' => t('Post new @node_type', array('@node_type' => node_type_get_name($type))), 'href' => 'node/add/' . str_replace('_', '-', $type) . '/' . $variables['tid']);
       }
     }
 
diff --git a/modules/locale/locale.install b/modules/locale/locale.install
index 73fc01eba9fc..205aa2eaec2f 100644
--- a/modules/locale/locale.install
+++ b/modules/locale/locale.install
@@ -185,7 +185,7 @@ function locale_update_6004() {
  * interfere with language variables.
  */
 function locale_update_6005() {
-  foreach (node_get_types() as $type => $content_type) {
+  foreach (node_type_get_types() as $type => $content_type) {
     // Default to NULL, so we can skip dealing with non-existent settings.
     $setting = variable_get('language_' . $type);
     if ($type == 'default' && is_numeric($setting)) {
@@ -254,7 +254,7 @@ function locale_uninstall() {
   variable_del('locale_cache_strings');
   variable_del('locale_js_directory');
 
-  foreach (node_get_types() as $type => $content_type) {
+  foreach (node_type_get_types() as $type => $content_type) {
     $setting = variable_del('language_content_type_' . $type);
   }
 
diff --git a/modules/node/content_types.inc b/modules/node/content_types.inc
index dc4b98bb6302..c681ab9b922b 100644
--- a/modules/node/content_types.inc
+++ b/modules/node/content_types.inc
@@ -10,14 +10,14 @@
  * Displays the content type admin overview page.
  */
 function node_overview_types() {
-  $types = node_get_types();
-  $names = node_get_types('names');
+  $types = node_type_get_types();
+  $names = node_type_get_names();
   $header = array(t('Name'), array('data' => t('Operations'), 'colspan' => '2'));
   $rows = array();
 
   foreach ($names as $key => $name) {
-    $type = $types[$key];
-    if (node_hook($type, 'form')) {
+    $type = $types[$key]; 
+    if (node_hook($type->type, 'form')) {
       $type_url_str = str_replace('_', '-', $type->type);
       $row = array(theme('node_admin_overview', $name, $type));
       // Set the edit column.
@@ -233,7 +233,7 @@ function node_type_form_validate($form, &$form_state) {
   // Work out what the type was before the user submitted this form
   $old_type = trim($form_state['values']['old_type']);
 
-  $types = node_get_types('names');
+  $types = node_type_get_names();
 
   if (!$form_state['values']['locked']) {
     if (isset($types[$type->type]) && $type->type != $old_type) {
diff --git a/modules/node/node.admin.inc b/modules/node/node.admin.inc
index d179481554b4..3750e58914eb 100644
--- a/modules/node/node.admin.inc
+++ b/modules/node/node.admin.inc
@@ -144,7 +144,7 @@ function node_filters() {
     );
   }
 
-  $filters['type'] = array('title' => t('type'), 'options' => node_get_types('names'));
+  $filters['type'] = array('title' => t('type'), 'options' => node_type_get_names());
 
   // The taxonomy filter
   if ($taxonomy = module_invoke('taxonomy', 'form_all', 1)) {
@@ -501,7 +501,7 @@ function node_admin_nodes() {
     $nodes[$node->nid] = '';
     $options = empty($node->language) ? array() : array('language' => $languages[$node->language]);
     $form['title'][$node->nid] = array('#markup' => l($node->title, 'node/' . $node->nid, $options) . ' ' . theme('mark', node_mark($node->nid, $node->changed)));
-    $form['name'][$node->nid] =  array('#markup' => check_plain(node_get_types('name', $node)));
+    $form['name'][$node->nid] =  array('#markup' => check_plain(node_type_get_name($node)));
     $form['username'][$node->nid] = array('#markup' => theme('username', $node));
     $form['status'][$node->nid] =  array('#markup' => ($node->status ? t('published') : t('not published')));
     $form['changed'][$node->nid] = array('#markup' => format_date($node->changed, 'small'));
diff --git a/modules/node/node.api.php b/modules/node/node.api.php
index ca801d51dd90..df0767516a4e 100644
--- a/modules/node/node.api.php
+++ b/modules/node/node.api.php
@@ -736,7 +736,7 @@ function hook_prepare($node) {
  * For a detailed usage example, see node_example.module.
  */
 function hook_form($node, $form_state) {
-  $type = node_get_types('type', $node);
+  $type = node_type_get_type($node);
 
   $form['title'] = array(
     '#type' => 'textfield',
diff --git a/modules/node/node.module b/modules/node/node.module
index 3f2922a0015d..eaa5cf50447a 100644
--- a/modules/node/node.module
+++ b/modules/node/node.module
@@ -78,12 +78,12 @@ function node_help($path, $arg) {
       return '<p>' . t('The revisions let you track differences between multiple versions of a post.') . '</p>';
     case 'node/%/edit':
       $node = node_load($arg[1]);
-      $type = node_get_types('type', $node->type);
+      $type = node_type_get_type($node);
       return (!empty($type->help) ? '<p>' . filter_xss_admin($type->help) . '</p>' : '');
   }
 
   if ($arg[0] == 'node' && $arg[1] == 'add' && $arg[2]) {
-    $type = node_get_types('type', str_replace('-', '_', $arg[2]));
+    $type = node_type_get_type(str_replace('-', '_', $arg[2]));
     return (!empty($type->help) ? '<p>' . filter_xss_admin($type->help) . '</p>' : '');
   }
 }
@@ -165,7 +165,7 @@ function node_fieldable_info() {
       // 'cacheable' => FALSE,
       // Bundles must provide human readable name so
       // we can create help and error messages about them.
-      'bundles' => node_get_types('names'),
+      'bundles' => node_type_get_names(),
     ),
   );
   return $return;
@@ -471,57 +471,103 @@ function node_teaser($body, $format = NULL, $size = NULL) {
 }
 
 /**
- * Builds a list of available node types, and returns all of part of this list
- * in the specified format.
+ * Extract the type name.
  *
- * @param $op
- *   The format in which to return the list. When this is set to 'type',
- *   'base', or 'name', only the specified node type is returned. When set to
- *   'types' or 'names', all node types are returned.
  * @param $node
- *   A node object, array, or string that indicates the node type to return.
- *   Leave at default value (NULL) to return a list of all node types.
- * @param $reset
- *   Whether or not to reset this function's internal cache (defaults to
- *   FALSE).
+ *   Either a string or object, containing the node type information.
  *
  * @return
- *   Either an array of all available node types, or a single node type, in a
- *   variable format. Returns FALSE if the node type is not found.
+ *   Node type of the passed in data.
  */
-function node_get_types($op = 'types', $node = NULL, $reset = FALSE) {
-  static $_node_types, $_node_names;
+function _node_extract_type($node) {
+  return is_object($node) ? $node->type : $node;
+}
 
-  if ($reset || !isset($_node_types)) {
-    list($_node_types, $_node_names) = _node_types_build();
-  }
+/**
+ * Clear the statically cached node type information.
+ */
+function node_type_clear() {
+  drupal_static_reset('_node_types_build');
+}
 
-  if ($node) {
-    if (is_array($node)) {
-      $type = $node['type'];
-    }
-    elseif (is_object($node)) {
-      $type = $node->type;
-    }
-    elseif (is_string($node)) {
-      $type = $node;
-    }
-    if (!isset($_node_types[$type])) {
-      return FALSE;
-    }
-  }
-  switch ($op) {
-    case 'types':
-      return $_node_types;
-    case 'type':
-      return isset($_node_types[$type]) ? $_node_types[$type] : FALSE;
-    case 'base':
-      return isset($_node_types[$type]->base) ? $_node_types[$type]->base : FALSE;
-    case 'names':
-      return $_node_names;
-    case 'name':
-      return isset($_node_names[$type]) ? $_node_names[$type] : FALSE;
-  }
+/**
+ * Returns a list of all the available node types.
+ *
+ * @return
+ *   An array of node types, keyed by the type.
+ * @see node_type_get_type()
+ */
+function node_type_get_types() {
+  return _node_types_build()->types;
+}
+
+/**
+ * Returns the node type of the passed node or node type string.
+ *
+ *@param $node
+ *   A node object or string that indicates the node type to return.
+ * @return
+ *   A single node type, as an object or FALSE if the node type is not found.
+ *   The node type is an array with following content:
+ *
+ *   @code
+ *   array(
+ *     'type' => 'Machine readable type name',
+ *     'name' => 'Name of the node type',
+ *     'base' => 'Indicates to which module this node type belongs',
+ *     'description' => 'Description of the node type',
+ *     // ...
+ *   )
+ *   @endcode
+ */
+function node_type_get_type($node) {
+  $type = _node_extract_type($node);
+  $types = _node_types_build()->types;
+  return isset($types[$type]) ? $types[$type] : FALSE;
+}
+
+/**
+ * Returns the node type base of the passed node or node type string.
+ *
+ * The base indicates which module implement this node type and is used to
+ * execute node type specific hooks.
+ *
+ * @see node_invoke()
+ *
+ * @param $node
+ *   A node object or string that indicates the node type to return.
+ * @return
+ *   The node type base or FALSE if the node type is not found.
+ */
+function node_type_get_base($node) {
+  $type = _node_extract_type($node);
+  $types = _node_types_build()->types;
+  return isset($types[$type]) && isset($types[$type]->base) ? $types[$type]->base : FALSE;
+}
+
+/**
+ * Returns a list of available node names.
+ *
+ * @return
+ *   An array of node type names, keyed by the type.
+ */
+function node_type_get_names() {
+  return _node_types_build()->names;
+}
+
+/**
+ * Returns the node type name of the passed node or node type string.
+ *
+ * @param $node
+ *   A node object or string that indicates the node type to return.
+ *
+ * @return
+ *   The node type name or FALSE if the node type is not found.
+ */
+function node_type_get_name($node) {
+  $type = _node_extract_type($node);
+  $types = _node_types_build()->names;
+  return isset($types[$type]) ? $types[$type] : FALSE;
 }
 
 /**
@@ -529,11 +575,9 @@ function node_get_types($op = 'types', $node = NULL, $reset = FALSE) {
  * module-defined node types to the database.
  */
 function node_types_rebuild() {
-  _node_types_build();
-
-  $node_types = node_get_types('types', NULL, TRUE);
-
-  foreach ($node_types as $type => $info) {
+  // Reset and load updated node types.
+  node_type_clear();
+  foreach (node_type_get_types() as $type => $info) {
     if (!empty($info->is_new)) {
       node_type_save($info);
     }
@@ -541,8 +585,9 @@ function node_types_rebuild() {
       node_type_delete($info->type);
     }
   }
-
-  _node_types_build();
+  // Reset cached node type information so that the next access
+  // will use the updated data.
+  node_type_clear();
   // This is required for proper menu items at node/add/type.
   menu_rebuild();
 }
@@ -610,7 +655,7 @@ function node_type_save($info) {
  *   The machine-readable name of the node type to be deleted.
  */
 function node_type_delete($type) {
-  $info = node_get_types('type', $type);
+  $info = node_type_get_type($type);
   db_delete('node_type')
     ->condition('type', $type)
     ->execute();
@@ -644,14 +689,17 @@ function node_type_update_nodes($old_type, $type) {
  *
  */
 function _node_types_build() {
-  $_node_types = array();
-  $_node_names = array();
+  $_node_types = drupal_static(__FUNCTION__);
+  if (is_object($_node_types)) {
+    return $_node_types;
+  }
+  $_node_types = (object) array('types' => array(), 'names' => array());
 
   $info_array = module_invoke_all('node_info');
   foreach ($info_array as $type => $info) {
     $info['type'] = $type;
-    $_node_types[$type] = node_type_set_defaults($info);
-    $_node_names[$type] = $info['name'];
+    $_node_types->types[$type] = node_type_set_defaults($info);
+    $_node_types->names[$type] = $info['name'];
   }
   $type_result = db_select('node_type', 'nt')
     ->fields('nt')
@@ -666,20 +714,20 @@ function _node_types_build() {
     if (isset($type_object->base) && $type_object->base != 'node_content' && empty($info_array[$type_object->type])) {
       $type_object->disabled = TRUE;
     }
-    if (!isset($_node_types[$type_object->type]) || $type_object->modified) {
-      $_node_types[$type_object->type] = $type_object;
-      $_node_names[$type_object->type] = $type_object->name;
+    if (!isset($_node_types->types[$type_object->type]) || $type_object->modified) {
+      $_node_types->types[$type_object->type] = $type_object;
+      $_node_types->names[$type_object->type] = $type_object->name;
 
       if ($type_object->type != $type_object->orig_type) {
-        unset($_node_types[$type_object->orig_type]);
-        unset($_node_names[$type_object->orig_type]);
+        unset($_node_types->types[$type_object->orig_type]);
+        unset($_node_types->names[$type_object->orig_type]);
       }
     }
   }
 
-  asort($_node_names);
+  asort($_node_types->names);
 
-  return array($_node_types, $_node_names);
+  return $_node_types;
 }
 
 /**
@@ -744,7 +792,7 @@ function node_type_set_defaults($info = array()) {
  *   TRUE iff the $hook exists in the node type of $node.
  */
 function node_hook($node, $hook) {
-  $base = node_get_types('base', $node);
+  $base = node_type_get_base($node);
   return module_hook($base, $hook);
 }
 
@@ -762,7 +810,7 @@ function node_hook($node, $hook) {
  */
 function node_invoke($node, $hook, $a2 = NULL, $a3 = NULL, $a4 = NULL) {
   if (node_hook($node, $hook)) {
-    $base = node_get_types('base', $node);
+    $base = node_type_get_base($node);
     $function = $base . '_' . $hook;
     return ($function($node, $a2, $a3, $a4));
   }
@@ -886,7 +934,7 @@ function node_load_multiple($nids = array(), $conditions = array(), $reset = FAL
     // Call node type specific callbacks on each typed array of nodes.
     foreach ($typed_nodes as $type => $nodes_of_type) {
       if (node_hook($type, 'load')) {
-        $function = node_get_types('base', $type) . '_load';
+        $function = node_type_get_base($type) . '_load';
         $function($nodes_of_type);
       }
     }
@@ -952,7 +1000,7 @@ function node_load($nid, $vid = array(), $reset = FALSE) {
 function node_validate($node, $form = array()) {
   // Convert the node to an object, if necessary.
   $node = (object)$node;
-  $type = node_get_types('type', $node);
+  $type = node_type_get_type($node);
 
   // Make sure the body has the minimum number of words.
   // TODO : use a better word counting algorithm that will work in other languages
@@ -1454,7 +1502,7 @@ function node_perm() {
     ),
   );
 
-  foreach (node_get_types() as $type) {
+  foreach (node_type_get_types() as $type) {
     if ($type->base == 'node_content') {
       $perms += node_list_permissions($type);
     }
@@ -1616,7 +1664,7 @@ function node_search($op = 'search', $keys = NULL) {
 
         $results[] = array(
           'link' => url('node/' . $item->sid, array('absolute' => TRUE)),
-          'type' => check_plain(node_get_types('name', $node)),
+          'type' => check_plain(node_type_get_name($node)),
           'title' => $node->title,
           'user' => theme('username', $node),
           'date' => $node->changed,
@@ -1795,7 +1843,7 @@ function _node_revision_access($node, $op = 'view') {
 }
 
 function _node_add_access() {
-  $types = node_get_types();
+  $types = node_type_get_types();
   foreach ($types as $type) {
     if (node_hook($type->type, 'form') && node_access('create', $type->type)) {
       return TRUE;
@@ -1875,7 +1923,9 @@ function node_menu() {
     'access arguments' => array('access content'),
     'type' => MENU_CALLBACK,
   );
-  foreach (node_get_types('types', NULL, TRUE) as $type) {
+  // Reset internal static cache of _node_types_build, forces to rebuild the node type information.
+  node_type_clear();
+  foreach (node_type_get_types() as $type) {
     $type_url_str = str_replace('_', '-', $type->type);
     $items['node/add/' . $type_url_str] = array(
       'title' => $type->name,
@@ -2277,7 +2327,7 @@ function node_form_search_form_alter(&$form, $form_state) {
     }
 
     // Node types:
-    $types = array_map('check_plain', node_get_types('names'));
+    $types = array_map('check_plain', node_type_get_names());
     $form['advanced']['type'] = array(
       '#type' => 'checkboxes',
       '#title' => t('Only of the type(s)'),
@@ -2435,7 +2485,7 @@ function node_access($op, $node, $account = NULL) {
 
   // Can't use node_invoke('access', $node), because the access hook takes the
   // $op parameter before the $node parameter.
-  $base = node_get_types('base', $node);
+  $base = node_type_get_base($node);
   $access = module_invoke($base, 'access', $op, $node, $account);
   if (!is_null($access)) {
     return $access;
@@ -2933,7 +2983,9 @@ function node_content_access($op, $node, $account) {
  * Implement hook_form().
  */
 function node_content_form($node, $form_state) {
-  $type = node_get_types('type', $node);
+  
+  $type = node_type_get_type($node);
+  
   $form = array();
 
   if ($type->has_title) {
@@ -2962,7 +3014,7 @@ function node_content_form($node, $form_state) {
  */
 function node_forms() {
   $forms = array();
-  if ($types = node_get_types()) {
+  if ($types = node_type_get_types()) {
     foreach (array_keys($types) as $type) {
       $forms[$type . '_node_form']['callback'] = 'node_form';
     }
@@ -3111,7 +3163,7 @@ function node_action_info() {
  */
 function node_publish_action($node, $context = array()) {
   $node->status = 1;
-  watchdog('action', 'Set @type %title to published.', array('@type' => node_get_types('name', $node), '%title' => $node->title));
+  watchdog('action', 'Set @type %title to published.', array('@type' => node_type_get_name($node), '%title' => $node->title));
 }
 
 /**
@@ -3120,7 +3172,7 @@ function node_publish_action($node, $context = array()) {
  */
 function node_unpublish_action($node, $context = array()) {
   $node->status = 0;
-  watchdog('action', 'Set @type %title to unpublished.', array('@type' => node_get_types('name', $node), '%title' => $node->title));
+  watchdog('action', 'Set @type %title to unpublished.', array('@type' => node_type_get_name($node), '%title' => $node->title));
 }
 
 /**
@@ -3129,7 +3181,7 @@ function node_unpublish_action($node, $context = array()) {
  */
 function node_make_sticky_action($node, $context = array()) {
   $node->sticky = 1;
-  watchdog('action', 'Set @type %title to sticky.', array('@type' => node_get_types('name', $node), '%title' => $node->title));
+  watchdog('action', 'Set @type %title to sticky.', array('@type' => node_type_get_name($node), '%title' => $node->title));
 }
 
 /**
@@ -3138,7 +3190,7 @@ function node_make_sticky_action($node, $context = array()) {
  */
 function node_make_unsticky_action($node, $context = array()) {
   $node->sticky = 0;
-  watchdog('action', 'Set @type %title to unsticky.', array('@type' => node_get_types('name', $node), '%title' => $node->title));
+  watchdog('action', 'Set @type %title to unsticky.', array('@type' => node_type_get_name($node), '%title' => $node->title));
 }
 
 /**
@@ -3147,7 +3199,7 @@ function node_make_unsticky_action($node, $context = array()) {
  */
 function node_promote_action($node, $context = array()) {
   $node->promote = 1;
-  watchdog('action', 'Promoted @type %title to front page.', array('@type' => node_get_types('name', $node), '%title' => $node->title));
+  watchdog('action', 'Promoted @type %title to front page.', array('@type' => node_type_get_name($node), '%title' => $node->title));
 }
 
 /**
@@ -3156,7 +3208,7 @@ function node_promote_action($node, $context = array()) {
  */
 function node_unpromote_action($node, $context = array()) {
   $node->promote = 0;
-  watchdog('action', 'Removed @type %title from front page.', array('@type' => node_get_types('name', $node), '%title' => $node->title));
+  watchdog('action', 'Removed @type %title from front page.', array('@type' => node_type_get_name($node), '%title' => $node->title));
 }
 
 /**
@@ -3165,7 +3217,7 @@ function node_unpromote_action($node, $context = array()) {
  */
 function node_save_action($node) {
   node_save($node);
-  watchdog('action', 'Saved @type %title', array('@type' => node_get_types('name', $node), '%title' => $node->title));
+  watchdog('action', 'Saved @type %title', array('@type' => node_type_get_name($node), '%title' => $node->title));
 }
 
 /**
@@ -3175,7 +3227,7 @@ function node_save_action($node) {
 function node_assign_owner_action($node, $context) {
   $node->uid = $context['owner_uid'];
   $owner_name = db_query("SELECT name FROM {users} WHERE uid = :uid", array(':uid' => $context['owner_uid']))->fetchField();
-  watchdog('action', 'Changed owner of @type %title to uid %name.', array('@type' => node_get_types('type', $node), '%title' => $node->title, '%name' => $owner_name));
+  watchdog('action', 'Changed owner of @type %title to uid %name.', array('@type' =>  node_type_get_type($node), '%title' => $node->title, '%name' => $owner_name));
 }
 
 function node_assign_owner_action_form($context) {
@@ -3256,7 +3308,7 @@ function node_unpublish_by_keyword_action($node, $context) {
   foreach ($context['keywords'] as $keyword) {
     if (strpos(drupal_render(node_build(clone $node)), $keyword) !== FALSE || strpos($node->title, $keyword) !== FALSE) {
       $node->status = 0;
-      watchdog('action', 'Set @type %title to unpublished.', array('@type' => node_get_types('name', $node), '%title' => $node->title));
+      watchdog('action', 'Set @type %title to unpublished.', array('@type' => node_type_get_name($node), '%title' => $node->title));
       break;
     }
   }
@@ -3271,7 +3323,7 @@ function node_unpublish_by_keyword_action($node, $context) {
  *   An array of permission names and descriptions.
  */
 function node_list_permissions($type) {
-  $info = node_get_types('type', $type);
+  $info = node_type_get_type($type);
   $type = check_plain($info->type);
 
   // Build standard list of node permissions for this type.
diff --git a/modules/node/node.pages.inc b/modules/node/node.pages.inc
index 4b9755a0e4c8..2ded079850fa 100644
--- a/modules/node/node.pages.inc
+++ b/modules/node/node.pages.inc
@@ -11,7 +11,7 @@
  * Menu callback; presents the node editing form, or redirects to delete confirmation.
  */
 function node_page_edit($node) {
-  $type_name = node_get_types('name', $node);
+  $type_name = node_type_get_name($node);
   drupal_set_title(t('<em>Edit @type</em> @title', array('@type' => $type_name, '@title' => $node->title)), PASS_THROUGH);
   return drupal_get_form($node->type . '_node_form', $node);
 }
@@ -53,7 +53,7 @@ function theme_node_add_list($content) {
 function node_add($type) {
   global $user;
 
-  $types = node_get_types();
+  $types = node_type_get_types();
   $type = isset($type) ? str_replace('-', '_', $type) : NULL;
   // If a node type has been specified, validate its existence.
   if (isset($types[$type]) && node_access('create', $type)) {
@@ -290,7 +290,7 @@ function node_form(&$form_state, $node) {
  */
 function node_body_field($node, $label, $word_count) {
   // Do not generate a body field if the type does not specify one.
-  if (!node_get_types('type', $node)->has_body) {
+  if (!node_type_get_type($node->type)->has_body) {
     return array();
   }
 
@@ -463,7 +463,7 @@ function node_form_submit($form, &$form_state) {
   node_save($node);
   $node_link = l(t('view'), 'node/' . $node->nid);
   $watchdog_args = array('@type' => $node->type, '%title' => $node->title);
-  $t_args = array('@type' => node_get_types('name', $node), '%title' => $node->title);
+  $t_args = array('@type' => node_type_get_name($node), '%title' => $node->title);
 
   if ($insert) {
     watchdog('content', '@type: added %title.', $watchdog_args, WATCHDOG_NOTICE, $node_link);
@@ -528,7 +528,7 @@ function node_delete_confirm_submit($form, &$form_state) {
     $node = node_load($form_state['values']['nid']);
     node_delete($form_state['values']['nid']);
     watchdog('content', '@type: deleted %title.', array('@type' => $node->type, '%title' => $node->title));
-    drupal_set_message(t('@type %title has been deleted.', array('@type' => node_get_types('name', $node), '%title' => $node->title)));
+    drupal_set_message(t('@type %title has been deleted.', array('@type' => node_type_get_name($node), '%title' => $node->title)));
   }
 
   $form_state['redirect'] = '<front>';
@@ -598,7 +598,7 @@ function node_revision_revert_confirm_submit($form, &$form_state) {
   node_save($node_revision);
 
   watchdog('content', '@type: reverted %title revision %revision.', array('@type' => $node_revision->type, '%title' => $node_revision->title, '%revision' => $node_revision->vid));
-  drupal_set_message(t('@type %title has been reverted back to the revision from %revision-date.', array('@type' => node_get_types('name', $node_revision), '%title' => $node_revision->title, '%revision-date' => format_date($node_revision->revision_timestamp))));
+  drupal_set_message(t('@type %title has been reverted back to the revision from %revision-date.', array('@type' => node_type_get_name($node_revision), '%title' => $node_revision->title, '%revision-date' => format_date($node_revision->revision_timestamp))));
   $form_state['redirect'] = 'node/' . $node_revision->nid . '/revisions';
 }
 
@@ -615,7 +615,7 @@ function node_revision_delete_confirm_submit($form, &$form_state) {
     ->execute();
   module_invoke_all('node_delete_revision', $node_revision);
   watchdog('content', '@type: deleted %title revision %revision.', array('@type' => $node_revision->type, '%title' => $node_revision->title, '%revision' => $node_revision->vid));
-  drupal_set_message(t('Revision from %revision-date of @type %title has been deleted.', array('%revision-date' => format_date($node_revision->revision_timestamp), '@type' => node_get_types('name', $node_revision), '%title' => $node_revision->title)));
+  drupal_set_message(t('Revision from %revision-date of @type %title has been deleted.', array('%revision-date' => format_date($node_revision->revision_timestamp), '@type' => node_type_get_name($node_revision), '%title' => $node_revision->title)));
   $form_state['redirect'] = 'node/' . $node_revision->nid;
   if (db_query('SELECT COUNT(vid) FROM {node_revision} WHERE nid = :nid', array(':nid' => $node_revision->nid))->fetchField() > 1) {
     $form_state['redirect'] .= '/revisions';
diff --git a/modules/node/node.test b/modules/node/node.test
index 1a77a4588453..38707b26f18e 100644
--- a/modules/node/node.test
+++ b/modules/node/node.test
@@ -801,3 +801,35 @@ class NodeSaveTestCase extends DrupalWebTestCase {
     $this->assertTrue($node_by_title, t('Node load by node title.'));
   }
 }
+
+/**
+ * Tests related to node types.
+ */
+class NodeTypeTestCase extends DrupalWebTestCase {
+  function getInfo() {
+    return array(
+      'name' => t('Node types'),
+      'description' => t('Ensures that node type functions work correctly.'),
+      'group' => t('Node'),
+    );
+  }
+
+  /**
+   * Ensure that node type functions (node_type_get_*) work correctly.
+   *
+   * Load available node types and validate the returned data.
+   */
+  function testNodeTypeGetFunctions() {
+    $node_types = node_type_get_types();
+    $node_names = node_type_get_names();
+
+    $this->assertTrue(isset($node_types['article']), t('Node type article is available.'));
+    $this->assertTrue(isset($node_types['page']), t('Node type page is available.'));
+
+    $this->assertEqual($node_types['article']->name, $node_names['article'], t('Correct node type base has been returned.'));
+
+    $this->assertEqual($node_types['article'], node_type_get_type('article'), t('Correct node type has been returned.'));
+    $this->assertEqual($node_types['article']->name, node_type_get_name('article'), t('Correct node type name has been returned.'));
+    $this->assertEqual($node_types['page']->base, node_type_get_base('page'), t('Correct node type base has been returned.'));
+  }
+}
diff --git a/modules/poll/poll.module b/modules/poll/poll.module
index 091a5f2ebc69..e59b5971cce1 100644
--- a/modules/poll/poll.module
+++ b/modules/poll/poll.module
@@ -206,7 +206,7 @@ function poll_form($node, $form_state) {
 
   $admin = user_access('administer nodes') || user_access('edit any poll content') || (user_access('edit own poll content') && $user->uid == $node->uid);
 
-  $type = node_get_types('type', $node);
+  $type = node_type_get_type($node);
 
   $form = array(
     '#cache' => TRUE,
diff --git a/modules/poll/poll.test b/modules/poll/poll.test
index 0c4d848830ce..7bd30ad61e8c 100644
--- a/modules/poll/poll.test
+++ b/modules/poll/poll.test
@@ -46,7 +46,7 @@ class PollTestCase extends DrupalWebTestCase {
 
     $this->drupalPost(NULL, $edit, t('Save'));
     $node = $this->drupalGetNodeByTitle($title);
-    $this->assertText(t('@type @title has been created.', array('@type' => node_get_types('name', 'poll'), '@title' => $title)), 'Poll has been created.');
+    $this->assertText(t('@type @title has been created.', array('@type' => node_type_get_name('poll'), '@title' => $title)), 'Poll has been created.');
     $this->assertTrue($node->nid, t('Poll has been found in the database.'));
 
     return isset($node->nid) ? $node->nid : FALSE;
@@ -80,7 +80,7 @@ class PollTestCase extends DrupalWebTestCase {
   function pollUpdate($nid, $title, $edit) {
     // Edit the poll node.
     $this->drupalPost('node/' . $nid . '/edit', $edit, t('Save'));
-    $this->assertText(t('@type @title has been updated.', array('@type' => node_get_types('name', 'poll'), '@title' => $title)), 'Poll has been updated.');
+    $this->assertText(t('@type @title has been updated.', array('@type' => node_type_get_name('poll'), '@title' => $title)), 'Poll has been updated.');
   }
 }
 
diff --git a/modules/search/search.api.php b/modules/search/search.api.php
index d54b6032841c..a31162fb8471 100644
--- a/modules/search/search.api.php
+++ b/modules/search/search.api.php
@@ -184,7 +184,7 @@ function hook_search($op = 'search', $keys = NULL) {
 
         $results[] = array(
           'link' => url('node/' . $item->sid, array('absolute' => TRUE)),
-          'type' => check_plain(node_get_types('name', $node)),
+          'type' => check_plain(node_type_get_name($node)),
           'title' => $node->title,
           'user' => theme('username', $node),
           'date' => $node->changed,
diff --git a/modules/simpletest/drupal_web_test_case.php b/modules/simpletest/drupal_web_test_case.php
index f07adff1d746..aaf9441656f6 100644
--- a/modules/simpletest/drupal_web_test_case.php
+++ b/modules/simpletest/drupal_web_test_case.php
@@ -701,7 +701,7 @@ protected function drupalCreateContentType($settings = array()) {
     // Find a non-existent random type name.
     do {
       $name = strtolower($this->randomName(8));
-    } while (node_get_types('type', $name));
+    } while (node_type_get_type($name));
 
     // Populate defaults array.
     $defaults = array(
diff --git a/modules/system/system.api.php b/modules/system/system.api.php
index d5c1d650b78e..0fa5aeea350d 100644
--- a/modules/system/system.api.php
+++ b/modules/system/system.api.php
@@ -902,7 +902,7 @@ function hook_mail($key, &$message, $params) {
     $variables += array(
       '%uid' => $node->uid,
       '%node_url' => url('node/' . $node->nid, array('absolute' => TRUE)),
-      '%node_type' => node_get_types('name', $node),
+      '%node_type' => node_type_get_name($node),
       '%title' => $node->title,
       '%teaser' => $node->teaser,
       '%body' => $node->body,
diff --git a/modules/system/system.install b/modules/system/system.install
index 5d952a9115b2..8f856e1d79bf 100644
--- a/modules/system/system.install
+++ b/modules/system/system.install
@@ -3306,7 +3306,7 @@ function system_update_7016() {
  */
 function system_update_7017() {
   $ret = array();
-  $types = node_get_types();
+  $types = node_type_get_types();
   if (count($types)) {
     foreach ($types as $type) {
       $node_info = theme_get_setting('toggle_node_info_' . $type->type);
diff --git a/modules/system/system.module b/modules/system/system.module
index 2b11c003d401..6db8db9dc31d 100644
--- a/modules/system/system.module
+++ b/modules/system/system.module
@@ -2158,7 +2158,7 @@ function system_mail($key, &$message, $params) {
     $variables += array(
       '%uid' => $node->uid,
       '%node_url' => url('node/' . $node->nid, array('absolute' => TRUE)),
-      '%node_type' => node_get_types('name', $node),
+      '%node_type' => node_type_get_name($node),
       '%title' => $node->title,
       '%teaser' => $node->teaser,
       '%body' => $node->body,
@@ -2232,7 +2232,7 @@ function system_message_action(&$object, $context = array()) {
     $variables = array_merge($variables, array(
       '%uid' => $node->uid,
       '%node_url' => url('node/' . $node->nid, array('absolute' => TRUE)),
-      '%node_type' => check_plain(node_get_types('name', $node)),
+      '%node_type' => check_plain(node_type_get_name($node)),
       '%title' => filter_xss($node->title),
       '%teaser' => filter_xss($node->teaser),
       '%body' => filter_xss($node->body),
diff --git a/modules/taxonomy/taxonomy.admin.inc b/modules/taxonomy/taxonomy.admin.inc
index 319d80173448..08cbc292148d 100644
--- a/modules/taxonomy/taxonomy.admin.inc
+++ b/modules/taxonomy/taxonomy.admin.inc
@@ -19,7 +19,7 @@ function taxonomy_overview_vocabularies() {
   foreach ($vocabularies as $vocabulary) {
     $types = array();
     foreach ($vocabulary->nodes as $type) {
-      $node_type = node_get_types('name', $type);
+      $node_type = node_type_get_name($type);
       $types[] = $node_type ? check_plain($node_type) : check_plain($type);
     }
     $form[$vocabulary->vid]['#vocabulary'] = $vocabulary;
@@ -146,7 +146,7 @@ function taxonomy_form_vocabulary(&$form_state, $edit = array()) {
     '#type' => 'checkboxes',
     '#title' => t('Content types'),
     '#default_value' => $edit['nodes'],
-    '#options' => array_map('check_plain', node_get_types('names')),
+    '#options' => array_map('check_plain', node_type_get_names()),
     '#description' => t('Select content types to categorize using this vocabulary.'),
   );
   $form['settings'] = array(
diff --git a/modules/tracker/tracker.pages.inc b/modules/tracker/tracker.pages.inc
index 278f9377b2a0..d8dd9f344284 100644
--- a/modules/tracker/tracker.pages.inc
+++ b/modules/tracker/tracker.pages.inc
@@ -61,7 +61,7 @@ function tracker_page($account = NULL, $set_title = FALSE) {
     }
 
     $rows[] = array(
-      check_plain(node_get_types('name', $node->type)),
+      check_plain(node_type_get_name($node->type)),
       l($node->title, "node/$node->nid") . ' ' . theme('mark', node_mark($node->nid, $node->changed)),
       theme('username', $node),
       array('class' => 'replies', 'data' => $comments),
-- 
GitLab