Associer un utilisateur à un avatar
Créez site17 en copiant site16.
- /cms
- ...
- site16
- site17
Dans ce chapitre, nous allons programmer l'analyse des paramètres dans une URL et l'illustrer par la création d'une icône unique associée à un nom d'utilisateur.
Pour tester le résultat en ligne, entrez http://www.frasq.org/cms/site17 dans la barre d'adresse de votre navigateur.
Identifiez-vous en tant que foobar
avec le mot de passe f00bar
.
Une icône, calculée d'après le nom de connexion, est affichée à droite dans la page d'accueil.
Entrez http://www.frasq.org/cms/site17/avatar/frasq dans la barre d'adresse de votre navigateur. Une icône de 128x128 pixels est retournée. Essayez d'autres noms. Entrez http://www.frasq.org/cms/site17/avatar/frasq/64 pour générer une icône de 64x64 pixels. Si vous spécifiez une dimension inférieure à 16 ou supérieure à 128, une erreur HTTP est retournée. Entrez http://www.frasq.org/cms/site17/avatar?name=frasq&size=64 pour passer le nom de connexion et la taille de l'icône en paramètres d'une URL. Les 2 méthodes sont interchangeables. Essayez l'URL http://www.frasq.org/cms/site17/avatar/frasq?size=48.
Commencez par créer l'action avatar
en ajoutant le fichier avatar.php dans le dossier actions avec le contenu suivant :
- /cms/site17
- actions
- avatar.php
- actions
- require_once 'identicon.php';
- function avatar($lang, $arglist=false) {
- $name=false;
- $size=128;
- if ($arglist) {
- if (isset($arglist[0])) {
- $name = $arglist[0];
- }
- else if (isset($arglist['name'])) {
- $name = $arglist['name'];
- }
- if (isset($arglist[1])) {
- $size = $arglist[1];
- }
- else if (isset($arglist['size'])) {
- $size = $arglist['size'];
- }
- }
- if (!$name or !$size or !is_numeric($size) or $size < 16 or $size > 128) {
- return run('error/badrequest', $lang);
- }
- $img = identicon($name, $size);
- header('Content-Type: image/png');
- header("Content-Disposition: inline; filename=$name");
- imagepng($img);
- imagedestroy($img);
- return false;
- }
avatar
retourne un document contenant l'image PNG construite par la fonction identicon
pour un nom et une taille donnés.
avatar
prend 2 arguments, la langue et un tableau de paramètres.
Les valeurs passées dans $arglist
sont soit indexées soit nommées.
avatar
extrait $name
et $size
de $arglist
aux positions 0 et 1 ou 'name'
et 'size'
.
Si $name
ou $size
a une valeur invalide, avatar
retourne une erreur.
Pour donner accès à l'action avatar
, ajoutez un alias par langue dans le fichier includes/aliases.inc :
- 'avatar' => 'avatar',
Ajoutez le fichier identicon.php dans le dossier library avec le contenu suivant :
- /cms/site17
- library
- identicon.php
- library
La fonction identicon
retourne une image carrée générée d'après le MD5 d'une chaine de caractères. Le code est publié sur le site sourceforge.net.
Éditez le fichier engine.php dans le dossier library et modifiez l'interprétation d'une URL par la fonction dispatch
et l'appel d'une action par la fonction run
:
- $action=$args=$params=false;
Initialise le nom de l'action, la liste des arguments et la liste des paramètres.
- if ($query) {
- $params = array();
- foreach (explode('&', $query) as $q) {
- $p = explode('=', $q);
- if (count($p) == 2) {
- list($key, $value) = $p;
- if ($key) {
- $params[$key]=urldecode($value);
- }
- }
- }
- }
Fabrique la liste des paramètres lus après le ? dans une URL.
- $arglist = $args ? $params ? array_merge($args, $params) : $args : $params;
- run($action, $lang, $arglist);
Fusionne dans $arglist
les paramètres lus dans une URL après le nom de l'action dans $args
et après le ? dans $params
.
- function run($action, $lang=false, $arglist=false) {
run
a 3 arguments : le nom de l'action, la langue et une liste de paramètres.
- $farg = array();
- if ($lang) {
- $farg[] = $lang;
- }
- if ($arglist) {
- $farg[] = $arglist;
- }
- $output = call_user_func_array($func, $farg);
Appelle la fonction correspondant à une action avec un nombre d'arguments variable.
Corrigez la fonction serviceunavailable
dans le fichier actions/error/serviceunavailable.php pour prendre en compte la modification de l'appel d'une action :
- function serviceunavailable($lang, $arglist=false) {
- $closing_time=$arglist[0];
- $opening_time=$arglist[1];
Ajoutez l'affichage de l'avatar dans la page d'accueil :
- <?php if (!empty($username)): ?>
- <p class="right"><img src="<?php echo $base_path; ?>/avatars/<?php echo $username; ?>.png" title="<?php echo $username; ?>" /></p>
- <?php endif; ?>
- <?php if (!empty($username)): ?>
- <p class="right"><img src="<?php echo $base_path; ?>/avatars/<?php echo $username; ?>.png" title="<?php echo $username; ?>" /></p>
- <?php endif; ?>
Passez la variable $username
à la vue dans l'action home
:
- $username = isset($_SESSION['user']) ? $_SESSION['user']['name'] : false;
- $content = view('home', $lang, compact('username'));
Créez le dossier avatars à la racine du site :
- /cms/site17
- avatars
IMPORTANT : Apache doit pouvoir lire et écrire des fichiers dans ce dossier. Vérifiez les droits d'accès sur le répertoire.
$ chgrp www-data avatars
$ chmod 775 avatars
Entrez http://localhost/cms/site17/avatar/foobar/40 dans la barre d'adresse de votre navigateur.
Sauvez l'image dans le fichier foobar.png dans le dossier avatars.
Identifiez-vous en tant que foobar
avec le mot de passe f00bar
.
Vérifiez que l'avatar est bien affiché sur la page d'accueil.
Commentaires