Obtenez la valeur d'un champ utilisateur personnalisé

13

J'ai un formulaire personnalisé qui doit afficher une valeur par défaut à partir d'un champ utilisateur personnalisé. Le champ a été créé sous / admin / config / people / accounts / fields et son nom d'ordinateur est field_r_period_length_sec.

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

Cependant, la valeur ne s'affiche pas et j'obtiens cette erreur:

Remarque: propriété non définie: Drupal \ Core \ Session \ AccountProxy :: $ field_r_period_length_sec

Qu'est-ce que je fais mal?

matt9292
la source

Réponses:

17

La réponse de Berdir m'a donné un terme de recherche qui m'a donné ceci:

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

Après un peu d'essais et d'erreurs, voici le code qui fonctionne, au cas où quelqu'un d'autre aurait besoin:

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

Pour plusieurs valeurs, utilisez

$r_period = $user->get('field_r_period_length_sec')->getValue();
matt9292
la source
1
Pour tous ceux qui souhaitent supprimer l'avertissement de PHPStorm en $r_period = $user->field_r_period_length_sec->value;ajoutant ce commentaire /** @var $user \Drupal\user\Entity\User */ci$user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id());
Neil Nand
3

L'objet utilisateur actuel n'est pas une entité utilisateur. Vous devez charger l'utilisateur avec cet ID pour accéder à n'importe quel champ à l'exception des informations spécifiées par AccountInterface.

Berdir
la source
2

Je ne sais pas depuis quand ces réponses ne fonctionnent plus, mais avec Drupal 8.5 la solution ci-dessus retourne null tout le temps.

Après enquête, la solution pour accéder au champ personnalisé à partir d'un profil utilisateur est:

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

Ensuite, vous pouvez faire

$activeProfile->field_xxx->value
Denis Kolmerschlag
la source
Merci! J'ai pu obtenir un champ spécifique du profil utilisateur. Mais je me demande comment pouvez-vous définir / mettre à jour un nom de champ de profil? TIA
John Rey Tanquinco
1
$ profile-> set ('field_name', value)
Denis Kolmerschlag
1

Entity::load()est basé sur \Drupal::entityManager();ce qui est obsolète .

Une meilleure façon de procéder consiste à utiliser entityTypeManager ().

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