it-swarm.com.de

Wie überprüfe ich, ob ein Benutzer in einer Vorlagendatei Ansichtszugriff auf einen Knoten hat?

Ich arbeite derzeit an einem einfachen LMS in D8 und habe bereits die grundlegenden Inhaltstypen definiert. Darunter befindet sich ein Inhaltstyp namens Course, der als "Premium" -Inhalt betrachtet werden kann, dh alle Benutzer können auf Felder zugreifen, die allgemeinere Informationen enthalten. Die Benutzer müssen jedoch ein Abonnement erwerben, um auf den gesamten Inhalt zugreifen zu können .

Um dies ohne ein Premium Modul zu ermöglichen (das momentan nicht auf Drupal 8) portiert wurde, habe ich eine einfache Rasteransicht erstellt und deaktiviert " SQL-Umschreiben ", was bisher einwandfrei funktioniert. Für die Anzeige der Knoten in dieser Ansicht habe ich einen neuen Ansichtsmodus mit dem Namen Galerie erstellt, damit die angezeigten Knoten in einer Vorlage gestaltet werden können .
Ich möchte verschiedene CSS-Stile auf diese Knoten in der Ansicht anwenden, auf die der Benutzer zugreifen kann. Ich bin mir nicht sicher, ob dies in der Ansicht selbst möglich ist.

Wie auch immer, ich denke gerade darüber nach, die Ansichtsberechtigung in node - course - gallery.html zu überprüfen, und ich möchte dem Tag article eine Klasse hinzufügen, wenn der Zugriff zulässig ist.

Leider kann ich dafür nicht die richtige Funktion finden. Ich habe es so eingerichtet:

{%
  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',
  ]
%}

Weder user.hasPermission('view nodes') ? 'is-permitted' noch node.access('view') ? 'is-permitted' scheinen eine Wirkung zu haben.

Hast du irgendeine Idee?

4
Marcus C.

@Berdir, nochmals vielen Dank: Ihr Kommentar im letzten Absatz hat mich auf den richtigen Weg gebracht. Ich habe das Problem nun wie folgt gelöst:

Zuerst habe ich hook_preprocess_node() um Include erweitert

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

(Ich bin mir immer noch nicht sicher, warum $node = Node::load(1);, wie erwähnt hier , nicht funktioniert, aber das ist eine andere Geschichte.) Dann habe ich einfach verwendet

{%
  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',
  ]
%}

anstelle meines ursprünglichen Codes. Funktioniert perfekt. Vielen Dank an alle, die hilfreiche Kommentare und Antworten gepostet haben.

2
Marcus C.

Keine wirkliche Antwort, eher ein Vorschlag für einen alternativen Vorschlag, wo dieses Problem bestehen sollte, zumindest nicht genau so.

Die Art und Weise, wie ich ähnliche Probleme zuvor behandelt habe (Paywall für Zeitungen in meinem Fall), besteht darin, nicht das Knotenzugriffssystem dafür zu verwenden. In meinem Fall habe ich Logik in der Vorlage/im Vorprozess verwendet und den Ansichtsmodus dynamisch umgeschaltet. Wenn Sie dies feldweise behandeln können, können Sie auch hook_entity_field_access () implementieren und den Ansichtszugriff nur auf diese bestimmten Felder verweigern.

Trotzdem würde ich erwarten, dass die Methode aufgrund der Sandbox twig Sandbox, die nur is/get-Methodenaufrufe zulässt, nicht aufgerufen werden darf, aber dann würde ich erwarten, dass sie ausgelöst wird eine Ausnahme.

Ich denke auch mit meinem Vorschlag, dass Sie eine Möglichkeit benötigen, nach etwas in der Vorlage zu suchen, aber ich würde das einfach in hook_preprocess_node () tun und es dann als boolesche Variable zu $ ​​variables hinzufügen.

3
Berdir