web-dev-qa-db-ja.com

テンプレートファイルで、ユーザーがノードへの表示アクセス権を持っているかどうかを確認するにはどうすればよいですか?

現在、D8でシンプルなLMSに取り組んでおり、基本的なコンテンツタイプをすでに定義しています。その中にはCourseというコンテンツタイプがあります。これは「プレミアム」コンテンツと見なすことができます。つまり、すべてのユーザーがより一般的な情報を含むフィールドにアクセスできますが、ユーザーはコンテンツ全体にアクセスするためのサブスクリプションを購入する必要があります。

プレミアムモジュールなしでそれを可能にするために(現時点では、Drupal 8)に移植されていません)、単純なグリッドビューを作成して非アクティブ化しました "これまでのところ完全に機能するSQLリライティング。このビューにノードを表示するために、私はgalleryという新しいビューモードを作成しました。これにより、表示されるノードをテンプレートでスタイル設定できます。 。
ユーザーがアクセスできるビューのノードに異なるCSSスタイルを適用したいと思います。これがビュー自体で実行できるかどうかはわかりません。

とにかく、私は現在、node--course--gallery.html内の表示権限を確認することを考えています。アクセスが許可されている場合は、クラスをarticleタグに追加したいと思います。

残念ながら、これに適切な機能を見つけることができないようです。私はそれを次のように設定しました:

_{%
  set classes = [
    node.bundle|clean_class,
    node.isPromoted() ? 'is-promoted',
    node.isSticky() ? 'is-sticky',
    not node.isPublished() ? 'is-unpublished',
    view_mode ? view_mode|clean_class,
    user.hasPermission('view nodes') ? 'is-permitted',
    node.access('view') ? 'is-permitted',
    'clearfix',
  ]
%}
_

user.hasPermission('view nodes') ? 'is-permitted'node.access('view') ? 'is-permitted'も効果がないようです。

何か考えはありますか?

4
Marcus C.

@Berdir、ありがとうございます。最後の段落でのコメントにより、正しい方向に進みました。私は今、次のように問題を解決しました:

まず、hook_preprocess_node()を拡張して、

_$node = $variables['elements']['#node'];
$check = $node->access('view');
$variables['viewaccess'] = $check;
_

(まだわかりませんが、なぜ$node = Node::load(1);は前述の here が機能しないのですか、それは別の話です)。

_{%
  set classes = [
    node.bundle|clean_class,
    node.isPromoted() ? 'is-promoted',
    node.isSticky() ? 'is-sticky',
    not node.isPublished() ? 'is-unpublished',
    view_mode ? view_mode|clean_class,
    viewaccess ? 'is-permitted',
    'clearfix',
  ]
%}
_

私の元のコードの代わりに。完璧に動作します。有益なコメントと返信を投稿してくれたすべての人に感謝します。

2
Marcus C.

実際には答えではなく、その問題が存在するはずの代替提案の提案のように、少なくとも正確にはそうではありません。

以前に同様の問題を処理した方法(私の場合は新聞のペイウォール)はnotこれにノードアクセスシステムを使用することです。私の場合、テンプレート/前処理のロジックを使用し、ビューモードを動的に切り替えました。フィールドごとに処理できる場合は、hook_entity_field_access()を実装して、それらの特定のフィールドのみへのビューアクセスを拒否することもできます。

そうは言っても、twigサンドボックスはis/getメソッドの呼び出しのみを許可するため、メソッドの呼び出しが許可されていないことを期待しますが、それがスローされることを期待しています例外。

私の提案でも、テンプレートで何かを確認する方法が必要になると思いますが、私はそれをhook_preprocess_node()で簡単に実行し、ブール変数として$ variablesに追加します。

3
Berdir