You are here

simple_access.module in Simple Access 8.3

Builds simple access definition for content access.

This module allows administrators to make nodes viewable by specific 'access groups'. Each access group can contain any number of roles. If a node is not assigned to any access groups, it will remain viewable by all users.

File

simple_access.module
View source
<?php

/**
 * @file
 * Builds simple access definition for content access.
 *
 * This module allows administrators to make nodes viewable by specific
 * 'access groups'. Each access group can contain any number of roles.
 * If a node is not assigned to any access groups, it will remain viewable
 * by all users.
 */
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\node\NodeInterface;
use Drupal\node\Entity\NodeType;
use Drupal\node\NodeTypeInterface;
use Drupal\simple_access\Entity\SimpleAccessGroup;
use Drupal\simple_access\Entity\SimpleAccessProfile;

/**
 * Implements hook_field_values_init().
 */
function simple_access_node_field_values_init(EntityInterface $entity) {
  if ($node_type = NodeType::load($entity
    ->bundle())) {
    $entity->simple_access = $node_type
      ->getThirdPartySettings('simple_access');
  }
}

/**
 * Implements hook_node_load().
 */
function simple_access_node_load(array $nodes) {
  $nids = [];
  foreach ($nodes as $nid => $node) {
    $nids[] = $nid;
    $node->simple_access = [];
  }
  $groups = \Drupal::database()
    ->select('simple_access_node_group', 'na')
    ->fields('na', [
    'nid',
    'gid',
    'grant_view',
    'grant_update',
    'grant_delete',
  ])
    ->condition('nid', $nids, 'IN')
    ->execute()
    ->fetchAll(PDO::FETCH_ASSOC);
  $profiles = \Drupal::database()
    ->select('simple_access_node_profile', 'pn')
    ->fields('pn', [
    'nid',
    'pid',
  ])
    ->condition('nid', $nids, 'IN')
    ->execute()
    ->fetchAll(PDO::FETCH_ASSOC);
  foreach ($groups as $row) {
    $nodes[$row['nid']]->simple_access['groups'][$row['gid']] = array_combine([
      'nid',
      'gid',
      'view',
      'update',
      'delete',
    ], $row);
  }
  foreach ($profiles as $row) {
    $nodes[$row['nid']]->simple_access['profiles'][$row['pid']] = $row['pid'];
  }
}

/**
 * Implements hook_node_insert().
 */
function simple_access_node_insert(NodeInterface $node) {
  simple_access_node_save($node);
}

/**
 * Implements hook_node_update().
 */
function simple_access_node_update(NodeInterface $node) {
  simple_access_node_save($node);
}

/**
 * Save node information.
 */
function simple_access_node_save(NodeInterface $node) {
  \Drupal::database()
    ->delete('simple_access_node_group')
    ->condition('nid', $node
    ->id())
    ->execute();
  if (isset($node->simple_access['groups'])) {
    foreach ($node->simple_access['groups'] as $gid => $access) {
      if ($access['view'] || $access['update'] || $access['delete']) {
        \Drupal::database()
          ->insert('simple_access_node_group')
          ->fields([
          'nid' => $node
            ->id(),
          'gid' => $gid,
          'grant_view' => $access['view'],
          'grant_update' => $access['update'],
          'grant_delete' => $access['delete'],
        ])
          ->execute();
      }
    }
  }
  \Drupal::database()
    ->delete('simple_access_node_profile')
    ->condition('nid', $node
    ->id())
    ->execute();
  if (isset($node->simple_access['profiles'])) {
    foreach (array_filter($node->simple_access['profiles']) as $pid) {
      \Drupal::database()
        ->insert('simple_access_node_profile')
        ->fields([
        'nid' => $node
          ->id(),
        'pid' => $pid,
      ])
        ->execute();
    }
  }
}

/**
 * Implements hook_node_delete().
 */
function simple_access_node_delete(NodeInterface $node) {
  foreach ([
    'simple_access_node_group',
    'simple_access_node_profile',
  ] as $table) {
    \Drupal::database()
      ->delete($table)
      ->condition('nid', $node
      ->id())
      ->execute();
  }
}

/**
 * Implements hook_node_access_records().
 */
