Perso Web Management Prog Blogosphère Développement Etudes OS Sécurité Infographie Mobiles Référencement Divers

29 oct. 2009

PHPBB Gallery, calculer la moyenne des notes obtenues

Par Jean-Christophe Duvivier à 11:12

Mots Clés Dotclear, Forum, PHP, PHPBB, Plugins,

Logo PHPBBÉ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.

PHPBB Gallery - Moyenne des notes

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 !

30 janv. 2009

PHPTV, la web tv consacrée à PHP !

Par Jean-Christophe Duvivier à 15:10

Mots Clés Actualités, Internet, PHP, Web,

Je vous avais récemment parlé de TV 4 IT, votre source d'information audiovisuelle. Je reviens vers vous avec une nouvelle web tv : PHPTV.

Site Internet PHPTV

Cette web tv est toute jeune (juillet 2008) et représente surtout la seule web tv PHP. Au programme, une vidéo en ligne tous les mois qui traite de PHP sous tous ses angles (forums, manifestations, programmation pure etc.).

Je vais pas vous en dire plus, et vous conseille dès maintenant de vous rendre sur PHPTV ! N'oubliez pas de vous inscrire à la newsletter ;)

13 déc. 2008

Exporter le résultat d'une requête SQL en CSV et XLS

Par Jean-Christophe Duvivier à 12:30

Mots Clés PHP, SQL,

Je vous propose un petit script PHP afin d'exporter facilement vos données SQL en .CSV ou .XLS. C'est simple, compréhensible, et surtout, facile à mettre en place ;)

<?php
// Inclusion des paramètres de connexion à votre base de données
require_once('config.php');
 
// Titre des colonnes de votre fichier .CSV ou .XLS
$fichier = "Nom; Prenom; Mail; Adresse";
$fichier .= "\n";
 
// Requête SQL
$sql = "SELECT * FROM personnes";
$req = mysql_query($sql);
 
// Enregistrement des résultats ligne par ligne
while($row = mysql_fetch_object($req))
{
   $fichier .= "".$row->nom.";".$row->prenom.";".$row->mail.";".$row->adresse."\n";
}
 
// Déclaration du type de contenu
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: attachment; filename=Personnes.csv"); // Remplacer .csv par .xls pour exporter en .XLS
print $fichier;
exit;
?>

Si vous remarquez une erreur qui s'est glissée dans le script ou si vous avez une question, n'hésitez pas à m'en faire part à la suite de ce sujet ;)

02 déc. 2008

Envoyer des emails de type texte et HTML avec pièces jointes en PHP

Par Jean-Christophe Duvivier à 19:13

Mots Clés HTML, Mail, PHP,

Le but de ce tuto est de vous donner toutes les cartes afin que vous puissiez envoyer des emails de type "texte" ou "HTML" via PHP. Il ne se veut pas exhaustif, mais suffisamment complet pour répondre à la demande d'au moins 90% d'entre vous. J'estime que seules les personnes expérimentées auront besoin de créer des applications plus complexes (je généralise, mais c'est majoritairement le cas).

Ce tuto se veut succin mais pertinent. J'irai droit au but. L'envoi de Mail requiert la connaissance de paramètres, d'une syntaxe particulière... Soit vous l'apprenez par cœur, soit vous mettez ce tuto en marque page, il se révélera très pratique ;) Trêve de blabla. On y va.

1. Envoi de mail texte

L'envoi de mail se fait grâce à la fonction mail(). Elle prend au minimum 3 paramètres : le destinataire, le sujet et le message.

<?php
/*---- Déclaration des paramètres ----*/
$destinataire = "destinataire@gmail.com"; // Pour plusieurs destinataires, les séparer par une virgule
$sujet = "Tuto - Envoi de mail";
 
/*---- Déclaration du message ----*/
$message = "Mon Message";
 
/*---- Envoi du mail ----*/
mail($destinataire, $sujet, $message);
?>

Grâce à un 4ème paramètre (optionnel), l'entête, il vous est possible de renseigner davantage d'informations, tels que l'adresse email de l'expéditeur, ou encore la priorité du mail.

<?php
/*---- Déclaration des paramètres ----*/
$destinataire = "destinataire@gmail.com"; // Pour plusieurs destinataires, les séparer par une virgule
$expediteur = "contact@jchristophe.fr";
$sujet = "Tuto envoi de mail";
 
/*---- Déclaration de l'entête ----*/
$entete = "From: $expediteur \n"; // Adresse de l'expéditeur
$entete .= "Reply-to: $expediteur \n"; // Adresse de réponse
$entete .= "Cc: destinataire1@gmail.com \n"; // Destinataire(s) en copie cachée
$entete .= "Bcc: destinataire2@gmail.com \n"; // Destinataire(s) en mode caché
$entete .= "X-Priority: 1 \n"; // Priorité du mail. 5 = basse, 3 = normal, 1 = urgent
 
/*---- Déclaration du message ----*/
$message = "Mon Message"; // Pour sauter une ligne, écrire : \n
 
/*---- Envoi du mail ----*/
mail($destinataire, $sujet, $message, $entete);
?>

