Modification de l'objet $user

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour à tous,

Je me prépare à installer l'outil de statistiques XiTi Pro (souhait du client) pour lequel je peux stocker des variables telles que département de la personne connectée.

Ma question est donc la suivante, comment puis-je faire pour que, lorsqu'une personne est connectée, ajouter à l'objet $user global une information issue de son profil et que cette info soit donc accessible sur toutes les pages.
Où se situe la fonction de création de la variable globale $user que je peux modifier pour y ajouter mon champ.

La fonction user_login_submit() ne fait que regénérer la session si personne n'était connecté avant, mais je ne vois pas où est créé l'objet $user ?

Merci d'avance.

Forum : 
Version de Drupal : 

Dans ton site, actuellement, est-ce que l'information est déjà dispo sur ton profil ? (avec le module Profile, livré de base, il est possible de rajouter autant d'information que tu le souhaite)

As-tu utilisé cela ?

Si oui, tu n'as pas a toucher a la globale $user car elle contient déjà ces informations (print_r($user) pour t'en rendre compte).

Merci Haza pour ces infos, je connais Profile, mais le soucis, c'est que j'ai préféré utilisé NodeProfile pour spécifier des champs avec des valeurs issues de base de données (qu'on ne peut pas faire avec les types de champs proposés par Profile).

Il s'agit donc d'un champ CCK sur un node associé au user.
Je vais donc devoir passer par une requête pour aller chercher mon département, mais j'aimerais savoir où.

Yop,

je ne connais pas le module nodeprofile, mais je suppose que tu as une fonction d'API pour faire la jointure avec ton user. Pour bio par exemple tu as bio_for_user($uid) qui te sort le nid correspondant. (ATTENTION, je te dis ça de tête...)

Donc, je te fais un pseudo code à adapter...
Je suis très fatigué donc il se peut que ce ne soit pas tout à fait ça ;)

<?php
global $user;

$nid = fonction_api_nodeprofile_for_user($user->uid);
$profile = node_load($nid);
$dept = $profile->field_dept[0]['value'];
?>

Sinon pour répondre à ta question, regarde les hooks hook_user() et hook_nodeapi() avec $op égal à load... tu peux compléter les objets à ce niveau.

Merci webastien,

Je saisi tout à fait ton code, mais n'est-ce pas trop lourd de faire un node_load sur chaque page pour récupérer le champ de département ?
Dans notre cas, on a besoin de 2 requêtes minimum (correspondance uid et nid, puis nid field_dpt)
Je souhaiterais passer cette valeur en session, comme l'objet $user qui est accessible sur chaque page.

Merci bien.

Je ne pense pas que ce soit lourd : node_load utilise un système de "cache" quand tu l'appelles avec un $nid en paramètre et non un array().
Pour être plus précis, il met les nodes déjà chargés dans un tableau statique. Généralement, sur une même page, le node_load est appelé plusieurs fois pour le même node sans problèmes.

Ok, ce qui est dommage dans mon cas, c'est que le noeud correspondant au noeud des informations profil n'est actuellement jamais chargé sur la page.
Je n'utilise pour le moment que l'uid et le pseudo.
Ca fait donc bien un chargement de noeud supplémentaire sur chaque page ?
A moins qu'une fois chargé sur une page, le noeud existe en cache, et sera simplement récupéré sur les autres pages chargées, Drupal fonctionne t-il ainsi avec le cache ?

Peut-on mettre l'info souhaitée dans la variable session $user ? (et ainsi, je pourrais tester sur chaque page l'existence de cette valeur, sinon, je lance ma requête pour aller la rechercher et la mémoriser en session)

Merci pour les infos.

Non Drupal ne fonctionne pas comme ça en terme de cache.
Charger un node de plus ou de moins, ça ne va pas ralentir considérablement ton site mais tu peux si tu le souhaites...

Tu peux mettre l'info en session, sinon utilises le champ fourre tout de la table user : data.

En fait quand tu as l'objet $user, tu peux lui ajouter des paramètres : $user->bidul = 'machin'; ...

Si tu sauvegardes l'objet avec des valeurs supplémentaires, elles seront sérialisées et mises dans data.

<?php
global $user;
user_save($user, array('bidul' => 'machin'));
?>

Attention cependant avec l'utilisateur anonyme qui a une seule entrée dans la table users pour tous les visiteurs du site. A toi de voir si l'info doit être partager.

Voilà qui est intégré. Je me suis effectivement servi du user_save.
Mais j'ai dû modifier cette fonction qui faisait un invoke sur les hooks user, mais je l'appelais depuis un hook "user" donc ça tournait en boucle.

Enfin, je m'en suis sorti, grâce à vous surtout. Alors merci.