hook_node_access()
カスタム条件に基づいて、ユーザーが一部のノードへのアクセスを拒否するために使用しています。ただし、ユーザーが条件を満たさない場合、このコンテンツを一覧表示するビューに表示したくありません。ビューにhook_node_access()
実装を尊重させる方法はありますか?
hook_node_access()
。これが実装が尊重されない理由です。「設計」であるため、回避策の報告は問題ありません。
hook_node_access()
カスタム条件に基づいて、ユーザーが一部のノードへのアクセスを拒否するために使用しています。ただし、ユーザーが条件を満たさない場合、このコンテンツを一覧表示するビューに表示したくありません。ビューにhook_node_access()
実装を尊重させる方法はありますか?
hook_node_access()
。これが実装が尊重されない理由です。「設計」であるため、回避策の報告は問題ありません。
回答:
hook_node_access()は、完全なノードを表示しようとしたときにのみ呼び出されます。あなたがする必要があるのはhook_node_access_records()とhook_node_grants()を実装することです。
ビューはSQLを使用して、表示するノードを決定します。悲しいことに、パフォーマンス上の理由から、Drupalがすべての潜在的な候補に対してnode_loadを実行し、それらすべての候補に対してhook_node_accessを呼び出すことは単に実行不可能です。何千ものノードを表示するビューを想像してください(特にページャーを使用している場合)。ロジックがSQLで行われない場合、ページャーは非常に珍しい機能を持ちます。したがって、Drupalは、データベースのアクセスレコードを使用してrikが述べたように、それを強制します。
access_recordsの作成はかなり多くの作業を伴いますが、SQLで動作するようになります。したがって、既存のnode_accessモジュールを使用して可能な限り機能を解決することをお勧めします。これは、おそらくアクセスレコードを使用して実装され、ビューで機能するためです。
ちなみに、アクセスレコードは、以下に示すように、node_accessテーブルに格納されます。 各列のコメントを見る と、その目的を理解できます。レルムはノードアクセスに使用されるシステム、gidはレルム内のグループと考えてください。そのグループは、表示、更新、および削除の許可を持つことができます。一般に、各node_accessモジュールは1つ以上のレルムを定義します(複数のnode_accessモジュールが並行して動作することもあります)。ユーザーは、各レルムに1つ以上のGIDを持っています。
Drupalでは、「node_access」タグを持つすべてのクエリに、いくつかの特別なロジックが自動的に追加されます。ドキュメントを参照してくださいタグ付けのを。この特別なロジックは、各レルムの「node_access」テーブルを結合し、「gid」がユーザーに適用されたgidの1つに等しい場合に、ユーザーが適切な権限を持っているという条件を追加します。
このシステム全体により、すべてのクエリでnode_accessを適切に処理したり、クエリをカウントしたりすることもできます。非常に強力ですが、単純なhook_node_accessよりも学習曲線が高くなっています。可能な限り、既存のnode_accessモジュールを使用すると、この頭痛の種をすべて軽減できます。
hook_node_access()
、Viewsモジュールのコードを変更するだけです。