ノードへの直接アクセスを制限し、ビューが特定のノードタイプの必須フィールドにアクセスできるようにする方法は?
たとえば、ビュースライドショーでは、特定のノードタイプに属する画像フィールドをスライドさせています。しかし、検索エンジンがアクセスしたくなく、訪問者がそのノードタイプに属するノードにアクセスすることは望ましくありません。
助言がありますか?
User1によって追加されたノードを非公開にすると、ユーザーがそのコンテンツタイプのコンテンツを編集する権限を持っている場合でも、他のユーザーは編集できなくなります。
Restrict Node Page Viewは、任意のノードへの直接アクセスを制限するより良い方法のようです特定のコンテンツタイプの。
使用方法も非常に簡単で、このモジュールを有効にして、通常どおり直接アクセスできるノードの権限を構成するだけです。
http://drupal.org/project/restrict_node_page_view
プロジェクトページから:
公開する必要があるスライドショーのノードタイプを使用したことがありますが、node/XXXパスを使用してノード自体にアクセスしたくないですか?このモジュールはあなたのためです!
このモジュールを使用すると、ノードタイプと権限に基づいてノードページ(node/XXX)への直接アクセスを無効にできます。
モジュールを有効にし、許可を設定することを忘れないでください。
簡単な解決策は、アクセス可能にしたくないノードを公開しないことです。ビューはそれらのノードからデータを引き続きプルできます。
同じことをしますが、より多くの機能を持つ他のモジュール。
このプロジェクトのメンテナは、「Nodeページビュー」をメンテナに制限して、問題のプロジェクトをマージするよう依頼します。
「制限Nodeページビュー」に対する利点:
「制限Nodeページビュー」に対するデメリット:
node_access()
を使用する必要があります。hook_node_access()
を使用して簡単に実装できる特定のオプションがあります。 node_access()
を実装すると、ノードにアクセスできるユーザーと、そのようなノードを作成、削除、編集、または更新できるユーザーを決定できます。ただし、ビューはこれらのノードからデータをプルできます。
Rules モジュールを使用すると、次のようなルールを実装できます。
{ "rules_check_url" : {
"LABEL" : "Disallow node/* access",
"PLUGIN" : "reaction rule",
"OWNER" : "rules",
"REQUIRES" : [ "rules" ],
"ON" : { "init" : [] },
"IF" : [
{ "text_matches" : {
"text" : [ "site:current-page:url" ],
"match" : "node\/\\d+$",
"operation" : "regex"
}
}
],
"DO" : [
{ "drupal_message" : {
"message" : "Sorry, direct access to URLs like [site:current-page:url] is not allowed around here ...",
"type" : "error"
}
},
{ "redirect" : { "url" : "no_access" } }
]
}
}
上記のルールでは、(まだ)選択されたロールのみに「アクション」を適用することは考慮されていません(たとえば、管理者はこれらのパスを使用してノードを表示できます)。しかし、Rulesモジュールに少し慣れている人にとっては、これは簡単に追加できる「条件」です...
独自のサイトでこのルールを試すには、上記のルールコード全体をコピーして、「インポート」機能で作成した独自のサイトの新しいルールに貼り付けます。次に、さらに編集/調整して、自分の環境に合わせます(たとえば、「Sorry、...」メッセージが表示されます)。
https://www.drupal.org/project/restrict_node_page_view に触発されて、小さなモジュールを自分で書くかもしれません:
/**
* Implements hook_node_access()
*/
function MYMODULE_node_access($node, $op, $account) {
// Default checks
if (!is_object($node)) {
return NODE_ACCESS_IGNORE;
}
$type = is_string($node) ? $node : $node->type;
if($op == 'view' && arg(0) == 'node' && arg(1) === $node->nid) {
// Restrict access to full MYTYPE node for anon users
if ($type == 'MYTYPE' && user_is_anonymous()) {
return NODE_ACCESS_DENY;
}
}
// Default
return NODE_ACCESS_IGNORE;
}