Obter o valor de um campo de usuário personalizado

13

Eu tenho um formulário personalizado que precisa exibir um valor padrão de um campo de usuário personalizado. O campo foi criado em / admin / config / people / accounts / fields e seu nome da máquina é field_r_period_length_sec.

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

No entanto, o valor não aparece e recebo este erro:

Aviso: Propriedade indefinida: Drupal \ Core \ Session \ AccountProxy :: $ field_r_period_length_sec

O que estou fazendo errado?

matt9292
fonte

Respostas:

17

A resposta de Berdir me deu um termo de pesquisa que me deu o seguinte:

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

Após algumas tentativas e erros, este é o código que funciona, caso alguém precise:

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

Para vários valores, use

$r_period = $user->get('field_r_period_length_sec')->getValue();
matt9292
fonte
11
Para quem quiser remover o aviso do PHPStorm, $r_period = $user->field_r_period_length_sec->value;adicione este comentário /** @var $user \Drupal\user\Entity\User */acima$user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id());
Neil Nand
3

O objeto de usuário atual não é uma entidade de usuário. Você precisa carregar o usuário com esse ID para acessar qualquer campo, exceto as informações especificadas por AccountInterface.

Berdir
fonte
2

Não sei desde quando essas respostas não funcionam mais, mas com o Drupal 8.5 a solução acima retorna nula o tempo todo.

Após a investigação, a solução para acessar o campo personalizado a partir de um perfil de usuário é:

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

Então você pode fazer

$activeProfile->field_xxx->value
Denis Kolmerschlag
fonte
Obrigado! Consegui obter um campo específico do perfil do usuário. Mas eu estou querendo saber como você pode definir / atualizar um nome de campo de perfil? TIA
John Rey Tanquinco
11
$ profile-> set ('field_name', value)
Denis Kolmerschlag
1

Entity::load()é baseado no \Drupal::entityManager();qual está obsoleto .

Uma maneira melhor de fazer isso é usar entityTypeManager ().

$user = \Drupal::entityTypeManager()->getStorage('user')->load($current_user->id());
$r_period = $user->field_r_period_length_sec->value;
powpow12
fonte