Article paru le 22 août 2011
Pour mon boulot, j’ai dû modifier l’annuaire (members dans le dossier mod) pour pouvoir afficher les utilisateurs selon leur niveau d’accès (professeurs, élèves, etc..). Ce post s’inspire de cela.
Imaginez que vous voulez lister les gens appartenant à vos groupes. Vous aurez beau vérifier dans l’API de Elgg mais aucune fonction n’existe pour cela. Donc, il faut mettre la main à la pâte. Voilà ce que je propose (en ayant aussi trouvé de l’aide dans le PHP manual).
D’abord, ajoutez un onglet dans views/default/members/members_sort_menu.php:
<li <?php if($filter == "groups") echo "class='selected'"; ?>><a href="<?php echo $url; ?>?filter=groups"><?php echo elgg_echo('members:label:groups'); ?></a></li>
- $filter est important car il s’agit du paramètre qui sera utilisé dans le fichier index.php.
- n’oubliez pas d’ajouter members:label:groups dans languages/fr.php ou en.php
- $url est déjà définie au début du fichier
Aussi, ouvrez index.php, allez dans le switch($filter) et ajoutez un nouveau case:
case "groups": $i = 1; //count $user_guid = get_loggedin_userid(); //user's id $relations = get_users_membership($user_guid); //get all the groups the user is belonging foreach($relations as $rel){ $array[$i] = get_group_members($rel->guid,1500); //get members of the groups $i++; } $all_array= $array[1];//put the first array in another one for($j=2;$j<$i;$j++){ $all_array = array_merge($all_array,$array[$j]);//merge all arrays } foreach($all_array as $cont){//kind of array_unique but for multidimensionnal arrays $content[md5(serialize($cont))] = $cont; } $filter_content = elgg_view_entity_list($content, 0, 0, 10, false, false, true); break;
- J’ai besoin d’un compteur pour mes tableaux car un tableau = un groupe. La variable est instanciée à 1.
- l’id de l’utilisateur est utilisé avec la fonction get_users_memberships pour récupérer les groupes dont il est membre
- get_group_members est utilisé pour récupérer les membres du groupe. 1500 est une limite que vous pouvez changer à tout moment
- $all_array contient le premier tableau, histoire de ne pas avoir de surprises avec une variable vide
- Je commence ma boucle for à $j= 2 puisque mon premier tableau est déjà dans $all_array
- Dans le dernier passage de la boucle foreach, $i a été incrémenté mais ce chiffre n’est pas utilisé, aussi $j doit rester effectivement strictement inférieur à $i
- La boucle for permet de combiner tous les tableaux dans un seul qui est $all_array
- Certains membres d’un groupe peuvent appartenir à un autre, aussi, on élimine les doublons.
- Lire l’explication sur serialize et md5 here
- On envoie les données comme une liste avec elgg_view_entity_list (car $content n’est pas issu d’une requête style list_entities)
A présent, chaque utilisateur peut voir tous les membres des groupes auxquels il appartient dans une même page!