Wie füge ich benutzerdefinierte Felder und Anzeigeeinstellungen zu integrierten Inhaltstypen über die Installation eines benutzerdefinierten Moduls hinzu?

7

Ich bin ziemlich neu in Drupal, komme aus der Wordpress-Entwicklung und versuche, einige meiner Plugins in Module in Drupal 8 zu "übersetzen".

Ich folge der Dokumentation und versuche, ein neues Feld hinzuzufügen, z. B. "Preis" zu einem Knoten. Die gesamte Dokumentation, die ich gefunden habe, bezieht sich auf das Hinzufügen eines Felds zu einem benutzerdefinierten Knoten. In meinem Fall möchte ich diese Felder jedoch normalen vordefinierten Knoten hinzufügen.

Die erste Frage, die mir in den Sinn kommt, ist, ob ich das benutzerdefinierte Feld mit YML-Konfigurationsdateien oder Code erstellen kann, oder?

Ich habe das Feld mit YML erstellt und es wird von Drupal erkannt. Das Problem ist, dass sie nicht auf den Knoten erscheinen (ich muss sie manuell aktivieren).

Ich habe auf meinem Modul / config / install / erstellt:

  • core.entity_form_display.node.article.default
  • core.entity_view_display.node.article.default

Ich füge mein Feld hinzu, aber wenn ich versuche, das Modul zu aktivieren, gefällt es mir natürlich nicht, da sie bereits von Drupal definiert wurden.

Gibt es eine Möglichkeit, diese Kerndateien zu "erweitern"? ist das mit YML oder Code möglich?

Ich folgte https://www.drupal.org/docs/8/api/entity-api/programming-custom-fields-into-your-content-type . Ich habe die YML-Dateien unter / config / install erstellt, und tatsächlich wird das Feld erstellt. Das Problem ist, dass ich nicht weiß, wie Ansichts- und Formularanzeigeentitäten "erweitert" werden sollen, da sie nicht mit einem benutzerdefinierten Knotentyp verknüpft sind, da dies sonst der Fall sein sollte mit vorgefertigten Knotentypen verknüpft sein und ich kann diese Dateien nicht neu definieren (core.entity_form_display.node.article.default core.entity_view_display.node.article.default), da sie bereits auf dem Core vorhanden sind.

Nach diesem Kommentar habe ich folgende Dateien erstellt:

/config/install/field.field.node.article.field_price.yml

langcode: en
status: true
dependencies:
  config:
    - field.storage.node.field_price
    - node.type.article
id: node.article.field_price
field_name: field_price
entity_type: node
bundle: article
label: Price
description: 'Premium Price'
required: false
translatable: false
default_value: {  }
default_value_callback: ''
settings:
  min: 1
  max: 9999
  prefix: ''
  suffix: ''
field_type: integer

/config/install/field.storage.node.field_price.yml

langcode: en
status: true
dependencies:
  module:
    - node
id: node.field_price
field_name: field_price
entity_type: node
type: integer
settings:
  unsigned: false
  size: normal
module: core
locked: false
cardinality: 1
translatable: true
indexes: {  }
persist_with_no_fields: false
custom_storage: false

Außerdem habe ich FieldFormatter und FieldWidget erstellt. (Ich bin nicht sicher, ob richtig.)

Was ich herausgefunden habe ist, dass das Modul das Feld Preis erstellt. Wenn ich zu / admin / structure / types / manage / article / display gehe, sehe ich dort meinen Preis, aber er ist unter Deaktiviert .

Geben Sie hier die Bildbeschreibung ein

Ich fühle mich so nah, aber gleichzeitig so verloren.

Was fehlt mir, um dieses Feld aktiv zu machen?

Manuel Rodriguez
quelle
Würde hook_entity_type_alter tun, was Sie brauchen? Wie der Name schon sagt, können Sie mit diesem Hook die Definition eines vorhandenen Entitätstyps ändern.
Kevin Nowaczyk
1
Wenn Sie selbst eine Lösung gefunden haben, fügen Sie diese bitte in eine Antwort ein und markieren Sie sie als akzeptiert. Dies wird auch anderen helfen, die Lösung zu finden und zu sehen, dass diese Frage ausreichend gelöst wurde. Bitte nehmen Sie die Antwort nicht in die Frage auf.
Leymannx
Es funktioniert mit einer Datei core.entity_form_display.node. <Modulenname> .default.yml mit folgendem Inhalt:
user2594712

Antworten:

7

Für Anfänger würde ich empfehlen, die praktische Benutzeroberfläche von Drupal im Backend zu verwenden . Erstellen Sie einen Administratorbenutzer, melden Sie sich an, fügen Sie Felder hinzu, ändern Sie die Anzeige, ordnen Sie sie neu an - alles durch Klicken auf die Benutzeroberfläche.

