Jak uzyskać listę typów pól?

10

Przenoszę moduł z Drupal 7 na Drupal 8. W ustawieniach konfiguracyjnych tego modułu muszę uzyskać listę aktualnie istniejących typów pól.

W Drupal 7 zostało to osiągnięte za pomocą field_info_field_types()funkcji.

W Drupal 8 (8.0.0-rc3) pojawia się błąd „funkcja nie istnieje”, pomimo informacji podanych na stronie pomocy interfejsu API Drupal , wyraźnie nieaktualne.

Następnie sprawdzając, znalazłem stronę DrupalContrib , na której funkcja jest uznana za przestarzałą, i proponuje teraz jej użycie Drupal::service('plugin.manager.entity.field.field_type')->getDefinitions().

Ale użycie go powoduje kolejny błąd „Nieznana usługa plugin.manager.entity.field.field_type”, na szczęście powiązany z sugestią „Czy masz na myśli typ plugin.manager.field.field_field?”

Więc spróbowałem użyć Drupal::service('plugin.manager.field.field_type')->getDefinitions()i wow: Mam oczekiwaną tablicę typów pól.

Ale każdy element tablicy (jeden typ pola) jest teraz obiektem (zamiast tablicy potomnej), a dane, których szukam, są zagnieżdżone w chronionych właściwościach, więc nie mam do nich dostępu.

Na tym etapie utknąłem. Pomyślałem, że może istnieć jakaś klasa, którą mógłbym rozwinąć, aby poruszać się po tych danych, ale bez powodzenia: w szczególności nie mogłem nawet stwierdzić, który jest komponentem w Drupal 8, w którym definicje typów pól są scentralizowane.

cFreed
źródło
Lepiej spójrz na api.drupal.org, który jest bardziej aktualizowany. W rzeczywistości nie ma strony dla tej funkcji .
kiamlaluno
Dzięki za wskazówkę „spójrz na api.drupal.org”. Z drugiej strony (i jest to raczej meta istotne, przepraszam), jeśli łatwo rozumiem, że edytowałeś moje skróty (D7 -> Drupal 7), zastanawiam się, dlaczego umieściłeś w tytule „Drupal 8”? Wydaje mi się, że istnieje jakaś reguła mówiąca, że ​​jest redundantna z tagiem „8”. Ale jako czytelnik używam do znalezienia mnie o wiele bardziej pewnie poinformowanego przez tytuł niż tag: na moich oczach tagi zasadniczo dotyczą procesu wyszukiwania, a podczas sekwencyjnego czytania rzadko zwracam na nie uwagę.
cFreed
W tytule nie ma potrzeby powtarzania tagów, ponieważ są one zawsze widoczne wszędzie tam, gdzie pojawia się pytanie. Użytkownicy stosu Exchange zwracają uwagę na tagi.
kiamlaluno

Odpowiedzi:

16

Pierwszy poziom to tablica. Klucze to identyfikatory wtyczek. Możesz je wymienić:

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

Oto wynik:

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

Możesz wybrać jeden i zrzucić definicję wtyczki.

var_dump($defs['comment']);

Jeśli interesuje Cię specjalny obiekt, możesz kopać głębiej za pomocą api.drupal.org. Ale będzie łatwiej, jeśli poszukasz wtyczki w głównym katalogu.

Aby uzyskać dostęp do obiektu, zlokalizuj go w var_dump i użyj metody:

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

W tym przypadku jest to obiekt TranslatableMarkup , który ma metodę renderowania w celu uzyskania dostępu do przetłumaczonego ciągu.

