web-dev-qa-db-ja.com

ビューにhook_node_accessを尊重させる

私はhook_node_access()を使用して、ユーザーがカスタム条件に基づいて一部のノードにアクセスすることを拒否しています。ただし、ユーザーが基準に合格しなかった場合に、このコンテンツを一覧表示するビューに表示したくありません。ビューにhook_node_access()の実装を尊重させる方法はありますか?

14
nenne

私は少し前に同じ質問をしました here

hook_node_accessviewsまたはmenusでは認識されません。防衛の最後の行としてのみ使用してください。

ノードアクセスを制御するより良い方法は、hook_node_access_recordsおよびhook_node_grants説明どおり ここ および ここ

6
Baba

hook_node_access() ノード全体を表示しようとしたときにのみ呼び出されます。 hook_node_access_records() および hook_node_grants() を実装する必要があります。

4
rik

ビューはSQLを使用して、表示するノードを決定します。悲しいことに、パフォーマンス上の理由から、Drupalですべての潜在的な候補に対してnode_loadを実行し、それらすべての候補に対してそれぞれhook_node_accessを呼び出すことは不可能です。何千ものビューを想像してください。ノードの(特にページャーを使用する場合)。ロジックがSQLで実行されない場合、ページャーは非常に異常な機能を持つため、Drupalは、rikがアクセスレコードを使用して言及したように強制します。データベース。

Access_recordsを作成するとかなり多くの作業が必要になりますが、SQLで動作します。したがって、アクセスレコードを使用して実装されるため、ビューで機能するため、既存のnode_accessモジュールを使用して機能を可能な限り解決することをお勧めします。

ちなみに、以下に示すように、アクセスレコードはテーブルnode_accessテーブルに格納されます。 enter image description here 各列のコメントを通じて、目的を理解することができます。レルムはノードアクセスに使用されるシステムと考え、gidはレルム内のグループと考えます。そのグループは、表示、更新、および削除の権限を持つことができます。一般に、各node_accessモジュールは1つ以上のレルムを定義します(複数のnode_accessモジュールが並行して動作することもあります)。ユーザーは、各レルムに1つ以上のgidを持っています。

Drupalでは、「node_access」タグを持つすべてのクエリに自動的に特別なロジックが追加されます。タグ付けの詳細については documentation を参照してください。この特別なロジックは「各レルムのnode_access "テーブル。" gid "がユーザーに適用されたgidの1つと等しいという条件を追加し、ユーザーは適切な権限を持っています。

このシステム全体により、すべてのクエリがnode_accessを適切に処理し、クエリをカウントすることもできます。非常に強力ですが、単純なhook_node_accessに比べて学習曲線が高くなります。可能な限り、既存のnode_accessモジュールを使用することで、この頭痛の種全体を節約できます。

1
Thomas4019