Wie füge ich einen Ansichtsmodus für den Entitätstyp hinzu?

7

Ich möchte in Drupal 8 programmgesteuert einen Ansichtsmodus für einen bestimmten Entitätstyp hinzufügen. Ich denke, die Dokumentation zu den Ansichtsmodi für Drupal 8 wurde nicht wie für Drupal 7 bereitgestellt, daher habe ich Probleme bei der Implementierung. Eine Referenz aus dem Modul im Kern würde helfen. Danke

Was muss getan werden, wenn ich vielen Entitäten Ansichtsmodi hinzufügen möchte?

user2750995
quelle

Antworten:

13

Ansichtsmodi sind Konfigurationselemente.

Wie alles andere, was eine Konfigurationsentität ist, ist es sehr einfach, in "Code" zu setzen: Machen Sie es zur Standardkonfiguration. Erstellen Sie es in der Benutzeroberfläche, führen Sie einen Konfigurationsexport ( admin/config/development/configuration/single/export) durch und platzieren Sie die core.entity_view_mode.$entity_type.$view_mode.ymlDatei in config/installIhrem Modul.

Der Ansichtsmodus wird dann automatisch importiert und erstellt, wenn das Modul installiert wird.

Beachten Sie, dass es dann nicht fest codiert ist, sodass ein Benutzer es entfernen kann. Wenn Sie dies verhindern möchten, können Sie implementieren hook_entity_view_mode_access(), um den Löschzugriff auf Ihre Entität für alle zu verweigern.

Standardmäßig tritt ein Problem bei der Neuinstallation des Moduls auf, da dieser Ansichtsmodus bei der Deinstallation des Moduls nicht entfernt wird und bei der erneuten Installation ein Fehler angezeigt wird. Es gibt zwei Möglichkeiten, dies zu beheben:

  • Verschieben Sie die Konfiguration nach config / optional anstelle von config / install. Dann wird es nur erstellt, wenn es noch nicht existiert.
  • Fügen Sie eine erzwungene Abhängigkeit von Ihrem Modul hinzu, die sicherstellt, dass sie bei der Deinstallation des Moduls entfernt wird. Beachten Sie, dass dies nur funktioniert, wenn Sie dies bei der ersten Installation des Moduls installiert haben.

So was:

  dependencies:
    enforced:
      module:
        - yourmodule
Berdir
quelle
Vielen Dank. Wenn ich also Ansichtsmodi für verschiedene Entitäten wie Knoten, Kommentare, Benutzer, Block und viele andere verfügbar machen möchte, muss ich die Konfiguration für alle diese einzeln exportieren. Oder gibt es eine Möglichkeit, neue Ansichtsmodi mithilfe von zu erstellen Einige Funktionen der Entity-API.
user2750995
Ja, Sie können dies auch mit Code tun, genauso wie jede andere Entität erstellt wird. Das Problem besteht darin, zu wissen, für welche Entitätstypen der Ansichtsmodus erstellt werden soll. Da einige möglicherweise bereits vorhanden sind, wenn das Modul aktiviert ist, werden andere möglicherweise später verfügbar sein. Siehe drupal.org/node/2430821 , dort schlug ich vor, diese dynamische Logik in token.module zu entfernen (was genau dies gerade tut) und stattdessen nur zu dokumentieren, wie ein Ansichtsmodus in der Benutzeroberfläche benannt wird, damit er mit dem Token funktioniert .Modul.
Berdir
Wie kann dieser Ansichtsmodus automatisch entfernt werden, wenn der Benutzer das Modul deinstalliert?
user2750995
1
Dies sollte bereits über das Konfigurationsabhängigkeitssystem geschehen. Wenn nicht, dann ist das ein Kernfehler, den Sie öffnen sollten. Verlinken Sie hier und ich werde dort einen Kommentar abgeben.
Berdir
1
Wenn ich das Modul deinstalliere, gibt es kein Problem, aber wenn ich das Modul neu installiere, kann es nicht installiert werden, da auf der Seite $ view_mode in der aktiven Konfiguration vorhanden ist. Wenn dies ein Fehler ist, sollte ich ihn dann als Problem der Konfigurationskomponente veröffentlichen? oder gibt es eine Möglichkeit, dieses Problem zu lösen?
user2750995
6

Um einen Ansichtsmodus in Drupal 8 (dh einen benutzerdefinierten Modus) zu erstellen manage display, kann dies jetzt über die Benutzeroberfläche erfolgen:

admin/structure/display-modes/view

Oder wenn Sie programmatisch mögen einen bieten View - Modus mit Ihrem Modul folgendermaßen vor:

  1. Erstellen Sie ein benutzerdefiniertes Modul
  2. Erstellen Sie ein config/installVerzeichnis in Ihrem Modul
  3. config/installErstellen Sie innerhalb von eine Datei mit dem Namencore.entity_view_mode.node.my_module.yml

Dann innerhalb von core.entity_view_mode.node.my_module.ymlhinzufügen:

langcode: en
status: true
dependencies:
  module:
    - node
    - my_module
id: node.my_module
label: 'My Module'
targetEntityType: node
cache: true

Installieren Sie dann Ihr Modul (Sie müssen Ihr Modul deinstallieren und erneut installieren, wenn es bereits installiert ist). Sie haben jetzt einen benutzerdefinierten Ansichtsmodus, der für alle Ihre Inhaltstypen aktiviert werden kann.

Um andere Entitätstypen (z. B. Kommentar, Benutzer) zu unterstützen, erstellen Sie einfach eine neue .ymlDatei und ersetzen Sie Vorkommen von nodedurch Ihren gewünschten Entitätstyp.

tyler.frankenstein
quelle
0
$entity_type="node"; //The entity for which you want to create the view mode
$view_mode="example"; //The name of the new view mode
$settings=Array();
$settings["id"]=$entity_type.".".$view_mode;
$settings["targetEntityType"]=$entity_type;
$evm=Drupal\Core\Entity\Entity\EntityViewMode::create($settings);
$evm->save();
rgpublic
quelle