Wie bekomme ich die Liste der Feldtypen?


10

Ich portiere ein Modul von Drupal 7 nach Drupal 8. In den Konfigurationseinstellungen dieses Moduls muss die Liste der aktuell vorhandenen Feldtypen abgerufen werden.

In Drupal 7 wurde dies mit der field_info_field_types()Funktion erreicht.

In Drupal 8 (8.0.0-rc3) erhalte ich die Fehlermeldung "Funktion existiert nicht", obwohl die Informationen auf einer Drupal API-Referenzhilfeseite eindeutig veraltet sind.

Als ich dann nachforschte, fand ich eine DrupalContrib-Seite , auf der die Funktion für veraltet erklärt wurde, und schlug vor, sie jetzt zu verwenden Drupal::service('plugin.manager.entity.field.field_type')->getDefinitions().

Bei Verwendung wird jedoch ein weiterer Fehler "Unbekannter Dienst plugin.manager.entity.field.field_type" ausgelöst, der glücklicherweise mit dem Vorschlag "Meinen Sie plugin.manager.field.field_type?"

Also habe ich versucht Drupal::service('plugin.manager.field.field_type')->getDefinitions()und wow: Ich habe das erwartete Array von Feldtypen.

Aber jedes Array-Mitglied (ein Feldtyp) ist jetzt ein Objekt (anstelle eines untergeordneten Arrays), und die gesuchten Daten sind in geschützten Eigenschaften verschachtelt, sodass ich nicht darauf zugreifen kann.

In diesem Stadium stecke ich fest. Ich dachte, es könnte eine Klasse geben, die ich erweitern könnte, um durch diese Daten zu navigieren, aber ohne Glück: Ich konnte insbesondere nicht einmal herausfinden, welche Komponente in Drupal 8 die Definition von Feldtypen zentralisiert.


Es ist besser, wenn Sie sich api.drupal.org ansehen, das ist mehr Update. Tatsächlich gibt es für diese Funktion keine Seite .
Kiamlaluno

Vielen Dank für den Tipp "Schau auf api.drupal.org". Andererseits (und das ist ziemlich meta-relevant, sorry) frage ich mich, warum Sie "Drupal 8" in den Titel gestrichen haben, wenn ich leicht verstehe, dass Sie meine Abkürzungen bearbeitet haben (D7 -> Drupal 7)? Ich neige dazu zu denken, dass es eine Regel geben würde, die besagt, dass es mit dem "8" -Tag nicht übereinstimmt. Aber als Leser finde ich mich durch den Titel viel sicherer informiert als durch das Tag: In meinen Augen adressieren Tags im Wesentlichen den Suchprozess, während ich beim sequentiellen Lesen selten auf sie achte.
cFreed

Tags im Titel müssen nicht wiederholt werden, da diese immer dort sichtbar sind, wo eine Frage aufgeführt ist. Stack Exchange-Benutzer achten auf Tags.
Kiamlaluno

Antworten:


16

Die erste Ebene ist ein Array. Die Schlüssel sind die Plugin-IDs. Sie können sie auflisten:

$defs = Drupal::service('plugin.manager.field.field_type')->getDefinitions();
foreach ( $defs as $key => $value ) {
   echo $key, "\n";
}

Das ist das Ergebnis:

comment
datetime
file
image
link
list_string
list_float
list_integer
path
text_with_summary
text
text_long
email
boolean
created
changed
timestamp
string_long
language
decimal
uri
float
password
string
integer
entity_reference
uuid
map
taxonomy_term_reference

Sie können eine auswählen und die Plugin-Definition sichern.

var_dump($defs['comment']);

Wenn Sie an einem speziellen Objekt interessiert sind, können Sie mit Hilfe von api.drupal.org tiefer graben. Es wird jedoch einfacher, wenn Sie im Kernverzeichnis nach dem Plugin suchen.

Um auf ein Objekt zuzugreifen, suchen Sie es im var_dump und verwenden Sie eine Methode:

$defs['comment']['description']->render();

In diesem Fall ist es das Objekt TranslatableMarkup , das über die Methode render verfügt, um auf die übersetzte Zeichenfolge zuzugreifen.


Danke, aber das habe ich schon getan. Darüber hinaus bleibt mein Problem: Wie kann ich programmgesteuert auf die Daten in diesen Objekten zugreifen ?
cFreed

