Error message

You are browsing documentation for drupal 7.x, which is not supported anymore. Read the updated version of this page for drupal 11.x (the latest version).

function node_access_rebuild

Same name and namespace in other branches
  1. 11.x core/modules/node/node.module \node_access_rebuild()
  2. 10 core/modules/node/node.module \node_access_rebuild()
  3. 9 core/modules/node/node.module \node_access_rebuild()
  4. 8.9.x core/modules/node/node.module \node_access_rebuild()

Rebuilds the node access database.

This is occasionally needed by modules that make system-wide changes to access levels. When the rebuild is required by an admin-triggered action (e.g module settings form), calling node_access_needs_rebuild(TRUE) instead of node_access_rebuild() lets the user perform his changes and actually rebuild only once he is done.

Note: As of Drupal 6, node access modules are not required to (and actually should not) call node_access_rebuild() in hook_enable/disable anymore.

Parameters

$batch_mode: Set to TRUE to process in 'batch' mode, spawning processing over several HTTP requests (thus avoiding the risk of PHP timeout if the site has a large number of nodes). hook_update_N and any form submit handler are safe contexts to use the 'batch mode'. Less decidable cases (such as calls from hook_user, hook_taxonomy, etc...) might consider using the non-batch mode.

See also

node_access_needs_rebuild()

Related topics

Node access rights
The node access system determines who can do what to which nodes.
12 calls to node_access_rebuild()
BookTestCase::setUp in modules/book/book.test
Sets up a Drupal site for running functional and integration tests.
CommentNodeAccessTest::setUp in modules/comment/comment.test
Sets up a Drupal site for running functional and integration tests.
FilePrivateTestCase::setUp in modules/file/tests/file.test
Sets up a Drupal site for running functional and integration tests.
module_disable in includes/module.inc
Disables a given set of modules.
NodeAccessBaseTableTestCase::setUp in modules/node/node.test
Sets up a Drupal site for running functional and integration tests.

... See full list

File

modules/node/node.module, line 3625

Code

function node_access_rebuild ($batch_mode = FALSE) {
 db_delete ('node_access')->execute ();
 // Only recalculate if the site is using a node_access module.
 if (count (module_implements ('node_grants'))) {
 if ($batch_mode) {
 $batch = array(
 'title' => t ('Rebuilding content access permissions'),
 'operations' => array(
 array(
 '_node_access_rebuild_batch_operation',
 array(),
 ),
 ),
 'finished' => '_node_access_rebuild_batch_finished',
 );
 batch_set ($batch);
 }
 else {
 // Try to allocate enough time to rebuild node grants
 drupal_set_time_limit (240);
 // Rebuild newest nodes first so that recent content becomes available quickly.
 $nids = db_query ("SELECT nid FROM {node} ORDER BY nid DESC")->fetchCol ();
 foreach ($nids as $nid) {
 $node = node_load ($nid, NULL, TRUE);
 // To preserve database integrity, only acquire grants if the node
 // loads successfully.
 if (!empty($node)) {
 node_access_acquire_grants ($node);
 }
 }
 }
 }
 else {
 // Not using any node_access modules. Add the default grant.
 db_insert ('node_access')->fields (array(
 'nid' => 0,
 'realm' => 'all',
 'gid' => 0,
 'grant_view' => 1,
 'grant_update' => 0,
 'grant_delete' => 0,
 ))
 ->execute ();
 }
 if (!isset($batch)) {
 drupal_set_message (t ('Content permissions have been rebuilt.'));
 node_access_needs_rebuild (FALSE);
 cache_clear_all ();
 }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.