Beispielsweise können Sie dem vorhandenen Artikelinhaltstyp unter https://example.com/admin/structure/types/manage/article/fields benutzerdefinierte Felder hinzufügen . Es gibt einen Knopf Add fields. Klicken Sie darauf und erkunden Sie . Es gibt keinen Unterschied beim Hinzufügen von Feldern zu einem integrierten Inhaltstyp.

Wie bereits erwähnt, dient YML beim Exportieren und Importieren von Konfigurationen beim Bereitstellen einer Site. Wie Sie es als fortgeschrittener Entwickler tun würden: Sie würden diese Seite lokal auf Ihrem Computer haben, einige Felder hinzufügen, indem Sie durch das Back-End klicken, ihre Konfiguration exportieren , diese in ein Git-Repo verschieben und dann auf Ihrer Live-Seite ziehen Importieren Sie aus Ihrem Repository die Konfigurationsdateien und rufen Sie dort dieselben Felder ab, ohne erneut auf etwas klicken zu müssen.


Das Hinzufügen von Feldern aus einem benutzerdefinierten Modul kann erreicht werden, indem bestimmte YML in Ihrem Modulordner bereitgestellt werden /config/install. Es gibt auch keinen Unterschied zwischen integrierten Inhaltstypen oder benutzerdefinierten Inhaltstypen. Es wird auf DO unter https://www.drupal.org/docs/8/api/entity-api/programming-custom-fields-into-your-content-type ziemlich gut beschrieben . Abgesehen davon, dass Sie die Benennung und insbesondere den Wert des bundle: car_brand(Inhaltstyps) ändern müssten, zu dem Ihre Felder hinzugefügt werden sollen.

Abgesehen davon müssen Sie dieses Modul möglicherweise während der Entwicklung häufig installieren und deinstallieren. Gewöhnen Sie sich an drushBefehle, z. B. drush dre module_nameum dies in Terminal / Konsole zu tun (Sie müssen das zu verwendende Devel- Modul installiert haben drush dre). Zu Ihrem eigenen Besten hoffe ich, dass Sie bereits mit einem UNIX-basierten Betriebssystem (Linux oder OSX) arbeiten. Möglicherweise steht Ihnen immer eine neue Datenbanksicherung zur Verfügung, mit der Sie erneut importieren können, drush sql-cli < database.sqlwenn Sie während der Entwicklung neu beginnen möchten.


Nur als Referenz füge ich den gelöschten Antwortcode hier ein, den OP ursprünglich in seine Frage gestellt hatte. Um die Felder im Inhaltstyp OP endlich verfügbar zu machen, wurde dies erfunden. Ich vermute sehr, dass er dies in die *.installDatei des Moduls aufgenommen hat , die hook_install()oder aufruft hook_update_N(). Möglicherweise veraltete Funktionen, aber ich denke, Sie werden auf die Idee kommen.

$entity_type         = 'node';
$bundle              = 'article';
$field['field_name'] = 'field_price'; // your field id

entity_get_form_display($entity_type, $bundle, 'default')
  ->setComponent($field['field_name'], array())
  ->save();

entity_get_display($entity_type, $bundle, 'default')
  ->setComponent($field['field_name'], array())
  ->save();
Leymannx
quelle
1
danke leymannx, aber was ich suche ist, das ohne interaktion durchzuführen, nur mein modul zu installieren, also suche ich tatsächlich eine programmgesteuerte möglichkeit, dies auf meinem modul zu tun. Gibt es einen Weg?
Manuel Rodriguez
@ ManuelRodriguez Natürlich gibt es! Ich werde meine Antwort erweitern.
Leymannx
Vielen Dank @leymannx, das ist die Dokumentation, der ich gefolgt bin. Ich habe die YML-Dateien unter / config / install erstellt, und tatsächlich wird das Feld erstellt. Das Problem ist, dass ich nicht weiß, wie ich Ansichts- und Formularanzeigeentitäten "erweitern" kann, da sie nicht mit einem benutzerdefinierten Knotentyp verknüpft sind (ich kann erstellen Andernfalls sollten sie mit vorgefertigten Knotentypen verknüpft sein, und ich kann diese Dateien nicht neu definieren (core.entity_form_display.node.article.default core.entity_view_display.node.article.default), da sie bereits auf dem Core vorhanden sind. Übrigens, danke für den Drush-Tipp :)
Manuel Rodriguez
@ ManuelRodriguez Danke für deinen Kommentar. Das macht die Frage viel klarer. Vielleicht können Sie diesen letzten Kommentar in Ihre Frage aufnehmen.
Leymannx
2
Um drush dre zu verwenden, müssen Sie das Devel-Modul drupal.org/project/devel
Adrian Cid Almaguer
4

