You are here

nodeaccess_userreference.module in Node access user reference 7.2

The Node access user reference module.

File

nodeaccess_userreference.module
View source
<?php

/**
 * @file
 * The Node access user reference module.
 */

/**
 * Implements hook_menu().
 */
function nodeaccess_userreference_menu() {
  $items = array();
  $items['admin/config/nodeaccess_userreference'] = array(
    'title' => 'Node access user reference',
    'description' => 'Configure Node access user reference.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'nodeaccess_userreference_admin_settings',
    ),
    'access arguments' => array(
      'administer site configuration',
    ),
    'type' => MENU_NORMAL_ITEM,
  );
  return $items;
}

/**
 * System settings form for Node access user reference.
 */
function nodeaccess_userreference_admin_settings($form, &$form_state) {
  $form['nodeaccess_userreference_priority'] = array(
    '#type' => 'weight',
    '#title' => t('Set node grants priority for Node access user reference'),
    '#default_value' => variable_get('nodeaccess_userreference_priority', 0),
    '#description' => t('If you are only using this access control module, you can safely ignore this.
    If you are using multiple access control modules you can adjust the priority of this module.'),
  );
  $form['nodeaccess_userreference_author_view'] = array(
    '#type' => 'checkbox',
    '#title' => t('Grant <em>view</em> access to node authors'),
    '#default_value' => variable_get('nodeaccess_userreference_author_view', 1),
    '#description' => t('Grants <em>view</em> access to authors.  Use this if not using other node access modules to set author access.'),
  );
  $form['nodeaccess_userreference_author_update'] = array(
    '#type' => 'checkbox',
    '#title' => t('Grant <em>edit</em> access to node authors'),
    '#default_value' => variable_get('nodeaccess_userreference_author_update', 1),
    '#description' => t('Grants <em>edit</em> access to authors.  Use this if not using other node access modules to set author access.'),
  );
  $form['nodeaccess_userreference_author_delete'] = array(
    '#type' => 'checkbox',
    '#title' => t('Grant <em>delete</em> access to node authors'),
    '#default_value' => variable_get('nodeaccess_userreference_author_delete', 1),
    '#description' => t('Grants <em>delete</em> access to authors.  Use this if not using other node access modules to set author access.'),
  );

  // Add additional submit processing.
  $form['#submit'][] = 'nodeaccess_userreference_admin_settings_submit';
  return system_settings_form($form);
}

/**
 * Submit function for the system settings form for nodeaccess_userreference.
 */
function nodeaccess_userreference_admin_settings_submit() {
  node_access_needs_rebuild(TRUE);
}

/**
 * Implements hook_node_grants().
 */
function nodeaccess_userreference_node_grants($account, $op) {
  $grants = array();
  $grants['nodeaccess_userreference'][] = $account->uid;
  $grants['nodeaccess_userreference_author'][] = $account->uid;
  return $grants;
}

/**
 * Implements hook_form-FORM-ID_alter().
 */
function nodeaccess_userreference_form_field_ui_field_edit_form_alter(&$form, $form_state) {
  if ($form['#field']['type'] == "user_reference") {
    $data = nodeaccess_userreference_field_settings($form['#field']['field_name']);
    $form['field']['settings']['nodeaccess_userreference'] = array(
      '#type' => 'fieldset',
      '#title' => t('Node access user reference'),
    );
    $form['field']['settings']['nodeaccess_userreference']['view'] = array(
      '#type' => 'checkbox',
      '#title' => t('Grant <em>view</em> node access to user'),
      '#default_value' => $data['view'],
      '#description' => t('Give the referenced user access to view the node, if they cannot already do so.'),
    );
    $form['field']['settings']['nodeaccess_userreference']['update'] = array(
      '#type' => 'checkbox',
      '#title' => t('Grant <em>edit</em> node access to user'),
      '#default_value' => $data['update'],
      '#description' => t('Give the referenced user access to edit the node, if they cannot already do so.'),
    );
    $form['field']['settings']['nodeaccess_userreference']['delete'] = array(
      '#type' => 'checkbox',
      '#title' => t('Grant <em>delete</em> node access to user'),
      '#default_value' => $data['delete'],
      '#description' => t('Give the referenced user access to delete the node, if they cannot already do so.'),
    );
    $form['#submit'][] = 'nodeaccess_userreference_form_field_ui_field_edit_form_submit';
  }
}

/**
 * Extra submit function for User reference field config.
 */
function nodeaccess_userreference_form_field_ui_field_edit_form_submit($form, &$form_state) {
  $data =& $form_state['values']['field']['settings']['nodeaccess_userreference'];
  $field_name =& $form_state['values']['instance']['field_name'];
  nodeaccess_userreference_field_settings($field_name, $data);
  $type =& $form_state['values']['instance']['bundle'];
  $nodes = node_load_multiple(NULL, array(
    'type' => $type,
  ));
  if ($nodes) {

    // Because the field settings have changed we should prompt for a full rebuild.
    node_access_needs_rebuild(TRUE);
  }
}

/**
 * Implements hook_node_access_records().
 */
function nodeaccess_userreference_node_access_records($node) {
  $grants = array();
  $bundles = field_info_instances('node');
  $priority = variable_get('nodeaccess_userreference_priority', 0);
  foreach ($bundles as $fields) {
    foreach ($fields as $field) {
      if ($field['widget']['module'] == 'user_reference') {
        $data = nodeaccess_userreference_field_settings($field['field_name']);
        if (!empty($data) && !empty($node->{$field}['field_name'])) {
          foreach ((array) $node->{$field}['field_name'] as $language) {
            foreach ($language as $userreference) {
              if ($userreference['uid']) {
                $uid =& $userreference['uid'];
                $grants[] = array(
                  'realm' => 'nodeaccess_userreference',
                  'gid' => $uid,
                  'priority' => $priority,
                  'grant_view' => $data['view'],
                  'grant_update' => $data['update'],
                  'grant_delete' => $data['delete'],
                );
              }
            }
          }
        }
      }
    }
  }
  if (!empty($grants)) {

    // Store author grants according to configuration.
    $grant_view = variable_get('nodeaccess_userreference_author_view', 1);
    $grant_update = variable_get('nodeaccess_userreference_author_update', 1);
    $grant_delete = variable_get('nodeaccess_userreference_author_delete', 1);
    if ($grant_view || $grant_update || $grant_delete) {
      $grants[] = array(
        'realm' => 'nodeaccess_userreference_author',
        'gid' => $node->uid,
        'priority' => $priority,
        'grant_view' => $grant_view,
        'grant_update' => $grant_update,
        'grant_delete' => $grant_delete,
      );
    }
    return $grants;
  }
  return NULL;
}

/**
 * Set and get nodeaccess userreference field settings.
 *
 * @param $type_name
 *   The node type.
 * @param $field_name
 *   The name of the field.
 * @param $variable
 *   If set will update the value of the settings for this field.
 * @return
 *   The stored or updated value of the settings for this field.
 */
function nodeaccess_userreference_field_settings($field_name, $variable = NULL) {
  $data = variable_get('nodeaccess_userreference', NULL);
  if (isset($variable)) {
    $data[$field_name] = $variable;
    variable_set('nodeaccess_userreference', $data);
  }
  if (isset($data[$field_name])) {
    return $data[$field_name];
  }
}

/**
 * Implements hook_node_access_explain().
 *
 * This gives the Devel module nice information to display when
 * debugging node grants.
 */
function nodeaccess_userreference_node_access_explain($row) {
  if (in_array($row->realm, array(
    'nodeaccess_userreference',
    'nodeaccess_userreference_author',
  ))) {
    foreach (array(
      'view',
      'update',
      'delete',
    ) as $op) {
      $gop = 'grant_' . $op;
      if (!empty($row->{$gop})) {
        $ops[] = $op;
      }
    }
    $account = user_load($row->gid);
    $do = implode('/', $ops);
    switch ($row->realm) {
      case 'nodeaccess_userreference':
        return t('Referenced user %name may !do this node', array(
          '%name' => $account->name,
          '!do' => $do,
        ));
      case 'nodeaccess_userreference_author':
        return t('Node author %name may !do this node', array(
          '%name' => $account->name,
          '!do' => $do,
        ));
    }
  }
}

Functions

Namesort descending Description
nodeaccess_userreference_admin_settings System settings form for Node access user reference.
nodeaccess_userreference_admin_settings_submit Submit function for the system settings form for nodeaccess_userreference.
nodeaccess_userreference_field_settings Set and get nodeaccess userreference field settings.
nodeaccess_userreference_form_field_ui_field_edit_form_alter Implements hook_form-FORM-ID_alter().
nodeaccess_userreference_form_field_ui_field_edit_form_submit Extra submit function for User reference field config.
nodeaccess_userreference_menu Implements hook_menu().
nodeaccess_userreference_node_access_explain Implements hook_node_access_explain().
nodeaccess_userreference_node_access_records Implements hook_node_access_records().
nodeaccess_userreference_node_grants Implements hook_node_grants().