Étant en train de mettre en place un forum PHPBB, je me suis rapidement confronté aux problèmes d'ajout de modules qui, sur PHPBB, sont loin d'être automatisés. Ayant pris l'habitude des installations de plugins sous Dotclear, ça change... Bref. Il m'était nécessaire d'installer un module de gestion de galerie et je me suis tourné vers PHPBB Gallery qui connaît une certaine popularité. Après 60 minutes de procédure d'installation et après avoir découvert les fonctionnalités de cet excellent module, je me suis heurté à quelques difficultés. En effet, ce module étant doté d'un système de notation, je voulais afficher la note moyenne de chaque membre pour toutes les photos qu'il a mis en ligne, afin que chacun sache où se situer en terme de "performance". Malheureusement, cette fonctionnalité n'est pas disponible de base, dans la version 1.0.3. Je l'ai donc développée.

Voici la procédure :
1. Le traitement
a - Tout d'abord nous allons nous occuper du traitement, c'est à dire le calcul de la moyenne de chaque membre. Pour ceci, rendez-vous à la racine de votre forum et ouvrez le fichier viewtopic.php avec votre éditeur PHP préféré. Cherchez-y le bout de code suivant :
$user_cache[$poster_id] = array(
'joined' => '',
'posts' => '',
Et remplacez-le par celui-ci :
$user_cache[$poster_id] = array(
'joined' => '',
'posts' => '',
'rates_average' => '',
On ajoute tout simplement un élément dans le tableau user afin d'y renseigner la moyenne des notes. Ici, on est dans le cas où l'utilisateur qui poste n'a pas de compte, on ne lui attribue donc pas de valeur.
b - Ensuite, recherchez ce code :
$user_sig = '';
// We add the signature to every posters entry because enable_sig is post dependant
if ($row['user_sig'] && $config['allow_sig'] && $user->optionget('viewsigs'))
{
$user_sig = $row['user_sig'];
}
Et placez-y juste avant (donc au début du else) le code suivant :
// Moyenne des notes
$sql_rates_average = 'SELECT ROUND(AVG(m),1) AS rates_average, rate_image_id FROM
(SELECT rate_image_id, AVG(rate_point) as m FROM '.GALLERY_RATES_TABLE.' GROUP BY rate_image_id) AS td WHERE
rate_image_id IN (SELECT image_id FROM '.GALLERY_IMAGES_TABLE.' WHERE image_user_id = '.$poster_id.')';
$result_rates_average = $db->sql_query($sql_rates_average);
$row_rates_average = $db->sql_fetchrow($result_rates_average);
$user_rates_average = $row_rates_average['rates_average'];
$db->sql_freeresult($result_rates_average);
C'est tout simplement la requête SQL qui va récupérer les notes de toutes les photos de chaque utilisateur et va en faire la moyenne. À noter que la moyenne est calculée en fonction des moyennes de chaque photo et non pas en fonction de toutes les notes reçues par l'utilisateur.
c - Ensuite, recherchez ce code :
$user_cache[$poster_id] = array(
'joined' => $user->format_date($row['user_regdate']),
'posts' => $row['user_posts'],
Et remplacez-le par celui-ci :
$user_cache[$poster_id] = array(
'joined' => $user->format_date($row['user_regdate']),
'posts' => $row['user_posts'],
'rates_average' => $user_rates_average,
Comme dans l'étape a, cette étape consiste à rajouter un élément dans le tableau de l'utilisateur afin de lui attribuer sa moyenne de notes. Il s'agit ici des utilisateurs enregistrés, on peut donc leur attribuer une valeur.
d - Enfin, recherchez ce code :
'POSTER_JOINED' => $user_cache[$poster_id]['joined'],
'POSTER_POSTS' => $user_cache[$poster_id]['posts'],
Et remplacez-le par le code suivant :
'POSTER_JOINED' => $user_cache[$poster_id]['joined'],
'POSTER_POSTS' => $user_cache[$poster_id]['posts'],
'POSTER_RATES_AVERAGE' => $user_cache[$poster_id]['rates_average'],
Ici, on attribue simplement une référence texte à la valeur de la moyenne des notes, afin de l'afficher dans le squelette (c'est une gestion de template ordinaire).
Maintenant que la moyenne de chaque membre est calculée, il reste à l'afficher au bon endroit.
2. L'affichage
e - Tout d'abord, rendez-vous dans le fichier language > fr > common.php et recherchez ce bout de code :
'READING_FORUM' => 'Consulte les sujets dans %s',
'READING_GLOBAL_ANNOUNCE' => 'Consulte une annonce globale',
Et remplacez-le par celui-ci :
'RATES_AVERAGE' => 'Moyenne des notes',
'READING_FORUM' => 'Consulte les sujets dans %s',
'READING_GLOBAL_ANNOUNCE' => 'Consulte une annonce globale',
Encore une fois, on attribue une référence à une chaîne de caractère afin de l'afficher dans le squelette.
f - Ensuite, rendez-vous dans styles > votre style (prosilver par exemple) > template > viewtopic_body.html et recherchez ce bout de code :
<!-- IF postrow.POSTER_POSTS != '' --><dd><strong>{L_POSTS}:</strong> {postrow.POSTER_POSTS}</dd><!-- ENDIF -->
et remplacez-le par celui-ci :
<!-- IF postrow.POSTER_POSTS != '' --><dd><strong>{L_POSTS}:</strong> {postrow.POSTER_POSTS}</dd><!-- ENDIF -->
<!-- IF postrow.POSTER_RATES_AVERAGE != '' --><dd><strong>{L_RATES_AVERAGE}:</strong>
{postrow.POSTER_RATES_AVERAGE}</dd><!-- ENDIF -->
Ici, on renseigne tout simplement nos références dans notre squelette, ce qui permet d'afficher toutes nos informations.
La manipulation est terminée ! Théoriquement, vous devriez voir la moyenne des notes de chaque membre en dessous leur avatar (comme sur l'image en haut du billet), sous réserve qu'ils aient posté des photos et que celles-ci aient été notées ;).
Si vous avez des questions et/ou des remarques, n'hésitez pas !