Bagaimana cara mendapatkan daftar tipe bidang?


10

Saya memindahkan modul dari Drupal 7 ke Drupal 8. Dalam pengaturan konfigurasi modul ini saya perlu mendapatkan daftar tipe-bidang yang saat ini ada.

Dalam Drupal 7, ini dicapai menggunakan field_info_field_types()fungsi.

Dalam Drupal 8 (8.0.0-rc3), saya mendapatkan kesalahan "fungsi tidak ada", meskipun informasi yang dinyatakan oleh halaman Bantuan Referensi API Drupal , jelas ketinggalan zaman.

Kemudian menyelidiki saya menemukan halaman DrupalContrib , di mana fungsinya dinyatakan usang, dan mengusulkan untuk sekarang menggunakan Drupal::service('plugin.manager.entity.field.field_type')->getDefinitions().

Tetapi menggunakannya memicu kesalahan lain "Layanan tidak dikenal plugin.manager.entity.field.field_type", untungnya terkait dengan saran "Apakah maksud Anda plugin.manager.field.field_type?"

Jadi saya mencoba menggunakan Drupal::service('plugin.manager.field.field_type')->getDefinitions()dan wow: Saya mendapatkan array tipe field yang diharapkan.

Tetapi setiap anggota array (satu tipe lapangan) sekarang menjadi objek (bukan array anak), dan data yang saya cari bersarang di dalam properti yang dilindungi, jadi saya tidak dapat mengaksesnya.

Pada tahap ini, saya mandek. Saya menganggap mungkin ada beberapa kelas yang bisa saya kembangkan untuk bernavigasi melalui data ini, tetapi tanpa hasil: Saya bahkan tidak dapat menemukan komponen dalam Drupal 8 di mana definisi tipe bidang terpusat.


Lebih baik Anda melihat api.drupal.org, yang lebih banyak pembaruan. Faktanya, tidak ada halaman untuk fungsi itu .
kiamlaluno

Terima kasih atas tipnya "lihat api.drupal.org". Di sisi lain (dan ini agak meta relevan, maaf), jika saya dengan mudah memahami Anda mengedit singkatan saya (D7 -> Drupal 7), saya bertanya-tanya mengapa Anda menjatuhkan "Drupal 8" pada judul? Saya cenderung berpikir bahwa akan ada beberapa aturan yang mengatakan bahwa itu adalah cetakan ulang dengan tag "8". Tetapi sebagai seorang pembaca saya menggunakan untuk menemukan saya jauh lebih pasti diinformasikan oleh judul daripada tag: di mata saya, tag pada dasarnya alamat proses pencarian, sementara membaca berurutan saya jarang memperhatikan mereka.
cFreed

Tidak perlu mengulang tag dalam judul, karena selalu terlihat di mana pun pertanyaan dicantumkan. Pengguna Stack Exchange memperhatikan tag.
kiamlaluno

Jawaban:


16

Level pertama adalah array. Kuncinya adalah id plugin. Anda dapat mencantumkannya:

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

Ini hasilnya:

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

Anda dapat memilih satu dan membuang definisi plugin.

var_dump($defs['comment']);

Jika Anda tertarik pada objek khusus, Anda dapat menggali lebih dalam dengan bantuan api.drupal.org. Tetapi akan lebih mudah, jika Anda mencari plugin di direktori inti.

Untuk mengakses objek, temukan di var_dump dan gunakan metode:

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

Dalam hal ini, itu adalah objek TransknownMarkup , yang memiliki metode render untuk mengakses string yang diterjemahkan.


Terima kasih tapi ini sudah saya lakukan. Di luar itu, masalah saya tetap: bagaimana saya bisa secara sistematis mengakses data di dalam objek-objek ini?
cFreed

