您可以这样做的唯一方法是在表单提交处理程序中设置一个值,然后由hook_node_access()
; 您可以使用 Drupal 变量或保存在数据库表中的值。您需要存储访问表单的用户的用户 ID,以及已提交该表单的每个节点的节点 ID。
假设您使用 Drupal 变量,您可以使用类似于以下的代码:
function mymodule_form_submit($form, &$form_state) {
global $user;
$message_nid = 255;
$values = variable_get('access_nid', array());
if (isset($values[$user->uid])) {
if (!isset($values[$user->uid][$message_nid])) {
$values[$user->uid][$message_nid] = $message_nid;
}
}
else {
$values[$user->uid] = array($message_nid => $message_nid);
}
variable_set('access_nid', $values);
$form_state['redirect'] = 'node/' . $message_nid;
}
function mymodule_node_access($node, $op, $account) {
$result = NODE_ACCESS_IGNORE;
if ($op == 'view' && $node->type == 'message') {
$values = variable_get('access_nid', array());
if (!empty($values[$account->uid]) {
if (isset($values[$account->uid][$node->nid])) {
unset($values[$account->uid][$node->nid]);
$result = NODE_ACCESS_ALLOW;
}
else {
$result = NODE_ACCESS_DENY;
}
}
else {
$result = NODE_ACCESS_DENY;
}
}
variable_set('access_nid', $values);
return $result;
}
注意这段代码只允许用户访问一个节点一次;如果用户第二次尝试访问同一个节点,用户将收到“拒绝访问”错误。如果不希望这样做,则应将第二个函数重写如下:
function mymodule_node_access($node, $op, $account) {
if ($op == 'view' && $node->type == 'message') {
$values = variable_get('access_nid', array());
if (!empty($values[$account->uid]) {
if (isset($values[$account->uid][$node->nid])) {
return NODE_ACCESS_ALLOW;
}
return NODE_ACCESS_DENY;
}
}
else {
$result = NODE_ACCESS_DENY;
}
}
return NODE_ACCESS_IGNORE;
}
我使用 Drupal 变量来编写简单的代码;在这种情况下,如果可以创建该内容类型节点的用户很少,则应该使用 Drupal 变量;如果有很多用户可以创建这些节点,那么使用数据库表会更好。
同样在使用 Drupal 变量时,Drupal 使用的是数据库表;不同之处在于该数据库表的内容始终加载到内存中。如果您需要存储大量数据,则不应使用 Drupal 变量。