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.
Odpowiedzi:
Pierwszy poziom to tablica. Klucze to identyfikatory wtyczek. Możesz je wymienić:
Oto wynik:
Możesz wybrać jeden i zrzucić definicję wtyczki.
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:
W tym przypadku jest to obiekt TranslatableMarkup , który ma metodę renderowania w celu uzyskania dostępu do przetłumaczonego ciągu.
źródło
label
,description
amodule
i 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.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ć.
Ponownie zignoruj to, że etykieta / opis są obiektami. Mają metody __toString (), które są automatycznie wywoływane podczas ich drukowania / używania.
źródło
label
,description
,module
struny każdego pola typu) powinny I: 1) w celu uzyskania listy zDrupal::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ę.$definition
nie 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?TranslatableMarkup
klasę i dostępnośćrender()
metody. Wreszcie właściwy sposób na uzyskanie moich danych toprint $definition['label']->render();
. Niemniej jednak dziękuję za inne informacje.Zaktualizowana wersja odpowiedzi @Berdir. Użyj w skorupce.
Wyjście tutaj: https://gist.github.com/sobi3ch/70635cc62defff606242
źródło
Wydaje się, że Google szuka tego pytania podczas ich wyszukiwania
Jeśli korzystasz z Drupal Console, możesz także użyć:
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
źródło