Obtenga el valor de un campo de usuario personalizado

13

Tengo un formulario personalizado que necesita mostrar un valor predeterminado de un campo de usuario personalizado. El campo se creó en / admin / config / people / accounts / fields y su nombre de máquina es field_r_period_length_sec.

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

Sin embargo, el valor no se muestra y aparece este error:

Aviso: Propiedad no definida: Drupal \ Core \ Session \ AccountProxy :: $ field_r_period_length_sec

¿Qué estoy haciendo mal?

matt9292
fuente

Respuestas:

17

La respuesta de Berdir me dio un término de búsqueda que me dio esto:

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

Después de un poco de prueba y error, este es el código que funciona, en caso de que alguien más necesite:

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

Para valores múltiples, use

$r_period = $user->get('field_r_period_length_sec')->getValue();
matt9292
fuente
1
Para cualquiera que quiera eliminar la advertencia de PHPStorm, $r_period = $user->field_r_period_length_sec->value;agregue este comentario /** @var $user \Drupal\user\Entity\User */arriba$user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id());
Neil Nand
3

El objeto de usuario actual no es una entidad de usuario. Debe cargar al usuario con esa ID para acceder a cualquier campo excepto la información especificada por AccountInterface.

Berdir
fuente
2

No sé desde cuándo estas respuestas ya no funcionan, pero con Drupal 8.5 la solución anterior devuelve nulo todo el tiempo.

Después de la investigación, la solución para acceder al campo personalizado desde un perfil de usuario es:

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

Entonces puedes hacer

$activeProfile->field_xxx->value
Denis Kolmerschlag
fuente
¡Gracias! Pude obtener un campo específico del perfil de usuario. Pero me pregunto cómo puede configurar / actualizar un nombre de campo de perfil. TIA
John Rey Tanquinco
1
$ profile-> set ('field_name', value)
Denis Kolmerschlag el
1

Entity::load()se basa fuera de lo \Drupal::entityManager();cual está en desuso .

Una mejor manera de hacer esto es mediante entityTypeManager ().

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