Apa yang ingin Anda temukan di definisi bidang? Secara umum Anda mencari properti dan metode objek dalam api dan kemudian Anda mengaksesnya dengan `-> '. Definisi bidang lebih mudah dicari di sumber.
4k4

Saya mengekstrak label, descriptiondan moduledan menampilkannya dalam bentuk konfigurasi di mana pengguna dapat memeriksa yang diinginkannya modul saya ( MMS ) membuat token kloning untuk bidang terkait.
cFreed

Saya menambahkan contoh.
4k4

Ups! Saya melihat komentar terakhir Anda, tetapi tidak melihat hasil edit Anda, jadi saya terus menunggu. Saya akan mencoba saran Anda. Terima kasih.
cFreed

4

Setiap string yang melewati t () adalah objek sekarang. Anda dapat mengaksesnya sebagai string, sebenarnya, Anda harus melakukannya.

Hanya ada sangat sedikit pengecualian di mana Anda tidak bisa hanya menggunakan objek apa adanya, misalnya kunci array, bagi mereka, Anda perlu melemparkannya ke string. Yang lainnya harusnya bekerja.

PS: Dokumentasi API resmi adalah http://api.drupal.org/api/drupal/8 . Gunakan itu untuk inti.

Sumber lain yang bagus adalah catatan perubahan: https://www.drupal.org/list-changes/published?keywords_description=field_info_field_types&to_branch=&version=&created_op=%3E%3D&created%5Bvalue%5D=&created%5B5%%5==created 5D =

Sunting: Menanggapi komentar Anda, saya tidak begitu mengerti apa yang Anda maksud. Semua informasi yang Anda butuhkan ada di sana, gunakan saja.

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

Sekali lagi, abaikan saja bahwa label / deskripsi adalah objek. Mereka memiliki metode __toString () yang secara otomatis dipanggil ketika Anda mencetak / menggunakannya.


Terima kasih atas jawaban ini. Tautan terakhir yang Anda usulkan terlihat sangat menjanjikan dan saya akan selidiki berdasarkan informasi ini. Secara singkat kata, saya salah jika saya kira itu untuk kebutuhan saya (ekstrak label, description, modulestring dari masing-masing bidang-jenis) saya harus: 1) mendapatkan daftar dari Drupal::service('plugin.manager.field.field_type')->getDefinitions()seperti yang sudah dilakukan; 2) kemudian gunakan setiap kunci array yang dikembalikan (nama tipe lapangan) untuk memanggil kelas tertentu (temukan yang mana, dan di mana, apa yang harus saya periksa lebih dalam) yang akan memberikan metode untuk mendapatkan info yang dibutuhkan? TIA untuk ketepatan ini.
cFreed

Memperbarui jawaban saya.
Berdir

Ups ... tidak mengerti! Apa yang Anda usulkan dalam suntingan Anda hanyalah apa yang saya lakukan di D7. Dan itu TIDAK bekerja di D8, karena $definitionbukan array dari string di D8, tetapi sebuah array objek! Saya menggunakan dpm () untuk memeriksa mereka, dan melihat bahwa masing-masing string yang dibutuhkan muncul bersarang cara ini: 'label' => array(..., 'label' => Drupal\Core\StringTranslation\TranslatableMarkup Object {..., string, ...}, ...). Apakah saya kehilangan sesuatu yang jelas?
cFreed

Baru saja menemukan (belakangan) suntingan terakhir 4k4, yang berfungsi. Sebenarnya masalah bagi saya adalah untuk mengetahui di mana menemukan TranslatableMarkupkelas, dan ketersediaan render()metode. Akhirnya cara yang benar untuk mendapatkan data saya adalah print $definition['label']->render();. Namun demikian, terima kasih atas informasi Anda yang lain.
cFreed

Tidak, lagi, Anda tidak perlu -> render (). gunakan $ definition ['label'], itu hanya berfungsi, percayalah :)
Berdir

1

Versi terbaru untuk jawaban @Berdir. Gunakan di shell.

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

Keluaran di sini: https://gist.github.com/sobi3ch/70635cc62defff606242


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.