Akses bidang pengguna?


18

$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:

$user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id())

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;

1
Anda mendapatkan ID pengguna $user->id().
kiamlaluno

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.
kiamlaluno

1

Drupal::currentUser()mengembalikan objek yang diimplementasikan Drupal\Core\Session\AccountProxyInterface. Itu berbeda dari apa yang kembali dari User::load(), yang merupakan objek pelaksana Drupal\user\UserInterface.

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.

use Drupal\Core\Session\AccountProxyInterface;
use Drupal\user\Entity\User;

$account = User::load(\Drupal::currentUser()->id());

Dengan $account, Anda dapat mengakses semua bidang yang terkait dengan akun pengguna.


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.
kiamlaluno

-2

Berikut ini satu-liner, menggunakan fungsi API:

$account = \Drupal::currentUser()->getAccount();

Setelah itu, bidang pengguna akan dapat diakses.

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.