Доступ к пользовательским полям?


18

$account = \Drupal::currentUser()загружает пользовательский объект $account, но как мне получить доступ к настраиваемым полям, которые я создал для пользовательского объекта (через интерфейс администратора)?

С dpm($account)я не вижу ни одного из моих пользовательских полей.


У пользовательских полей есть какие-нибудь значения? Казаться , чтобы помнить их неведения от объекта сущности , пока они фактически не имеют значения , установленного
Clive

Да, у них есть ценности. Я могу получить UID \Drupal::currentUser()->id()и затем выполнить запрос к базе данных, но в D7 они уже были на объекте?
24ma13wg

Эта проблема не только о пользователя смородины; в основном это относится к объекту пользователя. api.drupal.org/api/drupal/… доставит вас на полпути туда, но, как обычно бывает в Drupal Docs, он оставляет много в темноте
море26.2

Ответы:


29

\Drupal::currentUser()возвращает Drupal\Core\Session\AccountInterfaceобъект. Это может быть полный пользователь (это был бы Drupal\user\UserInterface), но сейчас, для метода аутентификации по умолчанию, это не так.

Используйте это, чтобы получить пользовательскую сущность и все поля:

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

У D7 было точно такое же поведение, разница теперь только в том, что в D7 они были просто разными stdClass'ами, теперь у вас есть явные интерфейсы для их различия.


Несмотря на отрицательное голосование, этот ответ является правильным, даже в Drupal 7. в Drupal 7 $GLOBALS['user']нет полностью загруженного пользовательского объекта; он содержит только информацию, найденную в таблице пользователей.
kiamlaluno

Да, не уверен, почему это получило отрицательный голос. Это правильно, как в отношении D7, так и D8.
mpdonadio

Это только часть ответа. И на самом деле, он не приближает вас к данным, чем оригинальное «решение». Вы должны «получить» данные от объекта. Для этого - см. Рабочее решение, опубликованное @batigolix ниже.
sea26.2

Обратите внимание, что поля, которые не имеют значений, не будут отображаться в массиве значений.
JAyenGreen

16

А вот как вытащить его из этого объекта:

// 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
Вы получаете идентификатор пользователя с $user->id().
kiamlaluno

Кроме того, сущность User не имеет основного поля тела . Если это поле добавлено из пользовательского интерфейса, имя поля будет начинаться с field_ . Я бы избегал этого примера, поскольку он заставляет пользователей думать, что это базовое поле, добавленное из кода ядра Drupal.
kiamlaluno

1

Drupal::currentUser()возвращает объект , реализующий Drupal\Core\Session\AccountProxyInterface. Это отличается от того, что возвращено User::load(), который является объектом реализации Drupal\user\UserInterface.

Это означает, что вы не уверены, что вы получили полный Userобъект с загруженными полями, но даже не уверены, что вы получили Userобъект. Как следствие, вы вызываете вызов некоторых методов, доступных в Userклассе, таких как User::get(). Вы можете позвонить AccountInterface::id(), который возвращает идентификатор пользователя; после этого вы можете загрузить полный Userобъект User::load()и получить доступ ко всем модулям полей, прикрепленным к объекту.

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

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

С помощью $accountвы можете получить доступ ко всем полям, связанным с учетной записью пользователя.


Возможно, но все же возникает вопрос: «Как вы получаете доступ к полям CUSTOM». Смотрите ответ выше от @batigolix
sea26.2

Вопрос в том, почему $account = \Drupal::currentUser(): dpm($account);не отображаются какие-либо настраиваемые поля? но этот ответ говорит, как получить доступ к полям объекта пользователя. Поскольку в вопросе не говорится, к каким полям пытается получить доступ OP, ответ просто говорит, какой метод использовать. Нет ответов от @batigolix.
kiamlaluno

-2

Вот одна строка, использующая функцию API:

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

После этого пользовательские поля будут доступны.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.