it-swarm.com.de

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

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

Ich folge der Dokumentation, in der versucht wird, einem Knoten ein neues Feld hinzuzufügen, z. B. "Preis". 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 angezeigt werden (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.

Im Anschluss an Kommentar Ich habe die folgenden 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 Disabled .

(enter image description here

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

Was fehlt mir, um dieses Feld zu aktivieren?

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 eine Schaltfläche 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, fügen Sie einige Felder hinzu, indem Sie durch das Back-End klicken, exportieren ihre Konfiguration, Push das auf ein Git-Repo, und dann auf Ihrer Live-Seite, ziehen Sie aus Ihrem Repository, importieren die Konfigurationsdateien und erhalten Sie die gleichen Felder dort ohne dass Sie erneut auf etwas klicken müssen.


Das Hinzufügen von Feldern aus einem benutzerdefinierten Modul kann erreicht werden, indem bestimmte YML in Ihrem Modulordner /config/install Bereitgestellt werden. 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 drush Befehle, zum Beispiel drush dre module_name, Um dies in Terminal/Console zu tun (Sie müssen das Modul Devel installiert haben, um drush dre Verwenden zu können. ). 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, die Sie mit drush sql-cli < database.sql Neu importieren können, 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 eingefügt hat, die hook_install() oder hook_update_N() aufruft. 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();
7
leymannx

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 Admin-Benutzeroberfläche oder mit Drush in der Befehlszeile) verwenden, um Konfigurations-YMLs zu generieren, die alle erforderlichen Daten enthalten.

4
marcvangend

Habe es mit einem core.entity_form_display.node.<modulename>.default.yml Datei mit folgendem Inhalt:

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
2
user2594712

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 enthält sowohl Inhaltstyp als auch Felder. In diesem Fall können Sie nur in config/install). Übrigens können Sie diese Dateien entweder in diesem oder einem anderen Modul speichern. Wenn diese Option aktiviert ist, durchsucht Drupal alle config/optional - Verzeichnisse nach allen Modulen, um relevante Konfigurationen zu übernehmen. 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 von hook_install() enthalten, wobei 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.

1
Alex Skrypnyk