function simple_access_node_access_records(NodeInterface $node) {
  $records = [];
  if (!empty($node->simple_access['profiles'])) {
    foreach (array_filter($node->simple_access['profiles']) as $pid) {
      $records[] = [
        'realm' => 'simple_access_profile:' . $pid,
        'gid' => 0,
        'grant_view' => 1,
        'grant_update' => 1,
        'grant_delete' => 1,
        'priority' => 0,
      ];
    }
  }
  if (!empty($node->simple_access['groups'])) {

    // Loop through simple_access arrays from page submission
    // $type is either 'view', 'update', or 'delete'.
    foreach ($node->simple_access['groups'] as $gid => $access) {
      if ($access['view'] || $access['update'] || $access['delete']) {
        if ($gid == 'owner') {
          $id = $node
            ->getOwnerId();
        }
        else {
          $id = 0;
        }
        $records[] = [
          'realm' => 'simple_access_group:' . $gid,
          'gid' => $id,
          'grant_view' => $access['view'],
          'grant_update' => $access['update'],
          'grant_delete' => $access['delete'],
          'priority' => 0,
        ];
      }
    }
  }
  return $records;
}

/**
 * Implements hook_node_grants().
 */
function simple_access_node_grants(AccountInterface $account, $op) {
  $grants = [];
  $groups = SimpleAccessGroup::loadMultiple();
  $profiles = SimpleAccessProfile::loadMultiple();

  /** @var \Drupal\simple_access\Entity\SimpleAccessGroup $group */
  foreach ($groups as $group) {
    if ($grant = $group
      ->buildGrant($account, $op)) {
      $grants = array_merge_recursive($grants, $grant);
    }
  }

  /** @var \Drupal\simple_access\Entity\SimpleAccessProfile $profile */
  foreach ($profiles as $profile) {
    if ($grant = $profile
      ->buildGrant($account, $op)) {
      $grants = array_merge_recursive($grants, $grant);
    }
  }
  return $grants;
}

/**
 * Implements hook_entity_extra_field_info().
 */
function simple_access_entity_extra_field_info() {
  $fields = [];
  foreach (NodeType::loadMultiple() as $bundle) {
    $fields['node'][$bundle
      ->id()]['form']['simple_access'] = [
      'label' => t('Simple Access'),
      'description' => t('Simple Access module form.'),
      'weight' => 20,
    ];
  }
  return $fields;
}

/**
 * Implements hook_node_access_explain().
 */
function simple_access_node_access_explain($row) {
  $perms = [
    'view' => t('View'),
    'update' => t('Update'),
    'delete' => t('Delete'),
  ];
  list($type, $id) = explode(':', $row->realm);
  switch ($type) {
    case 'simple_access_group':
      if ($id == 'owner') {
        return t('Access for the content owner');
      }
      if (!($group = SimpleAccessGroup::load($id))) {
        return t('Unknown access restrictions for ":id"', [
          ':id' => $id,
        ]);
      }
      return t('Access restrictions for the ":group" group', [
        ':group' => $group
          ->label(),
      ]);
    case 'simple_access_profile':
      if ($profile = SimpleAccessProfile::load($id)) {
        $message = t('Access restrictions for profile ":profile"', [
          ':profile' => $profile
            ->label(),
        ]);
        if (!empty($profile->access)) {
          foreach ($profile->access as $gid => $access) {
            if ($group = SimpleAccessGroup::load($gid)) {
              $access = array_intersect_key($perms, array_filter($access));
              if (!empty($access)) {
                $message .= ' * ' . t('":group" group can :perm.', [
                  ':group' => $group
                    ->label(),
                  ':perm' => implode(', ', $access),
                ]);
              }
            }
            else {
              $message .= ' * ' . t('Unknown group ":gid"', [
                ':gid' => $gid,
              ]);
            }
          }
        }
      }
      else {
        $message = t('Unknown profile ":id"', [
          ':id' => $id,
        ]);
      }
      return $message;
  }
}

/**
 * Implements hook_form_FORM_ID_alter().
 *
 * For node_form.
 */
function simple_access_form_node_form_alter(&$form, FormStateInterface $form_state, $form_id) {

  /** @var \Drupal\node\Entity\Node $node */
  $node = $form_state
    ->getFormObject()
    ->getEntity();

  // Build the simple access form.
  if ($simple_access_form = simple_access_form($node
    ->bundle(), $node->simple_access)) {
    $simple_access_form['simple_access']['#group'] = 'advanced';
    $form = array_merge($form, $simple_access_form);
    $form['#entity_builders'][] = 'simple_access_form_node_form_builder';
  }
}

