node_access_rebuild($batch_mode = FALSE)
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
Related topics
- Node access rights
- The node access system determines who can do what to which nodes.
File
- core/modules/node/node.module, line 1144
- The core module that allows content to be submitted to the site.
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | function node_access_rebuild( $batch_mode = FALSE) { $node_storage = \Drupal::entityManager()->getStorage( 'node' ); /** @var \Drupal\node\NodeAccessControlHandlerInterface $access_control_handler */ $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' ); // Disable access checking since all nodes must be processed even if the // user does not have access. And unless the current user has the bypass // node access permission, no nodes are accessible since the grants have // just been deleted. $entity_query ->accessCheck(FALSE); $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 )) { $grants = $access_control_handler ->acquireGrants( $node ); \Drupal::service( 'node.grant_storage' )->write( $node , $grants ); } } } } 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); } } |
Please login to continue.