Получить значение пользовательского поля пользователя

13

У меня есть пользовательская форма, которая должна отображать значение по умолчанию из пользовательского поля пользователя. Поле было создано в / admin / config / people / account / fields и его имя машины - field_r_period_length_sec.

//get user
$userCurrent = \Drupal::currentUser();
$uid = $userCurrent->id();
$r_period = $userCurrent->field_r_period_length_sec;

Однако значение не отображается, и я получаю эту ошибку:

Примечание: неопределенное свойство: Drupal \ Core \ Session \ AccountProxy :: $ field_r_period_length_sec

Что я делаю неправильно?

matt9292
источник

Ответы:

17

Ответ Бердира дал мне поисковый запрос, который дал мне это:

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

После небольшого количества проб и ошибок этот код работает, если кому-то еще нужно:

$user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id());
$r_period = $user->field_r_period_length_sec->value;

Для нескольких значений используйте

$r_period = $user->get('field_r_period_length_sec')->getValue();
matt9292
источник
1
Для тех, кто хочет удалить предупреждение от PHPStorm, $r_period = $user->field_r_period_length_sec->value;добавьте этот комментарий /** @var $user \Drupal\user\Entity\User */выше$user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id());
Нил Нанд
3

Текущий объект пользователя не является объектом пользователя. Вам нужно загрузить пользователя с этим идентификатором для доступа к любому полю, кроме информации, указанной в AccountInterface.

Berdir
источник
2

Я не знаю с тех пор, когда эти ответы больше не работают, но в Drupal 8.5 вышеприведенное решение все время возвращает null.

После исследования решение для доступа к настраиваемому полю из профиля пользователя:

$activeProfile = \Drupal::getContainer()
  ->get('entity_type.manager')
  ->getStorage('profile')
  ->loadByUser(User::load([uid]), '[profile_machine_name]');

Тогда вы можете сделать

$activeProfile->field_xxx->value
Денис Колмершлаг
источник
Спасибо! Мне удалось получить конкретное поле из профиля пользователя. Но мне интересно, как вы можете установить / обновить имя поля профиля? TIA
Джон Рей Танкинко
1
$ profile-> set ('field_name', value)
Денис Кольмершлаг
1

Entity::load()основано на том, \Drupal::entityManager();что не рекомендуется .

Лучший способ сделать это - использовать entityTypeManager ().

$user = \Drupal::entityTypeManager()->getStorage('user')->load($current_user->id());
$r_period = $user->field_r_period_length_sec->value;
powpow12
источник