Die Konfigurations-YML-Dateien von Drupal sind in erster Linie für den Import / Export gedacht, um die Konfiguration zwischen Instanzen derselben Site portierbar zu machen und die Versionskontrolle zu ermöglichen. Sie sind nicht wirklich als Entwicklungswerkzeug gedacht und ich würde niemals empfehlen, sie von Hand zu schreiben, auch nicht, wenn Sie ein erfahrener Drupal-Entwickler sind.

Unabhängig davon, wie ein Knotentyp definiert wurde, sollten Sie in der Lage sein, Felder über die Administrator-Benutzeroberfläche hinzuzufügen. Ich empfehle, dass Sie dies auf diese Weise tun und das Konfigurations-Exportsystem (entweder in der Administrator-Benutzeroberfläche oder mithilfe von Drush in der Befehlszeile) verwenden, um Konfigurations-YMLs zu generieren, die alle erforderlichen Daten enthalten.

Marcvangend
quelle
1
Vielen Dank für die Antwort, aber in diesem Fall möchte ich, dass mein Modul bei der Installation die Felder in den Knoten erstellen kann. Ich möchte nicht, dass der Benutzer das Feld erstellt oder das Feld selbst verwaltet. Ist das möglich?
Manuel Rodriguez
Ah ich sehe. In diesem Fall ist YML meiner Meinung nach nicht ausreichend, da Sie eine Logik benötigen, um zu überprüfen, ob der Knotentyp vorhanden ist, und das Feld nicht. Sie müssen wahrscheinlich hook_install in Ihrem Modul implementieren und das Feld programmgesteuert zum Knoten hinzufügen. Hier ist ein Beitrag, der beschreibt, wie das geht, aber ich füge ihn meiner Antwort nicht hinzu, weil ich nicht getestet habe, ob er wirklich funktioniert.
Marcvangend
3
Die Felder in der exportierten Konfiguration zu haben ist in Ordnung, daran ist meiner Meinung nach nichts auszusetzen. Sie haben explizite Abhängigkeiten und ermöglichen keine Installation, wenn dieser Knotentyp nicht vorhanden ist. Sie benötigen jedoch auch Informationen zur Formular- / Ansichtsanzeige, die pro Knotentyp und Ansichts- / Formularmodus gespeichert werden. Sie können sie also nicht nur als Konfiguration bereitstellen, sondern müssen sie mit hook_install () als Code hinzufügen. Siehe zum Beispiel drupal.stackexchange.com/questions/222260/… .
Berdir
2

Es hat funktioniert, indem eine core.entity_form_display.node.<modulename>.default.ymlDatei mit folgendem Inhalt verwendet wurde:

langcode: en
status: true
dependencies:
config:
  - field.field.node.modulename.body
  - node.type.modulename
module:
  - link
id: node.modulename.default
targetEntityType: node
bundle: modulename
mode: default
content:
  body:
    label: hidden
    type: string_textarea
    weight: 4
    settings:
      rows: 5
      placeholder: ''
    third_party_settings: {  }
    region: content
hidden:
  created: true
  path: true
  promote: true
  sticky: true
  uid: true
  body: true
user2594712
quelle
1

Was @leymannx Antwort fehlt, ist eine Erklärung, was mit einem benutzerdefinierten Modul geliefert werden kann (und sollte) und was nicht.

Die Feldlagerung kann und sollte mit Ihrem Modul geliefert werden.

Die Feldinstanz wird möglicherweise mit Ihrem Modul geliefert, jedoch nur als optional, da dies von anderen Modulen abhängt, die Inhaltstypen bereitstellen (es sei denn, Ihr Modul bietet sowohl Inhaltstyp als auch Felder, in denen Sie möglicherweise nur angeben config/install). Übrigens können Sie diese Dateien entweder in diesem oder einem anderen Modul speichern. Wenn diese config/optionalOption aktiviert ist, durchsucht Drupal alle Verzeichnisse nach allen Modulen, um relevante Konfigurationen abzurufen. https://www.drupal.org/node/2453919

Die Anzeige von Entitätsformularen kann nicht mit Ihrem Modul geliefert werden. Wenn Ihr Modul nur ein Feld bereitstellt, überschreibt die Anzeige des Versandentitätsformulars für die gesamte Entität die vorhandene Konfiguration. Stattdessen muss Ihr Modul die Implementierung enthalten, hook_install()wo Felder für die Formularanzeige für alle unterstützten Inhaltstypen geändert werden.

Die Anzeige der Entitätsansicht sollte genauso behandelt werden wie die Anzeige der Entitätsform.

Alex Skrypnyk
quelle