Bonjour,
j’ai besoin d’un coup de pouce pour un bout de code en PHP, car si j’ai quelques bases en HTML, le PHP m’attend toujours…
Je veux simplement faire apparaître le role d’un usager sur son profil à l’aide de Panels3 en utilisant « custom content » (injecter un bout de code php).
En fouillant la toile, j’ai trouvé les 2 bouts de code suivants (voir bas du message). Mais dans les deux cas, j’obtiens MON rôle sur chaque profil que je consulte et « authenticated user » (ce qui peut être utile pour quelqu’un d’autre). Je veux simplement afficher le rôle de chaque membre sur leur profil respectif.
Merci ! R.
<?php
global $user;
print 'roles: '.implode(', ', $user->roles);
?>==================== et =========================
<?php
global $user ;
print (
"<ul>\r\n") ;
foreach ($user->roles as $role)
{
print (" <li>$role</li>\r\n") ;
}
if ($user->uid == 1)
print (" <li><em>sysop</em></li>\r\n") ;
print (" </ul>\r\n") ;
?>PS. : j’ai testé aussi le module « user title », mais la philosophie de ce dernier est plutôt éloignée de mon objectif dans la mesure où ce module permet d’attribuer à un membre un titre selon le nombre de nœuds qu’il a créé (pour les forums par exemple).
- Vous devez vous identifier ou créer un compte pour écrire des commentaires

