Получить значение настраиваемого поля пользователя
У меня есть пользовательская форма, которая должна отображать значение по умолчанию из пользовательского поля пользователя. Поле было создано в папке /admin/config/люди/учетные записи/поля, и его имя машины - field_r_period_length_sec.
//get user
$userCurrent = \Drupal::currentUser();
$uid = $userCurrent->id();
$r_period = $userCurrent->field_r_period_length_sec;
Однако значение не отображается, и я получаю эту ошибку:
Примечание: Неопределенное свойство:Drupal\Core\Сессия\Accountproxy::$field_r_period_length_sec
Что я делаю не так?
4 answers
Ответ Бердира дал мне поисковый запрос, который дал мне следующее:
$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();
Текущий объект пользователя не является сущностью пользователя. Вам необходимо загрузить пользователя с этим идентификатором, чтобы получить доступ к любому полю, кроме информации, указанной AccountInterface
.
Я не знаю, с каких пор эти ответы больше не работают, но с Drupal 8.5 вышеупомянутое решение все время возвращает значение null.
После исследования решение для доступа к пользовательскому полю из профиля пользователя выглядит следующим образом:
$activeProfile = \Drupal::getContainer()
->get('entity_type.manager')
->getStorage('profile')
->loadByUser(User::load([uid]), '[profile_machine_name]');
Тогда вы можете сделать
$activeProfile->field_xxx->value
Entity::load()
основан на \Drupal::entityManager();
, который является устаревшим .
Лучший способ сделать это - использовать entityTypeManager().
$user = \Drupal::entityTypeManager()->getStorage('user')->load($current_user->id());
$r_period = $user->field_r_period_length_sec->value;