Truy cập trường người dùng?


18

$account = \Drupal::currentUser()tải đối tượng người dùng vào $account, nhưng làm cách nào để truy cập các trường tùy chỉnh mà tôi đã tạo trên đối tượng người dùng (thông qua giao diện người dùng quản trị)?

Với dpm($account)tôi không thể thấy bất kỳ trường tùy chỉnh của tôi.


Các trường tùy chỉnh có bất kỳ giá trị nào chưa? Dường như nhớ chúng bị thiếu khỏi đối tượng thực thể cho đến khi chúng thực sự có một bộ giá trị
Clive

Vâng, họ có giá trị. Tôi có thể lấy uid với \Drupal::currentUser()->id()và sau đó thực hiện truy vấn cơ sở dữ liệu, nhưng trong D7 chúng đã có trên đối tượng chưa?
24ma13wg

Vấn đề này không chỉ là về người dùng tò mò; nó liên quan đến đối tượng người dùng. api.drupal.org/api/drupal/ cấp giúp bạn đi được nửa đường, nhưng như thường lệ với Drupal Docs, nó vẫn còn nhiều trong bóng tối
biển 26.2

Câu trả lời:


29

\Drupal::currentUser()trả về một Drupal\Core\Session\AccountInterfaceđối tượng Đó có thể là một người dùng đầy đủ (đó sẽ là một Drupal\user\UserInterface), nhưng ngay bây giờ, đối với phương thức xác thực mặc định, thì không.

Sử dụng điều này để có được thực thể người dùng và tất cả các trường:

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

D7 có hành vi giống hệt nhau, sự khác biệt bây giờ chỉ là ở D7, chúng đơn giản là các stdClass khác nhau, bây giờ bạn có giao diện rõ ràng để phân biệt hai loại này.


Mặc dù bỏ phiếu thấp, câu trả lời này là chính xác, ngay cả về Drupal 7. $GLOBALS['user']không chứa đối tượng người dùng được tải đầy đủ, trong Drupal 7; nó chỉ chứa thông tin tìm thấy trong bảng người dùng.
kiamlaluno

Vâng, không chắc tại sao điều này có một downvote. Đó là chính xác, cả về D7 và D8.
mpdon Arena

Đây chỉ là một phần của câu trả lời. Và trên thực tế, nó giúp bạn không gần gũi hơn với dữ liệu so với "giải pháp" ban đầu. Bạn phải "lấy" dữ liệu từ đối tượng. Để làm điều đó - xem giải pháp làm việc được đăng bởi @batigolix bên dưới.
biển 26.2

Lưu ý rằng các trường không có giá trị sẽ không xuất hiện trong mảng giá trị.
JAyenGreen

16

Và đây là cách đưa nó ra khỏi đối tượng đó:

// 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
Bạn nhận được ID người dùng với $user->id().
kiamlaluno

Ngoài ra, các tổ chức Người dùng không có một cơ thể lĩnh vực cơ sở. Nếu đó là một trường được thêm từ giao diện người dùng, tên trường sẽ bắt đầu bằng field_ . Tôi sẽ tránh ví dụ đó, vì nó khiến người dùng nghĩ rằng đó là một trường cơ sở được thêm vào từ mã lõi Drupal.
kiamlaluno

1

Drupal::currentUser()trả về một đối tượng thực hiện Drupal\Core\Session\AccountProxyInterface. Điều đó khác với những gì được trả về User::load(), đó là một đối tượng thực hiện Drupal\user\UserInterface.

Điều này có nghĩa là không đảm bảo bạn có được một Userđối tượng đầy đủ với các trường được tải, nhưng thậm chí không đảm bảo bạn có được một Userđối tượng. Kết quả là, bạn gọi gọi một số phương thức có sẵn từ Userlớp, chẳng hạn như User::get(). Bạn có thể gọi AccountInterface::id(), trả về ID người dùng; với điều đó, sau đó bạn có thể tải toàn bộ Userđối tượng User::load()và có quyền truy cập vào tất cả các mô-đun trường được đính kèm với thực thể.

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

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

Với $account, sau đó bạn có thể truy cập tất cả các trường được liên kết với tài khoản người dùng.


Có lẽ, nhưng nó vẫn đặt ra câu hỏi: "làm thế nào để bạn truy cập vào các trường TÙY CHỈNH". Xem câu trả lời ở trên từ @batigolix
sea26.2

Câu hỏi là nhiều hơn Tại sao $account = \Drupal::currentUser(): dpm($account);không hiển thị bất kỳ trường tùy chỉnh? nhưng câu trả lời này cho biết làm thế nào để truy cập các trường thực thể người dùng. Vì câu hỏi không cho biết OP đang cố truy cập vào lĩnh vực nào, nên câu trả lời chỉ cho biết nên sử dụng phương pháp nào. Không có câu trả lời từ @batigolix.
kiamlaluno

-2

Đây là một lớp lót, sử dụng chức năng API:

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

Sau đó, các trường người dùng sẽ có thể truy cập.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.