Mes nouvelles recherches m’ont permis de trouver un autre code :
<?phpglobal $user;
echo implode($user->roles, ', ');
?>
Mais cette fois-ci j’obtiens l’erreur suivante :
Parse error : syntax error, unexpected T_GLOBAL in /home/hangar217/public_html/includes/common.inc(1695) : eval()’d code on line 2
Un coup de pouce PHP serait très apprécié. R.
www.hangar217.com
Québec
81
Salut
je vais t’aiguiller :
Première chose à faire, installer le modèle Devel (http://drupal.org/project/devel).
Ca te permet d’avoir rapidement accès aux variables dont tu disposes quand tu regardes une page… tu as ‘deux options’ :
Dev load -> les variables qui sont utiles mais pas toutes utilisées.
Dev render -> les variables qui sont utilisées pour l’affichage
Tu vas sur user/l_id_d_un_utilisateur/devel.
Dans dev load, tu ne vois pas grand chose…
dans dev render, tu vois les champs de la variable $user de type ObjectClass,
à savoir
pour y accéder :
comme
$userest de type Object Class, tu accèdes aux divers propriétés en faisant$user->lapropriétéOr la propriété
$user->rolesest un tableau,donc pour accéder à toutes les entrées du tableau, tu as besoin d’y accéder un à un et de les afficher :
soit
<?phpforeach ($user->roles as $role) {// je boucle sur toutes les entrées du tableau $user->roles que j'appelle $role
print $role; // j'affiche le role
}
?>
après tu peux être plus sophistiqué et mettre les roles en liste, ça revient à rajouter du html autour
soit
<?phpprint '<ul>';
foreach ($user->roles as $role) {// je boucle sur toutes les entrées du tableau $user->roles et je l'appelle $role
print '<li>'.$role.'</li>'; // j'imprime le role entouré par une balise liste
}
print '</ul>'; // je ferme la liste
?>
ou les mettre à la suite, séparés par des virgules : dans ce cas là, au lieu d’y accéder un par un avec un
foreach, la fonction implode(separateur,array) permet d’aller plus vite …. ce qui devient<?php print implode(', ', $user->roles); ?>Dans les exemples que tu donnes, tu vois une référence la variable
global $user, qui correspond à l’utilisateur loggé en quelque sorte… donc toi quand tu consultes les profils des autres.j’ai testé ce petit bout de code directement dans la page user-profile.tpl.php, ça doit normalement fonctionner dans ton cas.
—
djibi
djibi.jb
145
Merci pour ton aide.
Je commence à saisir le principe du PHP : appeler certaines informations spécifiques qui sont logées dans une banque de données pour ensuite les disposer selon un ordre particulier. Mais alors Devel… j’ai rien pigé ! Ensuite, tous les codes que tu fournis ne font que retourner des erreurs. Tu mentionnes que tu as fais un test dans user-profile.tpl.php, or, j’ai « injecté » ces codes dans chaque profil via un « custom content » (Panels 3) : d’où la source d’erreur ? C’est plutôt un « snippet » à injecter que je cherche (trifouiller un tpl.php, c’est hors de mes compétences !).
R.
www.hangar217.com
Québec
81
je vais regarder un peu Panels 3 (que je n’utilise personnellement pas)… et je te tiens au courant.
Il se peut qu’une injection dans un custom content de Panels 3 ne se comporte pas de la même manière qu’une injection directement dans le template user-profile.tpl.php… c’est ce que je vais tenter de découvrir.
Quant à trifouiller un template tpl.php, faut juste passer outre la hantise du template, après ça va tout seul.
Pour le module Devel, t’en fais pas, c’est un module qui facilite le développement d’ou l’accès aux variables disponibles, leurs champs etc… Tu ne veux pas trop t’orienter de ce côté là donc ce n’est pas trop grave si tu n’as pas trop compris l’intérêt du module.
—
djibi
djibi.jb
145
J’ai trouvé un autre code dont l’objectif est fort différent, mais qui contient des notes intéressantes : « $uid = arg(1) ; » permet d’obtenir le « id » de l’utilisateur qu’on regarde. Avec cet argument, on peut donc spécifier l’utilisateur pour lequel on cherche une information spécifique (ici son rôle). Comment coder ensemble les arguments « $uid = arg(1) ; » et « print » (ou echo ?) pour obtenir le rôle de l’usager qu’on regarde ? Si ça peut t’être utile.
R.
<?php$verified_roles = array('verified user'); // Role names in quotes, separated by commas.
$uid = arg(1); // Get the user ID from the URL of the profile being viewed --> arg(1).
$author = user_load(array('uid' => $uid));
if (
count(array_intersect($verified_roles, $author->roles)) > 0 ) {$node_field[0]['value'] = 'Verified Member';
} else {
$node_field[0]['value'] = 'Unverified Member';
}
?>
www.hangar217.com
Québec
81
Avec le code que tu joints,
si j’adapte rapidos, ça donne :
<?php$uid
= arg(1);$user = user_load(array('uid' => $uid));
if($user) {
foreach ($user->roles as $role) {
print $role;
}
}
?>
—
djibi
djibi.jb
145
Miracle !!! Ça fonctionne ! Yessss ! Merci !
Mais la machine étant ce qu’elle est, elle me renvoie tout ! Donc,j’ai commme réponse « authenticated usermodèle ». Comment ferait-on pour ne pas faire apparaître « authenticated user » ?
Encore merci !
Edit.
Faudrait-il ajouter un autre « if » ? Genre : if ($role != ‘authenticated user’)
R.
www.hangar217.com
Québec
81
A cette question, tu as la réponse…
Le code php que tu as fourni avant contient un solution assez sympa qui permet de filter les rôles que tu veux afficher :
<?phpcount(array_intersect($verified_roles, $author->roles)) > 0
?>
Comme tu veux un peu comprendre le php, je décompose :
Les rôles sont dans un tableau (array). Tu as plusieurs solutions pour faire ce que tu veux.
Soit tu parcours le tableau de rôles un à un et tu regardes s’il y a ‘authenticated user’ dedans. Si c’est dedans, tu affiches le reste sauf ‘Authenticated user’ (condition if comme tu l’as dit, la solution est à la fin), basta.
Soit tu te dis que le php ; c’est bien fait et qu’il doit y avoir une manière optimisée de faire tout ça.. et c’est là que la fonction array_intersect intervient..
La page de la fonction array_intersect (http://php.net/manual/fr/function.array-intersect.php) te dit :
array_intersect() retourne un tableau contenant toutes les valeurs de array1 qui sont présentes dans tous les autres arguments array2, …
array_intersect() prend deux paramètres, deux tableaux et renvoie en sortie un tableau qui est l’intersection des deux…
(Regarde l’exemple pour mieux comprendre comment ça agit)
Donc, le principe est le suivant ; je crée un tableau avec un rôle à afficher ‘autre_role’ qui va me servir de comparateur… que je compare avec le tableau de l’ensemble des rôles attribués à l’utilisateur.
Si dans le tableau des rôles de départ, il y a ‘autre_role’, la fonction ‘array_intersect()’ va renvoyer en sortie un tableau avec une seule entrée ‘autre_role’. Si le tableau de rôles ne le contient pas, il va renvoyer un tableau vide.
Or cette fonction me renvoie un tableau ce qui n’est pas du texte en soit … ‘L’astuce’ est donc de compter le nombre d’entrée dans le tableau rendu par array_intersect().
‘0’ => ne contient pas le role que tu utilises comme filtre
‘1’ => contient le role que tu utilises comme filtre
Comme tu vois, on attribue à une variable une donnée qui dépend d’une condition ; dans ce cas là, l’opérateur ternaire est idéal.
Il marche comme ça :
<?php $affichage = (test)?si_test_est_vrai:si_test_est_faux. ?>Dans ton cas, ça devient :
<?php$rolesafilter = array('autre_role');
$rolespourlaffichage = (count(array_intersect($rolesafilter, $author->roles)) == 1)?'autre_role':'autre';
print($rolespourlaffichag);
?>
Si tu veux un jour filter avec plus de rôles, la fonction change un peu… tu ne peux plus trop te baser sur le nombre…
ça devient
<?php$rolesafilter = array('autre_role','autre_role_2');
$rolespourlaffichage = array_intersect($rolesafilter, $author->roles)
foreach ($rolespourlaffichag as $role) {
print $role;
}
?>
La fonction globale qui est un peu un mix des deux cas précédent, est donc :
<?php$uid
= arg(1);$user = user_load(array('uid' => $uid));
if(
$user) {$filter_role = array('autre_role');
$filtered_roles = array_intersect($filter_role, $filtered_roles);
foreach ($filtered_roles as $role) {
print $role;
}
}
?>
Finalement la solution que tu préconisais, qui marche très bien si tu ne veux pas filter, mais afficher tous les rôles sauf ‘authentificated user’ :
<?php$uid
= arg(1);$user = user_load(array('uid' => $uid));
if($user) {
foreach ($user->roles as $role) {
if ($role != ‘authenticated user’)
print $role;
}
}
}
?>
J’espère que ça marchera comme ça, je ne peux pas trop tester, je ne suis pas à l’abri d’erreurs non plus… (au contraire)
Pour mon petit speech, ça te permettera d’aborder un peu le php dans le cadre de ton problème. Tu pourras essayer d’utiliser la fonction array_diff (http://www.php.net/manual/fr/function.array-diff.php) pour résoudre ton problème autrement.
—
djibi
djibi.jb
145
Oups…
• le premier code renvoie une erreur « en rouge » (dans le bas du profil)
warning : array_intersect() [function.array-intersect] : Argument #2 is not an array in /home/hangar217/public_html/includes/common.inc(1695) : eval()’d code on line 8.
warning : Invalid argument supplied for foreach() in /home/hangar217/public_html/includes/common.inc(1695) : eval()’d code on line 9.
• le second code renvoie une erreur de syntaxe dans l’espace où le snippet est injecté :
Parse error : syntax error, unexpected T_STRING in /home/hangar217/public_html/includes/common.inc(1695) : eval()’d code on line 7
J’ai ce vague sentiment que le PHP est plus compliqué que le HTML… Mais http://www.php.net/manual/fr/index.php semble un point de départ intéressant.
R.
www.hangar217.com
Québec
81
Pour les erreurs, c’est normal je viens de voir celle que j’avais fait, il faut lire
$filtered_roles = array_intersect($filter_role, $user->roles) ;
dsl, j’ai copié collé ton ex sans faire assez attention.
<?php$uid
= arg(1);$user = user_load(array('uid' => $uid));
if(
$user) {$filter_role = array('autre_role');
$filtered_roles = array_intersect($filter_role, $user->roles);
foreach ($filtered_roles as $role) {
print $role;
}
}
?>
Reessaye et dis moi ce que ça donne.
Pour la seconde erreur, je suis en train de plancher dessus
—
djibi
djibi.jb
145
Ça ne renvoie rien du tout.
Si je comprends bien la logique de ce code, c’est que dans un premier temps il vérifie le numéro d’identification de l’utilisateur que je regarde (c’est le « $uid = arg(1) »). Ensuite, il va chercher tous les utilisateurs et charge la table associé à ce « uid » (c’est le « load (array ‘uid’-> $uid)); ». Ensuite, la fonction « if » permet de chercher le rôle associé à l’utilisateur. Ici, « autre_role » est générique : si dans le tableau des informations associées au membre que je regarde ($uid) se trouve l’expression « autre_role » il va me renvoyer « autre_role » (print).
Si je copie le code tel quel et que je garde « autre_role », la machine ne renvoie rien parce que « autre_role » n’existe pas, donc elle renvoie un tableau vide. J’ai remplacé « autre_rôle » par « authenticated user » et là elle me renvoie sur tous les profils « authenticated user ».
Et si je mets un des rôles qui peut être attribués à un membre, j’obtiens ce rôle seulement sur le profil des membres qui ont ce rôle. Il me faut donc faire la liste de tous les rôles disponibles, excluant « authentificated user », et le tour sera joué.
Question : quelle syntaxe utiliser pour faire cette liste (je vais faire quelques tests) ?
Aussi, en terme de « ressources », laquelle de ces deux méthodes est la plus « économe » ?
Merci.
R.
www.hangar217.com
Québec
81
Qu’on soit clair, quand tu dis ça renvoie rien, ça veut dire, ça ne donne pas d’erreurs ?!?
Si ton but est d’afficher, tous les rôles sauf authenticated user vaut mieux faire un if, d’autant plus que tu n’auras pas à changer ton code à chaque fois que tu rajouteras un rôle MAIS si tu ne souhaites pas que tous les rôles que tu crées soient affichés (particulièrement s’il y en a beaucoup), il vaut mieux prendre la solution du filtre …
Pour la solution du filtre et la logique associée :
<?php$uid
= arg(1); // arg(1) est l'argument 1 dans l'URL (comme tous les profils sont de type ?q=user/1... arg(0) = user, arg(1) = uid de 'utilisateur$user = user_load(array('uid' => $uid)); // te renvoie l'objet utilisateur ou FALSE si l'utilisateur n'existe pas if($user) { // on teste s'il y a bien un utilisateur (FALSE s'il en y a pas, TRUE quand il y a quelque chose)
$filter_role = array('autre_role'); // un tableau de rôles pour le 'filtrage'
$filtered_roles = array_intersect($filter_role, $user->roles); // je filtre le tableau de l'utilisateur chargée (dispo dans $user->roles)
foreach ($filtered_roles as $role) { // pour chaque entrée dans le tableau filtré
print $role; // j'affiche le role
}
}
?>
En gardant la solution du filtre, il faut effectivement rajouter tous les filtres que tu voudrais voir afficher
(soit
$filter_role = array('role1','role2','role3','role4');Pour la solution du if :
<?php$uid
= arg(1);$user = user_load(array('uid' => $uid));
if($user) {
foreach ($user->roles as $role) {
if ($role != "authenticated user") {
print $role;
}
}
}
?>
Adapte à ce que tu cherches, et dis moi ce que ça donne (erreurs, pas erreur surtout)
Pour la liste (je te l’ai déjà écrit au dessus, 1e post) si tu adaptes :
<?php$uid
= arg(1);$user = user_load(array('uid' => $uid));
if($user) {
print '<ul>'; // j'affiche la balise ouvrante liste globale (ul = unordered list)
foreach ($user->roles as $role) {
if ($role != "authenticated user") {
print '<li>'.$role.'</li>'; // j'encapsule chaque rôle dans une balise de liste
}
print '</ul>'; // je ferme la liste globale
}
}
?>
Ressources : ça doit être la même chose, c’est pas ça qui fera ramer ou pas ton site, ( ma réponse officielle est je ne sais pas trop… :P) pour moi dans ton cas, c’est plus la logique de ce que tu veux qui te donne celle à choisir.
—
djibi
djibi.jb
145
Tout baigne ! Les trois codes fonctionnent. 1000 fois merci ! J’ai décidé de retenir la solution du « if » dans la mesure où elle n’a pas à tenir compte des rôles créés ; elle m’apparaît plus efficace, plus « économe ».
J’ose espérer que d’autres sauront profiter de ces snippets. D’ailleurs, ne pourrait-il pas y avoir sur drupalfr.org une banque de « snippets » ?
Prochaine étape… mettre le nez un peu toutes les semaines dans un manuel de php…
Encore merci.
R.
Au fait ! C’est pour www.hangar217.com qui est encore à l’étape pré-alpha !
www.hangar217.com
Québec
81
N’oublie pas de mettre comme résolu ton problème.
Si tu veux commencer tranquillement en php, je conseille souvent le site du zero…
http://www.siteduzero.com/tutoriel-3-14668-concevez-votre-site-web-avec-…
que je trouve sympa pour les débutants.
Se taper le manuel php de A à Z, c’est bien mais c’est pour après :P
PS : sinon tu as un petit erreur de rien du tout sur la page http://www.hangar217.com/banners.
Il affiche
"border=0>sur la page.A +
—
djibi
djibi.jb
145
Le site du zéro… voilà bien un titre un peu décourageant ! Quant à H217, on va bientôt vider le serveur et tout recommencer à neuf.
Encore merci.
R.
www.hangar217.com
Québec
81