You are here

function node_access_rebuild in Zircon Profile 8.0

Same name and namespace in other branches
  1. 8 core/modules/node/node.module \node_access_rebuild()

Rebuilds the node access database.

This rebuild 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_install/uninstall anymore.

Parameters

$batch_mode: (optional) 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. Defaults to FALSE.

See also

node_access_needs_rebuild()

Related topics

19 calls to node_access_rebuild()
BookTest::setUp in core/modules/book/src/Tests/BookTest.php
Sets up a Drupal site for running functional and integration tests.
BulkFormAccessTest::setUp in core/modules/node/src/Tests/Views/BulkFormAccessTest.php
Sets up a Drupal site for running functional and integration tests.
CommentNodeAccessTest::setUp in core/modules/comment/src/Tests/CommentNodeAccessTest.php
Sets up a Drupal site for running functional and integration tests.
FilePrivateTest::setUp in core/modules/file/src/Tests/FilePrivateTest.php
Sets up a Drupal site for running functional and integration tests.
ForumNodeAccessTest::setUp in core/modules/forum/src/Tests/ForumNodeAccessTest.php
Sets up a Drupal site for running functional and integration tests.

... See full list

File

core/modules/node/node.module, line 1132
The core module that allows content to be submitted to the site.

Code

function node_access_rebuild($batch_mode = FALSE) {
  $node_storage = \Drupal::entityManager()
    ->getStorage('node');
  $access_control_handler = \Drupal::entityManager()
    ->getAccessControlHandler('node');
  $access_control_handler
    ->deleteGrants();

  // Only recalculate if the site is using a node_access module.
  if (count(\Drupal::moduleHandler()
    ->getImplementations('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.
      $entity_query = \Drupal::entityQuery('node');
      $entity_query
        ->sort('nid', 'DESC');
      $nids = $entity_query
        ->execute();
      foreach ($nids as $nid) {
        $node_storage
          ->resetCache(array(
          $nid,
        ));
        $node = Node::load($nid);

        // To preserve database integrity, only write grants if the node
        // loads successfully.
        if (!empty($node)) {
          $access_control_handler
            ->writeGrants($node);
        }
      }
    }
  }
  else {

    // Not using any node_access modules. Add the default grant.
    $access_control_handler
      ->writeDefaultGrant();
  }
  if (!isset($batch)) {
    drupal_set_message(t('Content permissions have been rebuilt.'));
    node_access_needs_rebuild(FALSE);
  }
}