function _node_types_build

Builds and returns the list of available node types.

The list of types is built by invoking hook_node_info() on all modules and comparing this information with the node types in the {node_type} table. These two information sources are not synchronized during module installation until node_types_rebuild() is called.

Parameters

$rebuild: TRUE to rebuild node types. Equivalent to calling node_types_rebuild().

Return value

An object with two properties:

  • names: Associative array of the names of node types, keyed by the type.
  • types: Associative array of node type objects, keyed by the type.

Both of these arrays will include new types that have been defined by hook_node_info() implementations but not yet saved in the {node_type} table. These are indicated in the type object by $type->is_new being set to the value 1. These arrays will also include obsolete types: types that were previously defined by modules that have now been disabled, or for whatever reason are no longer being defined in hook_node_info() implementations, but are still in the database. These are indicated in the type object by $type->disabled being set to TRUE.

1 call to _node_types_build()
node_types_rebuild in drupal/modules/node/node.module
Updates the database cache of node types.
1 string reference to '_node_types_build'
node_type_cache_reset in drupal/modules/node/node.module
Clears the node type cache.

File

drupal/modules/node/node.module, line 706
The core that allows content to be submitted to the site. Modules and scripts may programmatically submit nodes using the usual form API pattern.

Code

function _node_types_build($rebuild = FALSE) {
  $cid = 'node_types:' . $GLOBALS['language']->language;
  if (!$rebuild) {
    $_node_types =& drupal_static(__FUNCTION__);
    if (isset($_node_types)) {
      return $_node_types;
    }
    if ($cache = cache_get($cid)) {
      $_node_types = $cache->data;
      return $_node_types;
    }
  }
  $_node_types = (object) array(
    'types' => array(),
    'names' => array(),
  );
  foreach (module_implements('node_info') as $module) {
    $info_array = module_invoke($module, 'node_info');
    foreach ($info_array as $type => $info) {
      $info['type'] = $type;
      $_node_types->types[$type] = node_type_set_defaults($info);
      $_node_types->types[$type]->module = $module;
      $_node_types->names[$type] = $info['name'];
    }
  }
  $query = db_select('node_type', 'nt')
    ->addTag('translatable')
    ->addTag('node_type_access')
    ->fields('nt')
    ->orderBy('nt.type', 'ASC');
  if (!$rebuild) {
    $query
      ->condition('disabled', 0);
  }
  foreach ($query
    ->execute() as $type_object) {
    $type_db = $type_object->type;

    // Original disabled value.
    $disabled = $type_object->disabled;

    // Check for node types from disabled modules and mark their types for removal.
    // Types defined by the node module in the database (rather than by a separate
    // module using hook_node_info) have a base value of 'node_content'. The isset()
    // check prevents errors on old (pre-Drupal 7) databases.
    if (isset($type_object->base) && $type_object->base != 'node_content' && empty($_node_types->types[$type_db])) {
      $type_object->disabled = TRUE;
    }
    if (isset($_node_types->types[$type_db])) {
      $type_object->disabled = FALSE;
    }
    if (!isset($_node_types->types[$type_db]) || $type_object->modified) {
      $_node_types->types[$type_db] = $type_object;
      $_node_types->names[$type_db] = $type_object->name;
      if ($type_db != $type_object->orig_type) {
        unset($_node_types->types[$type_object->orig_type]);
        unset($_node_types->names[$type_object->orig_type]);
      }
    }
    $_node_types->types[$type_db]->disabled = $type_object->disabled;
    $_node_types->types[$type_db]->disabled_changed = $disabled != $type_object->disabled;
  }
  if ($rebuild) {
    foreach ($_node_types->types as $type => $type_object) {
      if (!empty($type_object->is_new) || !empty($type_object->disabled_changed)) {
        node_type_save($type_object);
      }
    }
  }
  asort($_node_types->names);
  cache_set($cid, $_node_types);
  return $_node_types;
}