it-swarm.com.de

Abrufen von Felddefinitionen über Bundles hinweg, einschließlich Basisfeldern

In Drupal 8) gibt es zwei Arten von Feldern: "Basisfelder" wie node.uid und benutzerdefinierte Felder wie 'node.body'.

Alle Feldnamen für einen Entitätstyp können mit EntityFieldManagerInterface->getFieldMap() gefunden werden. Dies enthält jedoch nur den Feldtyp (als Zeichenfolge) und eine Liste von Bundles.

Für die Basisfelder wie 'uid' gibt es EntityFieldManagerInterface->getbaseFieldDefinitions($entity_type_id). Dadurch werden jedoch die benutzerdefinierten Felder weggelassen.

Für benutzerdefinierte Felder gibt es EntityTypeManagerInterface->getStorage('field_storage_config')->load($entity_type_id . $field_name);. Dies schließt jedoch keine Basisfelder wie 'node.uid' ein.

Es gibt auch EntityFieldManagerInterface->getFieldDefinitions($entity_type_id, $bundle_name). Dies muss aber pro Bundle aufgerufen werden.

FieldTypePluginmanager, EntityAdapter und EntityDataDefinition enthalten weitere Informationen. Je mehr ich aussehe, desto verwirrender und komplexer erscheint mir diese gesamte Architektur.

Hintergrund

Ich möchte ein Auswahlelement anzeigen, in dem ein Benutzer ein Feld auswählen kann. Der Entitätstyp ist angegeben, das Bundle jedoch nicht. Optionen werden nach verschiedenen Kriterien gefiltert. Z.B. Vielleicht möchte ich alle Felder anzeigen, in denen der Elementtyp EntityReferenceItem erweitert und der Referenzzieltyp 'Knoten' ist. Dazu muss ich die Definition jedes Feldes überprüfen.

All dies ist für die D8-Version von https://drupal.org/project/renderkit .

4
donquixote

Je mehr ich aussehe, desto verwirrender und komplexer erscheint mir diese gesamte Architektur.

Die Architektur ist eigentlich sehr ähnlich zu 7.x, nur umbenannt. 7.x hatte Felder und Feldinstanzen, 8.x hat Feldspeicher (= 7.x Felder) und Felder. Basisfelder werden standardmäßig als beide angezeigt, während konfigurierbare Felder jeweils einen eigenen Entitätstyp haben.

Feldspeicher existieren pro Entitätstyp und Felder pro Entitätstyp/Bundle. (In 7.x waren die Felder global, ansonsten ist es dasselbe).

Um alle Feldspeicher eines Entitätstyps abzurufen, können Sie\Drupal\Core\Entity\EntityFieldManager :: getFieldStorageDefinitions () verwenden. Beachten Sie, dass ein Feldspeicher keine Beschriftung hat, sondern nur das Feld (und die Beschriftung kann pro Bundle unterschiedlich sein). Sie müssen daher ohnehin alle Bundles berücksichtigen, wenn Sie nicht nur einen Computernamen anzeigen möchten. Token und Ansichten haben dafür Hilfsfunktionen, z. _token_field_label ().

Eine weitere nützliche Referenz ist, wie das Entitätsauswahl-Plugin die Liste der zu sortierenden Felder erstellt:\Drupal\Core\Entity\Plugin\EntityReferenceSelection\DefaultSelection :: buildConfigurationForm ()

4
Berdir