/**
 * Build node to include the simple_access settings.
 */
function simple_access_form_node_form_builder($entity_type, NodeInterface $node, &$form, FormStateInterface $form_state) {
  $node->simple_access = $form_state
    ->getValue('simple_access');
}

/**
 * Implements hook_form_FORM_ID_alter().
 *
 * For node_type_form.
 */
function simple_access_form_node_type_form_alter(&$form, FormStateInterface $form_state) {

  /** @var \Drupal\node\NodeTypeInterface $node_type */
  $node_type = $form_state
    ->getFormObject()
    ->getEntity();
  $settings = $node_type
    ->getThirdPartySettings('simple_access');
  $tmp_form = simple_access_form($node_type
    ->id(), $settings, TRUE);
  $tmp_form['simple_access']['#group'] = 'additional_settings';
  $tmp_form['simple_access']['#attached'] = [
    'library' => [
      'simple_access/simple_access.content',
    ],
  ];
  $form['simple_access'] = $tmp_form['simple_access'];
  $form['#entity_builders'][] = 'simple_access_form_node_type_form_builder';
}

/**
 * Add the additional simple_access settings to the Node Type config.
 *
 * @see simple_access_form_node_type_form_alter()
 */
function simple_access_form_node_type_form_builder($entity_type, NodeTypeInterface $node_type, &$form, FormStateInterface $form_state) {
  $node_type
    ->setThirdPartySetting('simple_access', 'profiles', $form_state
    ->getValue([
    'simple_access',
    'profiles',
  ], []));
  $node_type
    ->setThirdPartySetting('simple_access', 'groups', $form_state
    ->getValue([
    'simple_access',
    'groups',
  ], []));
}

/**
 * Simple Access form.
 */
function simple_access_form($type_id, $access, $admin = FALSE) {

  /** @var \Drupal\user\UserInterface $user */
  $user = \Drupal::currentUser();
  $form['simple_access'] = [
    '#type' => 'details',
    '#title' => t('Access'),
    '#tree' => TRUE,
    '#attributes' => [
      'class' => [
        'simple-access-settings',
      ],
    ],
    '#weight' => 20,
    'profiles' => [
      '#type' => 'simple_access_profiles',
      '#title' => t('Profiles'),
      '#default_value' => $access['profiles'],
      '#node_type' => $type_id,
    ],
    'groups' => [
      '#type' => 'simple_access_groups',
      '#default_value' => $access['groups'],
      '#override_privilege' => $admin,
      '#node_type' => $type_id,
    ],
    '#access' => $user
      ->hasPermission('assign owner permissions') || $user
      ->hasPermission("assign owner permissions for {$type_id}") || $user
      ->hasPermission('assign groups to nodes') || $user
      ->hasPermission("assign groups to {$type_id} nodes") || $user
      ->hasPermission('assign profiles to nodes') || $user
      ->hasPermission("assign profiles to {$type_id} nodes") || $user
      ->hasPermission('administer nodes'),
  ];
  return $form;
}

/**
 * Get all profiles as options for a select list.
 *
 * @deprecated
 */
function simple_access_get_profiles_select() {
  $profiles = simple_access_get_profiles();
  return array_map('_simple_access_filter_profiles', $profiles);
}

/**
 * Callback to filter profiles.
 */
function _simple_access_filter_profiles($a) {
  return $a['name'];
}

/**
 * Get simple access profiles.
 *
 * @deprecated
 */
function simple_access_get_profiles($pid = NULL) {
  $profiles = [];
  $query = \Drupal::database()
    ->select('simple_access_profiles', 'p')
    ->fields('p', [
    'pid',
    'name',
  ])
    ->orderBy('weight', 'ASC')
    ->orderBy('name');
  if ($pid) {
    $query
      ->condition('pid', $pid);
  }
  $profiles = $query
    ->execute()
    ->fetchAllAssoc('pid', PDO::FETCH_ASSOC);
  $query = \Drupal::database()
    ->select('simple_access_profiles_access', 'a')
    ->fields('a', [
    'pid',
    'gid',
    'sa_view',
    'sa_update',
    'sa_delete',
  ])
    ->orderBy('pid');
  if ($pid) {
    $query
      ->condition('pid', $pid);
  }
  $result = $query
    ->execute();
  while ($a = $result
    ->fetchAssoc(PDO::FETCH_ASSOC)) {
    if (isset($profiles[$a['pid']])) {
      $profiles[$a['pid']]['access'][$a['gid']] = $a;
    }
  }
  return isset($pid) ? $profiles[$pid] : $profiles;
}

