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 .
Ich fühle mich so nah, aber gleichzeitig so verloren.
Was fehlt mir, um dieses Feld aktiv zu machen?
Antworten:
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 desbundle: 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
drush
Befehle, z. B.drush dre module_name
um dies in Terminal / Konsole zu tun (Sie müssen das zu verwendende Devel- Modul installiert habendrush 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.sql
wenn 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
*.install
Datei des Moduls aufgenommen hat , diehook_install()
oder aufrufthook_update_N()
. Möglicherweise veraltete Funktionen, aber ich denke, Sie werden auf die Idee kommen.quelle
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.
quelle
Es hat funktioniert, indem eine
core.entity_form_display.node.<modulename>.default.yml
Datei mit folgendem Inhalt verwendet wurde:quelle
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 angebenconfig/install
). Übrigens können Sie diese Dateien entweder in diesem oder einem anderen Modul speichern. Wenn dieseconfig/optional
Option aktiviert ist, durchsucht Drupal alle Verzeichnisse nach allen Modulen, um relevante Konfigurationen abzurufen. https://www.drupal.org/node/2453919Die 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.
quelle