Accéder aux champs utilisateur?


18

$account = \Drupal::currentUser()charge l'objet utilisateur dans $account, mais comment accéder aux champs personnalisés que j'ai créés sur l'objet utilisateur (via l'interface utilisateur d'administration)?

Avec dpm($account)je ne vois aucun de mes champs personnalisés.


Les champs personnalisés ont-ils encore des valeurs? Semble se souvenir qu'ils manquent à l'objet entité jusqu'à ce qu'ils aient réellement une valeur définie
Clive

Oui, ils ont des valeurs. Je peux obtenir l'uid avec \Drupal::currentUser()->id()puis faire une requête de base de données, mais en D7, ils étaient déjà sur l'objet?
24ma13wg

Ce problème ne concerne pas seulement l'utilisateur de groseille; il se rapporte généralement à l'objet utilisateur. api.drupal.org/api/drupal/… vous amène à mi-chemin, mais comme c'est généralement le cas avec Drupal Docs, il laisse beaucoup encore dans l'obscurité
sea26.2

Réponses:


29

\Drupal::currentUser()renvoie un Drupal\Core\Session\AccountInterfaceobjet. Cela pourrait être un utilisateur complet (ce serait un Drupal\user\UserInterface), mais pour le moment, pour la méthode d'authentification par défaut, ce n'est pas le cas.

Utilisez ceci pour obtenir l'entité utilisateur et tous les champs:

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

D7 avait exactement le même comportement, la différence est maintenant que dans D7, ils étaient simplement différents stdClass'es, maintenant vous avez des interfaces explicites pour différencier les deux.


Malgré le vote négatif, cette réponse est correcte, même à propos de Drupal 7. $GLOBALS['user']ne contient pas d'objet utilisateur entièrement chargé, dans Drupal 7; il contient uniquement les informations trouvées dans le tableau des utilisateurs.
kiamlaluno

Ouais, je ne sais pas pourquoi cela a obtenu un downvote. C'est correct, à la fois pour D7 et D8.
mpdonadio

Ce n'est qu'une partie de la réponse. Et en fait, cela ne vous rapproche pas plus des données que la «solution» d'origine. Vous devez "récupérer" les données de l'objet. Pour ce faire, consultez la solution de travail publiée par @batigolix ci-dessous.
sea26.2

Notez que les champs qui n'ont pas de valeurs n'apparaîtront pas dans le tableau de valeurs.
JAyenGreen

16

Et voici comment le retirer de cet objet:

// Load the current user.
$user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id());

// Get field data from that user.
$website = $user->get('field_website')->value;
$body = $user->get('body')->value;

// Some default getters include.
$email = $user->get('mail')->value;
$name = $user->get('name')->value;
$uid= $user->get('uid')->value;

1
Vous obtenez l'ID utilisateur avec $user->id().
kiamlaluno

En outre, l'entité utilisateur ne dispose pas d' un corps champ de base. S'il s'agit d'un champ ajouté à partir de l'interface utilisateur, le nom du champ commencerait par field_ . J'éviterais cet exemple, car cela fait penser aux utilisateurs qu'il s'agit d'un champ de base ajouté à partir du code de base Drupal.
kiamlaluno

1

Drupal::currentUser()renvoie un objet implémentant Drupal\Core\Session\AccountProxyInterface. C'est différent de ce User::load()qui est revenu de , qui est un objet implémentant Drupal\user\UserInterface.

Cela signifie qu'il n'est pas assuré que vous obtenez un Userobjet complet avec ses champs chargés, mais il n'est même pas assuré que vous obtenez un Userobjet. Par conséquent, vous appelez call certaines des méthodes disponibles dans la Userclasse, telles que User::get(). Vous pouvez appeler AccountInterface::id(), qui renvoie l'ID utilisateur; avec cela, vous pouvez ensuite charger l' Userobjet complet avec User::load()et avoir accès à tous les modules de champs attachés à l'entité.

use Drupal\Core\Session\AccountProxyInterface;
use Drupal\user\Entity\User;

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

Avec $account, vous pouvez alors accéder à tous les champs associés à un compte utilisateur.


Peut-être, mais cela pose toujours la question: "comment accédez-vous aux champs PERSONNALISÉS". Voir la réponse ci-dessus de @batigolix
sea26.2

La question est plus Pourquoi $account = \Drupal::currentUser(): dpm($account);n'affiche aucun champ personnalisé? mais cette réponse indique comment accéder aux champs d'entité utilisateur. Puisque la question ne dit pas à quels champs l'OP essaie d'accéder, la réponse dit simplement quelle méthode utiliser. Il n'y a pas de réponses de @batigolix.
kiamlaluno

-2

Voici une ligne, en utilisant la fonction API:

$account = \Drupal::currentUser()->getAccount();

Après cela, les champs utilisateur seront accessibles.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.