/**
 * Return list of groups.
 *
 * @deprecated
 */
function simple_access_get_groups($gid = NULL) {
  $groups = SimpleAccessGroup::loadMultiple([
    $gid,
  ]);
  uasort($groups, [
    SimpleAccessGroup::class,
    'sort',
  ]);
  return $groups;
}

/**
 * Return groups for which user is a member.
 *
 * @deprecated
 */
function simple_access_group_select() {
  $groups = simple_access_get_groups();
  $groups = array_filter($groups, function ($a) {

    /** @var \Drupal\simple_access\Entity\SimpleAccessGroup $a */
    return $a
      ->canManageAccess();
  });
  return $groups;
}

/**
 * Get a list of group/grant ids based on a list of user roles.
 *
 * $roles string
 *   A linear list a role ids.
 *
 * @deprecated
 */
function simple_access_groups_from_roles($roles) {

  // There probably should be some 'static' stuff going on here
  // always return gid 0 just to be safe.
  $gids = [];
  $result = \Drupal::database()
    ->select('simple_access_roles', 'r')
    ->fields('r', [
    'gid',
  ])
    ->condition('rid', $roles, 'IN')
    ->execute();
  $gids = $result
    ->fetchAllAssoc('gid', PDO::FETCH_ASSOC);
  return $gids;
}

/**
 * Check if a user's role is in a group.
 *
 * @deprecated
 */
function simple_access_groups_check_user($groups) {
  global $user;
  $roles = array_keys($user->roles);
  $roles[] = $user->uid ? DRUPAL_AUTHENTICATED_RID : DRUPAL_ANONYMOUS_RID;
  $user_groups = simple_access_groups_from_roles($roles);
  return array_intersect(array_filter($groups), $user_groups);
}

/**
 * Filter the access records for the current user.
 */
function _simple_access_filter_access($a) {
  $groups = simple_access_group_select();
  return isset($a['gid']) && isset($groups[$a['gid']]['access']) && $groups[$a['gid']]['access'];
}

/**
 * Implements hook_action_info().
 */
function simple_access_action_info() {
  return [
    'simple_access_owner_grant' => [
      'type' => 'node',
      'label' => t('Grant permissions to content owner'),
      'description' => t('Grant permissions to content owner'),
      'configurable' => TRUE,
      'triggers' => [
        'node_insert',
        'node_update',
      ],
      'behavior' => [
        'changes_property',
      ],
    ],
    'simple_access_owner_revoke' => [
      'type' => 'node',
      'label' => t('Revoke permissions from content owner'),
      'description' => t('Revoke permissions from content owner'),
      'configurable' => TRUE,
      'triggers' => [
        'node_insert',
        'node_update',
      ],
      'behavior' => [
        'changes_property',
      ],
    ],
    'simple_access_group_grant' => [
      'type' => 'node',
      'label' => t('Grant permissions to groups'),
      'description' => t('Grant permissions to groups'),
      'configurable' => TRUE,
      'triggers' => [
        'node_insert',
        'node_update',
      ],
      'behavior' => [
        'changes_property',
      ],
    ],
    'simple_access_group_revoke' => [
      'type' => 'node',
      'label' => t('Revoke permissions from groups'),
      'description' => t('Revoke permissions from groups'),
      'configurable' => TRUE,
      'triggers' => [
        'node_insert',
        'node_update',
      ],
      'behavior' => [
        'changes_property',
      ],
    ],
    'simple_access_profile_enable' => [
      'type' => 'node',
      'label' => t('Enable access profile'),
      'description' => t('Enable access profile'),
      'configurable' => TRUE,
      'triggers' => [
        'node_insert',
        'node_update',
      ],
      'behavior' => [
        'changes_property',
      ],
    ],
    'simple_access_profile_disable' => [
      'type' => 'node',
      'label' => t('Disable access profile'),
      'description' => t('Disable access profile'),
      'configurable' => TRUE,
      'triggers' => [
        'node_insert',
        'node_update',
      ],
      'behavior' => [
        'changes_property',
      ],
    ],
  ];
}

