これを行う唯一の方法は、フォーム送信ハンドラーに値を設定し、それを によってチェックすること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;
}
このコードでは、ユーザーがノードに 1 回だけアクセスできることに注意してください。ユーザーが同じノードに 2 回アクセスしようとすると、「アクセスが拒否されました」というエラーが表示されます。それが望ましくない場合は、2 番目の関数を次のように書き直す必要があります。
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 変数を使用しないでください。