Was möchten Sie in den Felddefinitionen finden? Im Allgemeinen suchen Sie die Eigenschaften und Methoden eines Objekts in der API und greifen dann mit `-> 'darauf zu. Felddefinitionen lassen sich leichter in der Quelle nachschlagen.
4k4

Ich extrahieren label, descriptionund moduleund sie in einer Konfigurationsformular angezeigt werden, wo der Benutzer die , die überprüfen können , für die es mein Modul (will MMS ) erstellt Token für die entsprechenden Felder geklont.
cFreed

Ich füge ein Beispiel hinzu.
4k4

Hoppla! Ich habe Ihren letzten Kommentar gesehen, aber Ihre Bearbeitung nicht bemerkt, also habe ich weiter gewartet. Ich werde Ihren Vorschlag versuchen. Vielen Dank.
cFreed

4

Jede Zeichenfolge, die durch t () geleitet wird, ist jetzt ein Objekt. Sie können als Zeichenfolgen auf sie zugreifen. Dies sollten Sie auch tun.

Es gibt nur sehr wenige Ausnahmen, in denen Sie ein solches Objekt nicht einfach so verwenden können, wie es ist, z. B. Array-Schlüssel. Für diese müssen Sie sie in eine Zeichenfolge umwandeln. Alles andere sollte einfach funktionieren.

PS: Die offizielle API-Dokumentation lautet http://api.drupal.org/api/drupal/8 . Verwenden Sie das für den Kern.

Eine weitere gute Ressource sind Änderungsdatensätze: https://www.drupal.org/list-changes/published?keywords_description=field_info_field_types&to_branch=&version=&created_op=%3E%3D&created%5Bvalue%5D=&created%5Bmin%5D=&created% 5D =

Bearbeiten: Als Antwort auf Ihren Kommentar verstehe ich nicht ganz, was Sie meinen. Alle Informationen, die Sie benötigen, sind genau dort, verwenden Sie sie einfach.

$definitions = Drupal::service('plugin.manager.field.field_type')->getDefinitions();
foreach ( $definitions as $field_type => $definition) {
  print $definition['label'];
  print $definition['description'];
  print $definition['provider'];
}

Ignorieren Sie einfach, dass Beschriftung / Beschreibung Objekte sind. Sie verfügen über __toString () -Methoden, die beim Drucken / Verwenden automatisch aufgerufen werden.


Danke für diese Antwort. Ihr letzter vorgeschlagener Link sieht sehr vielversprechend aus und ich werde anhand dieser Informationen nachforschen. Kurz gesagt, bin ich falsch , wenn ich das für meine Bedürfnisse erraten (Extrakt label, description, modulestrings jedes Feldtyp) Ich sollte: 1) erhalten Liste aus , Drupal::service('plugin.manager.field.field_type')->getDefinitions()wie bereits geschehen; 2) Verwenden Sie dann jeden Schlüssel des zurückgegebenen Arrays (den Feldtypnamen) zum Aufrufen einer bestimmten Klasse (finden Sie heraus, welche und wo ich genauer untersuchen muss), die Methoden zum Abrufen der erforderlichen Informationen bereitstellt. TIA für diese Präzision.
cFreed

Meine Antwort wurde aktualisiert.
Berdir

Ups ... verstehe nicht! Was Sie in Ihrer Bearbeitung vorgeschlagen haben, ist lediglich das, was ich in D7 getan habe. Und es funktioniert NICHT in D8, da es sich in D8 $definitionnicht um ein Array von Strings handelt, sondern um ein Array von Objekten! Ich habe dpm () verwendet, um sie zu untersuchen, und festgestellt, dass jede der benötigten Zeichenfolgen folgendermaßen verschachtelt erscheint : 'label' => array(..., 'label' => Drupal\Core\StringTranslation\TranslatableMarkup Object {..., string, ...}, ...). Vermisse ich etwas Offensichtliches?
cFreed

Habe gerade (in letzter Zeit) die letzte Bearbeitung von 4k4 entdeckt, die funktioniert. Tatsächlich war es für mich das Problem zu wissen, wo die TranslatableMarkupKlasse zu finden ist und wie die render()Methode verfügbar ist . Schließlich ist der richtige Weg, um meine Daten zu erhalten print $definition['label']->render();. Trotzdem vielen Dank für Ihre weiteren Informationen.
cFreed

Nein, auch hier brauchen Sie nicht -> render (). benutze $ definition ['label'], es funktioniert einfach, vertrau mir :)
Berdir

1

Aktualisierte Version für @Berdir Antwort. Verwendung in der Schale.

$definitions = Drupal::service('plugin.manager.field.field_type')->getDefinitions();
foreach ( $definitions as $field_type => $definition) {
  print 'Label: '. $definition['label']. PHP_EOL;
  print 'Machine name: '. $field_type. PHP_EOL;
  print 'Descritpion: '. $definition['description']. PHP_EOL;
  print 'Provider: '. $definition['provider']. PHP_EOL . ' ---' . PHP_EOL;
}

Ausgabe hier: https://gist.github.com/sobi3ch/70635cc62defff606242


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.