Builds an associative array of grant records and their history.

If there are duplicate records, display an error message.

Parameters

$grants: An indexed array of grant records, augmented by the '#module' key, as created by _devel_node_access_module_invoke_all('node_access_records').

$node: The node that the grant records belong to.

$function: The name of the hook that produced the grants array, in case we need to display an error message.

Return value

See _devel_node_access_nar_alter() for the description of the result.

1 call to _devel_node_access_build_nar_data()
_devel_node_access_nar_alter in ./devel_node_access.module
Mimics hook_node_access_records_alter() and traces what each module does with it.

File

./devel_node_access.module, line 330
Functions for debugging node access permissions.

Code

function _devel_node_access_build_nar_data($grants, $node, $function) {
  $data = array();
  $duplicates = array();
  foreach ($grants as $grant) {
    if (empty($data[$grant['realm']][$grant['gid']])) {
      $data[$grant['realm']][$grant['gid']] = array(
        'original' => $grant,
        'current' => $grant,
        'changes' => array(),
      );
    }
    else {
      if (empty($duplicates[$grant['realm']][$grant['gid']])) {
        $duplicates[$grant['realm']][$grant['gid']][] = $data[$grant['realm']][$grant['gid']]['original'];
      }
      $duplicates[$grant['realm']][$grant['gid']][] = $grant;
    }
  }
  if (!empty($duplicates)) {

    // generate an error message
    $msg = t('Devel Node Access has detected duplicate records returned from %function:', array(
      '%function' => $function,
    ));
    $msg .= '<ul>';
    foreach ($duplicates as $realm => $data_by_realm) {
      foreach ($data_by_realm as $gid => $data_by_realm_gid) {
        $msg .= '<li><ul>';
        foreach ($data_by_realm_gid as $grant) {
          $msg .= "<li>{$node->nid}/{$realm}/{$gid}/" . ($grant['grant_view'] ? 1 : 0) . ($grant['grant_update'] ? 1 : 0) . ($grant['grant_delete'] ? 1 : 0) . ' by ' . $grant['#module'] . '</li>';
        }
        $msg .= '</ul></li>';
      }
    }
    $msg .= '</ul>';
    drupal_set_message($msg, 'error', FALSE);
  }
  return $data;
}