summaryrefslogtreecommitdiff
path: root/modules/node/tests/node_access_test.module
blob: 3004e0c904eb808a1be2b1cd8e8f1d24e2aebad8 (plain)
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
<?php

/**
 * @file
 * Dummy module implementing node access related hooks to test API interaction
 * with the Node module. This module restricts view permission to those with
 * a special 'node test view' permission.
 */

/**
 * Implements hook_node_grants().
 */
function node_access_test_node_grants($account, $op) {
  $grants = array();
  if ($op == 'view' && user_access('node test view', $account)) {
    $grants['node_access_test'] = array(888);
  }
  if ($op == 'view' && $account->uid == variable_get('node_test_node_access_all_uid', 0)) {
    $grants['node_access_all'] = array(0);
  }
  return $grants;
}

/**
 * Implements hook_node_access_records().
 */
function node_access_test_node_access_records($node) {
  $grants = array();
  $grants[] = array(
    'realm' => 'node_access_test',
    'gid' => 888,
    'grant_view' => 1,
    'grant_update' => 0,
    'grant_delete' => 0,
    'priority' => 999,
    );

  return $grants;
}

/**
 * Implements hook_permission().
 *
 * Sets up permissions for this module.
 */
function node_access_test_permission() {
  return array('node test view' => array('title' => 'View content'));
}

/**
 * Implements hook_menu().
 *
 * Sets up a page that lists nodes.
 */
function node_access_test_menu() {
  $items = array();
  $items['node_access_test_page'] = array(
    'title' => 'Node access test',
    'page callback' => 'node_access_test_page',
    'access arguments' => array('access content'),
    'type' => MENU_SUGGESTED_ITEM,
  );
  $items['node_access_entity_test_page'] = array(
    'title' => 'Node access test',
    'page callback' => 'node_access_entity_test_page',
    'access arguments' => array('access content'),
    'type' => MENU_SUGGESTED_ITEM,
  );
  return $items;
}

/**
 * Page callback for node access test page.
 *
 * Page should say "No nodes" if there are no nodes, and "Yes, # nodes" (with
 * the number filled in) if there were nodes the user could access. Also, the
 * database query is shown, and a list of the node IDs, for debugging purposes.
 * And if there is a query exception, the page says "Exception" and gives the
 * error.
 */
function node_access_test_page() {
  $output = '';

  try {
    $query = db_select('node', 'mytab')
      ->fields('mytab');
    $query->addTag('node_access');
    $result = $query->execute()->fetchAll();

    if (count($result)) {
      $output .= '<p>Yes, ' . count($result) . ' nodes</p>';
      $output .= '<ul>';
      foreach ($result as $item) {
        $output .= '<li>' . $item->nid . '</li>';
      }
      $output .= '</ul>';
    }
    else {
      $output .= '<p>No nodes</p>';
    }

    $output .= '<p>' . ((string) $query ) . '</p>';
  }
  catch (Exception $e) {
    $output = '<p>Exception</p>';
    $output .= '<p>' . $e->getMessage() . '</p>';
  }

  return $output;
}

/**
 * Page callback for node access entity test page.
 *
 * Page should say "No nodes" if there are no nodes, and "Yes, # nodes" (with
 * the number filled in) if there were nodes the user could access. Also, the
 * database query is shown, and a list of the node IDs, for debugging purposes.
 * And if there is a query exception, the page says "Exception" and gives the
 * error.
 */
function node_access_entity_test_page() {
  $output = '';
  try {
    $query = new EntityFieldQuery;
    $result = $query->fieldCondition('body', 'value', 'A', 'STARTS_WITH')->execute();
    if (!empty($result['node'])) {
      $output .= '<p>Yes, ' . count($result['node']) . ' nodes</p>';
      $output .= '<ul>';
      foreach ($result['node'] as $nid => $v) {
        $output .= '<li>' . $nid . '</li>';
      }
      $output .= '</ul>';
    }
    else {
      $output .= '<p>No nodes</p>';
    }
  }
  catch (Exception $e) {
    $output = '<p>Exception</p>';
    $output .= '<p>' . $e->getMessage() . '</p>';
  }

  return $output;
}