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?
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 quelques essais et 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();
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
.
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
Entity::load()
est basé sur \Drupal::entityManager();
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;