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?

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();

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.


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

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;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.