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.
Antworten:
Die erste Ebene ist ein Array. Die Schlüssel sind die Plugin-IDs. Sie können sie auflisten:
Das ist das Ergebnis:
Sie können eine auswählen und die Plugin-Definition sichern.
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:
In diesem Fall ist es das Objekt TranslatableMarkup , das über die Methode render verfügt, um auf die übersetzte Zeichenfolge zuzugreifen.
quelle
label
,description
undmodule
und 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.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.
Ignorieren Sie einfach, dass Beschriftung / Beschreibung Objekte sind. Sie verfügen über __toString () -Methoden, die beim Drucken / Verwenden automatisch aufgerufen werden.
quelle
label
,description
,module
strings 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.$definition
nicht 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?TranslatableMarkup
Klasse zu finden ist und wie dierender()
Methode verfügbar ist . Schließlich ist der richtige Weg, um meine Daten zu erhaltenprint $definition['label']->render();
. Trotzdem vielen Dank für Ihre weiteren Informationen.Aktualisierte Version für @Berdir Antwort. Verwendung in der Schale.
Ausgabe hier: https://gist.github.com/sobi3ch/70635cc62defff606242
quelle
Google scheint diese Frage bei der Suche nach diesen zu finden
Wenn Sie Drupal Console verwenden, können Sie auch Folgendes verwenden:
Es gibt auch dies auf Drupal.org, das auch helfen kann:
Definieren und Verwenden von Definitionen von Inhaltsentitätsfeldern
Es ist jedoch nicht einfach, brauchbare Beispiele zu finden
quelle