/**
 * Configure grant content owner permissions.
 */
function simple_access_owner_grant_form($settings = []) {
  $form = [];
  $form['sa_owner_permissions'] = [
    '#type' => 'checkboxes',
    '#title' => t('Grant owner permissions'),
    '#default_value' => empty($settings['sa_owner_permissions']) ? [] : $settings['sa_owner_permissions'],
    '#options' => [
      'sa_view' => t('View'),
      'sa_update' => t('Update'),
      'sa_delete' => t('Delete'),
    ],
    '#description' => t('Select permissions to grant for the content owner'),
  ];
  return $form;
}

/**
 * Submit callback for the owner grant form.
 */
function simple_access_owner_grant_submit($form, &$form_state) {
  $settings = [
    'sa_owner_permissions' => $form_state['values']['sa_owner_permissions'],
  ];
  return $settings;
}

/**
 * Action to grant permissions to the owner.
 */
function simple_access_owner_grant($node, $context) {
  foreach (array_filter($context['sa_owner_permissions']) as $option) {
    $node->simple_access_owner[$option] = 1;
  }
}

/**
 * Configure revoke content owner permissions.
 */
function simple_access_owner_revoke_form($settings = []) {
  $form = [];
  $form['sa_owner_permissions'] = [
    '#type' => 'checkboxes',
    '#title' => t('Revoke owner permissions'),
    '#default_value' => empty($settings['sa_owner_permissions']) ? [] : $settings['sa_owner_permissions'],
    '#options' => [
      'sa_view' => t('View'),
      'sa_update' => t('Update'),
      'sa_delete' => t('Delete'),
    ],
    '#description' => t('Select permissions to revoke for the content owner'),
  ];
  return $form;
}

/**
 * Submit callback for the owner revoke form.
 */
function simple_access_owner_revoke_submit($form, &$form_state) {
  $settings = [
    'sa_owner_permissions' => $form_state['values']['sa_owner_permissions'],
  ];
  return $settings;
}

/**
 * Action to grant permissions to the owner.
 */
function simple_access_owner_revoke($node, $context) {
  foreach (array_filter($context['sa_owner_permissions']) as $option) {
    $node->simple_access_owner[$option] = 0;
  }
}

/**
 * Configure grant group permissions.
 */
function simple_access_group_grant_form($context) {
  $form = [];
  $display = variable_get('simple_access_display', [
    'view' => 1,
    'update' => 0,
    'delete' => 0,
  ]);
  $form['sa_group_permissions'] = [
    '#tree' => TRUE,
    '#theme' => 'simple_access_form',
    '#attached' => [
      'css' => [
        drupal_get_path('module', 'simple_access') . '/simple_access.css',
      ],
    ],
  ];
  $groups = simple_access_group_select();

  // To prevent a php notice.
  if (!isset($context['sa_group_permissions'])) {
    $context['sa_group_permissions'] = [];
  }
  foreach ($groups as $gid => $group) {
    $priv = $group['access'] || user_access('administer nodes');
    $form['sa_group_permissions'][$gid] = [
      '#access' => $priv,
    ];
    $form['sa_group_permissions'][$gid]['name'] = [
      '#markup' => $group['name'],
    ];
    $form['sa_group_permissions'][$gid]['sa_view'] = [
      '#type' => 'checkbox',
      '#default_value' => isset($context['sa_group_permissions'][$gid]['sa_view']) ? $context['sa_group_permissions'][$gid]['sa_view'] : 0,
      '#access' => $priv && $display['view'],
    ];
    $form['sa_group_permissions'][$gid]['sa_update'] = [
      '#type' => 'checkbox',
      '#default_value' => isset($context['sa_group_permissions'][$gid]['sa_update']) ? $context['sa_group_permissions'][$gid]['sa_update'] : 0,
      '#access' => $priv && $display['update'],
    ];
    $form['sa_group_permissions'][$gid]['sa_delete'] = [
      '#type' => 'checkbox',
      '#default_value' => isset($context['sa_group_permissions'][$gid]['sa_delete']) ? $context['sa_group_permissions'][$gid]['sa_delete'] : 0,
      '#access' => $priv && $display['delete'],
    ];
  }
  return $form;
}