2. Envoi de mail html

Pour envoyer un mail au format HTML, il suffit de déclarer le Content-Type du mail dans son entête. Vous pourrez ensuite utiliser toutes vos balises HTML dans votre message.

<?php
/*---- Déclaration des paramètres ----*/
$destinataire = "destinataire@gmail.com"; // Pour plusieurs destinataires, les séparer par une virgule
$expediteur = "contact@jchristophe.fr";
$sujet = "Tuto envoi de mail";
 
/*---- Déclaration de l'entête ----*/
$entete = "From: $expediteur \n"; // Adresse de l'expéditeur
$entete .= "Reply-to: $expediteur \n"; // Adresse de réponse
$entete .= "Cc: destinataire1@gmail.com \n"; // Destinataire(s) en copie cachée
$entete .= "Bcc: destinataire2@gmail.com \n"; // Destinataire(s) en mode caché
$entete .= "X-Priority: 1 \n"; // Priorité du mail. 5 = basse, 3 = normal, 1 = urgent
$entete .= "Content-Type: text/html \n"; // Type du mail : HTML
 
/*---- Déclaration du message ----*/
$message = "<html><body>";
$message .= "<strong>Mon Texte Gras</strong><br />";
$message .= "<font color=\'#ff0000\'>Mon Texte Rouge</font>";
$message .= "</body></html>",
 
/*---- Envoi du mail ----*/
mail($destinataire, $sujet, $message, $entete);
?>

Concernant l'affichage des images, n'oubliez pas de renseigner l'url complète de votre image, que vous avez, au préalable, hébergé sur un serveur ;)

3. Envoi de mail avec pièce(s) jointe(s)

<?php
/*---- Déclaration des paramètres ----*/
$destinataire = "contact@jchristophe.fr"; // Pour plusieurs destinataires, les séparer par une virgule
$expediteur = "contact@jchristophe.fr";
$sujet = "Tuto envoi de mail";
 
$delimiteur = md5(uniqid(rand())); // Création d'un numéro unique, qui délimitera les différents blocs du mail
 
$piecejointe = "candidat.pdf"; // Déclaration du fichier à envoyer en tant que pièce jointe
$contenupiecejointe = file_get_contents($piecejointe); // Récupération du contenu du fichier
$contenupiecejointe = chunk_split(base64_encode($contenupiecejointe)); // Conversion du fichier : respect du format RFC 2045
$typepiecejointe = filetype($piecejointe); // Récupération du type du fichier
 
/*---- Déclaration de l'entête ----*/
$entete = "From: $expediteur \n";
$entete .= "Reply-to: $expediteur \n";
$entete .= "Cc: destinataire1@gmail.com \n";
$entete .= "Bcc: destinataire2@gmail.com \n";
$entete .= "X-Priority: 1 \n";
$entete .= "MIME-Version: 1.0 \n";
$entete .= "Content-Type: multipart/mixed; boundary=\"$delimiteur\" \n"; // Déclaration du type du mail et du délimiteur
$entete .= " \n";
 
/*---- Déclaration du message ----*/
$message = "--$delimiteur \n"; // Séparation du bloc "entete" et du bloc "message" par notre délimiteur
$message .= "Content-Type: text/html; charset=\"iso-8859-1\" \n"; // Déclaration du type du message ainsi que la charte de codage
$message .= "Content-Transfer-Encoding:8bit\n"; // Déclaration du type de codage
$message .= "\n";
$message .= "<strong>Mon Texte Gras</strong><br />";
$message .= "<font color=\"#ff0000\">Mon Texte Rouge</font>";
$message .= "\n";
 
/*---- Insertion de la pièce jointe ----*/
$message .= "--$delimiteur \n"; // Séparation du bloc "message" et du bloc "pièce jointe" par notre délimiteur
$message .= "Content-Type: $typepiecejointe; name=\"$piecejointe\" \n"; // Déclaration du type et du nom de la pièce jointe
$message .= "Content-Transfer-Encoding: base64 \n"; // Déclaration du type de codage
$message .= "Content-Disposition: attachment; filename=\"$piecejointe\" \n"; // attachment = pièce jointe = fichier à sauvegarder
$message .= "\n";
$message .= $contenupiecejointe." \n"; // Insertion du fichier
$message .= "\n";
$message .= "--$delimiteur"; // Délimitation de la fin de la pièce jointe, et du mail
 
/*---- Envoi du mail ----*/
mail($destinataire, $sujet, $message, $entete);
?>

Et voilà ! Je pense avoir été assez précis, explicite et pertinent. Cependant, si vous avez des questions sur des éléments relatifs à l'envoi de mail en PHP présents, ou pas, dans ce tuto, je me ferai un plaisir de répondre dans la limite de mes compétences ;)

N'hésitez pas à réagir ;)

- page 1 de 3

Propulsé par Dotclear - Hebergé par Infomaniak - Thème Green Mantis par jchristophe
© jchristophe.fr 2008 - 2009
Valide CSS 2.1 CSS 2.1 Valide XHTML 1.0 XHTML Strict 1.0 Flux RSS RSS