$account = \Drupal::currentUser()memuat objek pengguna ke $account, tetapi bagaimana cara mengakses bidang khusus yang saya buat pada objek pengguna (melalui UI admin)?
Dengan dpm($account)saya, saya tidak dapat melihat bidang khusus saya.
Apakah bidang khusus belum memiliki nilai? Tampak mengingat mereka hilang dari objek entitas sampai mereka benar-benar memiliki nilai yang ditetapkan
Clive
Ya, mereka memiliki nilai. Saya bisa mendapatkan uid dengan \Drupal::currentUser()->id()dan kemudian melakukan query database, tetapi di D7 mereka sudah ada di objek?
24ma13wg
Masalah ini bukan hanya tentang pengguna saat ini; ini umumnya berkaitan dengan objek pengguna. api.drupal.org/api/drupal/… membuat Anda setengah jalan di sana, tetapi seperti yang biasanya terjadi pada Drupal Docs, ia meninggalkan banyak hal dalam kegelapan
sea26.2
Jawaban:
29
\Drupal::currentUser()mengembalikan Drupal\Core\Session\AccountInterfaceobjek. Itu bisa menjadi pengguna penuh (yang akan menjadi Drupal\user\UserInterface), tetapi sekarang, untuk metode otentikasi default, itu tidak.
Gunakan ini untuk mendapatkan entitas pengguna dan semua bidang:
D7 memiliki perilaku yang persis sama, perbedaannya sekarang adalah hanya di D7, mereka stdClass'es hanya berbeda, sekarang Anda memiliki antarmuka eksplisit untuk membedakan keduanya.
Terlepas dari pemungutan suara, jawaban ini benar, bahkan tentang Drupal 7. $GLOBALS['user']tidak mengandung objek pengguna yang dimuat penuh, dalam Drupal 7; itu hanya berisi informasi yang ditemukan di tabel pengguna.
kiamlaluno
Ya, tidak yakin mengapa ini mendapat downvote. Benar, baik tentang D7 dan D8.
mpdonadio
Ini hanya sebagian dari jawabannya. Dan pada kenyataannya, itu membuat Anda tidak lebih dekat ke data daripada "solusi" aslinya. Anda harus "mendapatkan" data dari objek. Untuk melakukannya - lihat solusi yang diposting oleh @batigolix di bawah ini.
sea26.2
Perhatikan bahwa bidang yang tidak memiliki nilai tidak akan muncul di array nilai.
JAyenGreen
16
Dan inilah cara mengeluarkannya dari objek itu:
// Load the current user.
$user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id());// Get field data from that user.
$website = $user->get('field_website')->value;
$body = $user->get('body')->value;// Some default getters include.
$email = $user->get('mail')->value;
$name = $user->get('name')->value;
$uid= $user->get('uid')->value;
Selain itu, entitas Pengguna tidak memiliki bidang basis tubuh . Jika itu adalah bidang yang ditambahkan dari antarmuka pengguna, nama bidang akan dimulai dengan bidang_ . Saya akan menghindari contoh itu, karena membuat pengguna berpikir bahwa itu adalah bidang dasar yang ditambahkan dari kode inti Drupal.
Ini berarti tidak dijamin Anda mendapatkan Userobjek penuh dengan bidangnya dimuat, tetapi bahkan tidak dijamin Anda mendapatkan Userobjek. Sebagai konsekuensinya, Anda memanggil panggilan beberapa metode yang tersedia dari Userkelas, seperti User::get(). Anda dapat menelepon AccountInterface::id(), yang mengembalikan ID pengguna; dengan itu, Anda kemudian dapat memuat Userobjek lengkap dengan User::load()dan memiliki akses ke semua modul bidang yang dilampirkan ke entitas.
Mungkin, tetapi masih menimbulkan pertanyaan: "bagaimana Anda mengakses bidang CUSTOM". Lihat jawaban di atas dari @batigolix
sea26.2
Pertanyaannya lebih lanjut. Mengapa $account = \Drupal::currentUser(): dpm($account);tidak menampilkan bidang khusus? tetapi jawaban ini mengatakan bagaimana cara mengakses bidang entitas pengguna. Karena pertanyaan tidak menyebutkan bidang mana yang OP coba akses, jawabannya hanya mengatakan metode mana yang digunakan. Tidak ada jawaban dari @batigolix.
\Drupal::currentUser()->id()
dan kemudian melakukan query database, tetapi di D7 mereka sudah ada di objek?Jawaban:
\Drupal::currentUser()
mengembalikanDrupal\Core\Session\AccountInterface
objek. Itu bisa menjadi pengguna penuh (yang akan menjadiDrupal\user\UserInterface
), tetapi sekarang, untuk metode otentikasi default, itu tidak.Gunakan ini untuk mendapatkan entitas pengguna dan semua bidang:
D7 memiliki perilaku yang persis sama, perbedaannya sekarang adalah hanya di D7, mereka stdClass'es hanya berbeda, sekarang Anda memiliki antarmuka eksplisit untuk membedakan keduanya.
sumber
$GLOBALS['user']
tidak mengandung objek pengguna yang dimuat penuh, dalam Drupal 7; itu hanya berisi informasi yang ditemukan di tabel pengguna.Dan inilah cara mengeluarkannya dari objek itu:
sumber
$user->id()
.Drupal::currentUser()
mengembalikan objek yang diimplementasikanDrupal\Core\Session\AccountProxyInterface
. Itu berbeda dari apa yang kembali dariUser::load()
, yang merupakan objek pelaksanaDrupal\user\UserInterface
.Ini berarti tidak dijamin Anda mendapatkan
User
objek penuh dengan bidangnya dimuat, tetapi bahkan tidak dijamin Anda mendapatkanUser
objek. Sebagai konsekuensinya, Anda memanggil panggilan beberapa metode yang tersedia dariUser
kelas, sepertiUser::get()
. Anda dapat meneleponAccountInterface::id()
, yang mengembalikan ID pengguna; dengan itu, Anda kemudian dapat memuatUser
objek lengkap denganUser::load()
dan memiliki akses ke semua modul bidang yang dilampirkan ke entitas.Dengan
$account
, Anda dapat mengakses semua bidang yang terkait dengan akun pengguna.sumber
$account = \Drupal::currentUser(): dpm($account);
tidak menampilkan bidang khusus? tetapi jawaban ini mengatakan bagaimana cara mengakses bidang entitas pengguna. Karena pertanyaan tidak menyebutkan bidang mana yang OP coba akses, jawabannya hanya mengatakan metode mana yang digunakan. Tidak ada jawaban dari @batigolix.Berikut ini satu-liner, menggunakan fungsi API:
Setelah itu, bidang pengguna akan dapat diakses.
sumber