/**
 * Submit callback for group grant form.
 */
function simple_access_group_grant_submit($form, &$form_state) {
  $context = [
    'sa_group_permissions' => $form_state['values']['sa_group_permissions'],
  ];
  return $context;
}

/**
 * Action to grant permissions to the owner.
 */
function simple_access_group_grant($node, $context) {
  foreach ($context['sa_group_permissions'] as $gid => $group) {
    foreach (array_keys(array_filter($group)) as $option) {
      $node->simple_access[$gid][$option] = 1;
    }

    // Add defaults.
    $node->simple_access[$gid] += [
      'view' => 0,
      'update' => 0,
      'delete' => 0,
    ];
  }
}

/**
 * Configure revoke group permissions.
 */
function simple_access_group_revoke_form($context = []) {
  $form = [];
  $display = variable_get('simple_access_display', [
    'view' => 1,
    'update' => 0,
    'delete' => 0,
  ]);
  $form['sa_group_permissions'] = [
    '#tree' => TRUE,
    '#theme' => 'simple_access_form',
    '#attached' => [
      'css' => [
        drupal_get_path('module', 'simple_access') . '/simple_access.css',
      ],
    ],
  ];
  $groups = simple_access_group_select();

  // To prevent a php notice.
  if (!isset($context['sa_group_permissions'])) {
    $context['sa_group_permissions'] = [];
  }
  foreach ($groups as $gid => $group) {
    $priv = $group['access'] || user_access('administer nodes');
    $form['sa_group_permissions'][$gid] = [
      '#access' => $priv,
    ];
    $form['sa_group_permissions'][$gid]['name'] = [
      '#markup' => $group['name'],
    ];
    $form['sa_group_permissions'][$gid]['sa_view'] = [
      '#type' => 'checkbox',
      '#default_value' => isset($context['sa_group_permissions'][$gid]['sa_view']) ? $context['sa_group_permissions'][$gid]['sa_view'] : 0,
      '#access' => $priv && $display['view'],
    ];
    $form['sa_group_permissions'][$gid]['sa_update'] = [
      '#type' => 'checkbox',
      '#default_value' => isset($context['sa_group_permissions'][$gid]['sa_update']) ? $context['sa_group_permissions'][$gid]['sa_update'] : 0,
      '#access' => $priv && $display['update'],
    ];
    $form['sa_group_permissions'][$gid]['sa_delete'] = [
      '#type' => 'checkbox',
      '#default_value' => isset($context['sa_group_permissions'][$gid]['sa_delete']) ? $context['sa_group_permissions'][$gid]['sa_delete'] : 0,
      '#access' => $priv && $display['delete'],
    ];
  }
  return $form;
}

/**
 * Submit callback for the group revoke form.
 */
function simple_access_group_revoke_submit($form, &$form_state) {
  $context = [
    'sa_group_permissions' => $form_state['values']['sa_group_permissions'],
  ];
  return $context;
}

/**
 * Action to revoke permissions to the owner.
 */
function simple_access_group_revoke($node, $context) {
  foreach ($context['sa_group_permissions'] as $gid => $group) {
    foreach (array_keys(array_filter($group)) as $option) {
      $node->simple_access[$gid][$option] = 0;
    }

    // Add defaults.
    $node->simple_access[$gid] += [
      'view' => 0,
      'update' => 0,
      'delete' => 0,
    ];
  }
}

/**
 * Configure enable security profile.
 */
function simple_access_profile_enable_form($context = []) {
  $form = [];
  $form['sa_profiles'] = [
    '#type' => 'checkboxes',
    '#title' => t('Access profiles'),
    '#default_value' => empty($context['sa_profiles']) ? [] : $context['sa_profiles'],
    '#options' => simple_access_get_profiles_select(),
    '#description' => t('Select permissions to grant for the content owner'),
  ];
  return $form;
}

/**
 * Submit handler for the profile enable form.
 */
function simple_access_profile_enable_submit($form, &$form_state) {
  $context = [
    'sa_profiles' => $form_state['values']['sa_profiles'],
  ];
  return $context;
}