4k4
źródło
Dzięki, ale to już zrobiłem. Poza tym mój problem pozostaje: w jaki sposób mogę programowo uzyskać dostęp do danych w tych obiektach?
cFreed
Co chcesz znaleźć w definicjach pól? Ogólnie rzecz biorąc, przeglądasz właściwości i metody obiektu w interfejsie API, a następnie uzyskujesz do nich dostęp za pomocą `-> '. Definicje pól są łatwiejsze do wyszukiwania w źródle.
4k4
Wyodrębnić label, descriptiona modulei wyświetlać je w postaci konfiguracji, gdzie użytkownik może sprawdzić te, dla których chce moje moduł ( MMS ) Tworzy sklonowanych tokenów dla dziedzin pokrewnych.
cFreed
Dodaję przykład.
4k4
Ups! Widziałem twój ostatni komentarz, ale nie zauważyłem twojej edycji, więc czekałem. Spróbuję twojej sugestii. Dzięki.
cFreed
4

Każdy ciąg znaków przekazywany przez t () jest teraz obiektem. Możesz uzyskać do nich dostęp jako ciągi, w rzeczywistości powinieneś to zrobić.

Jest tylko kilka wyjątków, w których nie można po prostu użyć takiego obiektu w stanie, w jakim się znajduje, na przykład klucze tablicy, w przypadku których należy rzutować je na ciąg znaków. Wszystko inne powinno po prostu działać.

PS: Oficjalna dokumentacja API to http://api.drupal.org/api/drupal/8 . Użyj tego do rdzenia.

Innym dobrym zasobem są rekordy zmian: https://www.drupal.org/list-changes/published?ke words_description=field_info_field_types&to_branch=&version=&created_op=%3E%3D&created%5Bvalue%5D=&created%5Bmin%5D=&created%5Max 5D =

Edycja: Odpowiadając na Twój komentarz, nie do końca rozumiem, co masz na myśli. Wszystkie potrzebne informacje są właśnie tam, wystarczy ich użyć.

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

Ponownie zignoruj ​​to, że etykieta / opis są obiektami. Mają metody __toString (), które są automatycznie wywoływane podczas ich drukowania / używania.

Berdir
źródło
Dziękuję za tę odpowiedź. Twój ostatni proponowany link wygląda bardzo obiecująco i zbadam go na podstawie tych informacji. Krótko powiedział mylę, jeśli myślę, że dla moich potrzeb (wyciąg label, description, modulestruny każdego pola typu) powinny I: 1) w celu uzyskania listy z Drupal::service('plugin.manager.field.field_type')->getDefinitions()jak już zrobione; 2) następnie użyj każdego klucza zwróconej tablicy (nazwa typu pola) do wywołania określonej klasy (znajdź, która i gdzie jest to, co muszę zbadać głębiej), która zapewni metody uzyskania potrzebnych informacji? TIA za tę precyzję.
cFreed
Zaktualizowałem moją odpowiedź.
Berdir
Ups ... nie rozumiem! To, co zaproponowałeś w swojej edycji, jest po prostu tym, co zrobiłem w D7. I to NIE działa w D8, ponieważ $definitionnie jest tablicą ciągów w D8, ale tablicą obiektów! Kiedyś DPM (), aby je zbadać i zobaczył, że każdy z potrzebnych strun pojawia zagnieżdżone w ten sposób: 'label' => array(..., 'label' => Drupal\Core\StringTranslation\TranslatableMarkup Object {..., string, ...}, ...). Czy brakuje mi czegoś oczywistego?
cFreed
Właśnie odkryłem (ostatnio) ostatnią edycję 4k4, która działa. W rzeczywistości dla mnie problemem było wiedzieć, gdzie znaleźć TranslatableMarkupklasę i dostępność render()metody. Wreszcie właściwy sposób na uzyskanie moich danych to print $definition['label']->render();. Niemniej jednak dziękuję za inne informacje.
cFreed
Nie, znowu nie potrzebujesz -> render (). użyj $ definition ['label'], to po prostu działa, zaufaj mi :)
Berdir
1

Zaktualizowana wersja odpowiedzi @Berdir. Użyj w skorupce.

$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;
}

Wyjście tutaj: https://gist.github.com/sobi3ch/70635cc62defff606242

sobi3ch
źródło
1

Wydaje się, że Google szuka tego pytania podczas ich wyszukiwania

Jeśli korzystasz z Drupal Console, możesz także użyć:

drupal plugin:debug field.field_type

Jest to również na Drupal.org, które może również pomóc:

Definiowanie i używanie definicji pól encji treści

Jednak nie jest łatwo znaleźć przykłady użyteczne

carl-16hands
źródło