/**
 * Action enable access profile.
 */
function simple_access_profile_enable($node, $context) {
  foreach (array_filter($context['sa_profiles']) as $pid) {
    if (!in_array($pid, $node->simple_access_profiles)) {
      $node->simple_access_profiles[] = $pid;
    }
  }
  return [
    'node' => $node,
  ];
}

/**
 * Configure disable security profile.
 */
function simple_access_profile_disable_form($context = []) {
  $form = [];
  $form['sa_profiles'] = [
    '#type' => 'checkboxes',
    '#title' => t('Access profiles'),
    '#default_value' => empty($context['sa_profiles']) ? [] : $context['sa_profiles'],
    '#options' => simple_access_get_profiles_select(),
    '#description' => t('Select permissions to grant for the content owner'),
  ];
  return $form;
}

/**
 * Submit callback for simple_access_profile_disable form.
 */
function simple_access_profile_disable_submit($form, &$form_state) {
  $context = [
    'sa_profiles' => $form_state['values']['sa_profiles'],
  ];
  return $context;
}

/**
 * Action to disable access profile.
 */
function simple_access_profile_disable($node, $context) {
  foreach (array_filter($context['sa_profiles']) as $pid) {
    if (in_array($pid, $node->simple_access_profiles)) {
      unset($node->simple_access_profiles[array_search($pid, $node->simple_access_profiles)]);
    }
  }
  return [
    'node' => $node,
  ];
}

/**
 * Implements hook_views_api().
 */
function simple_access_views_api() {
  return [
    'api' => 2.0,
  ];
}

Functions

Namesort descending Description
simple_access_action_info Implements hook_action_info().
simple_access_entity_extra_field_info Implements hook_entity_extra_field_info().
simple_access_form Simple Access form.
simple_access_form_node_form_alter Implements hook_form_FORM_ID_alter().
simple_access_form_node_form_builder Build node to include the simple_access settings.
simple_access_form_node_type_form_alter Implements hook_form_FORM_ID_alter().
simple_access_form_node_type_form_builder Add the additional simple_access settings to the Node Type config.
simple_access_get_groups Return list of groups.
simple_access_get_profiles Get simple access profiles.
simple_access_get_profiles_select Get all profiles as options for a select list.
simple_access_groups_check_user Check if a user's role is in a group.
simple_access_groups_from_roles Get a list of group/grant ids based on a list of user roles.
simple_access_group_grant Action to grant permissions to the owner.
simple_access_group_grant_form Configure grant group permissions.
simple_access_group_grant_submit Submit callback for group grant form.
simple_access_group_revoke Action to revoke permissions to the owner.
simple_access_group_revoke_form Configure revoke group permissions.
simple_access_group_revoke_submit Submit callback for the group revoke form.
simple_access_group_select Return groups for which user is a member.
simple_access_node_access_explain Implements hook_node_access_explain().
simple_access_node_access_records Implements hook_node_access_records().
simple_access_node_delete Implements hook_node_delete().
simple_access_node_field_values_init Implements hook_field_values_init().
simple_access_node_grants Implements hook_node_grants().
simple_access_node_insert Implements hook_node_insert().
simple_access_node_load Implements hook_node_load().
simple_access_node_save Save node information.
simple_access_node_update Implements hook_node_update().
simple_access_owner_grant Action to grant permissions to the owner.
simple_access_owner_grant_form Configure grant content owner permissions.
simple_access_owner_grant_submit Submit callback for the owner grant form.
simple_access_owner_revoke Action to grant permissions to the owner.
simple_access_owner_revoke_form Configure revoke content owner permissions.
simple_access_owner_revoke_submit Submit callback for the owner revoke form.
simple_access_profile_disable Action to disable access profile.
simple_access_profile_disable_form Configure disable security profile.
simple_access_profile_disable_submit Submit callback for simple_access_profile_disable form.
simple_access_profile_enable Action enable access profile.
simple_access_profile_enable_form Configure enable security profile.
simple_access_profile_enable_submit Submit handler for the profile enable form.
simple_access_views_api Implements hook_views_api().
_simple_access_filter_access Filter the access records for the current user.
_simple_access_filter_profiles Callback to filter profiles.