26

Associer un utilisateur à un avatar

Créez site17 en copiant site16.

  1. /cms
    1. ...
    2. site16
    3. 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 :

  1. /cms/site17
    1. actions
      1. avatar.php
  1. require_once 'identicon.php';
  2.  
  3. function avatar($lang, $arglist=false) {
  4.     $name=false;
  5.     $size=128;
  6.  
  7.     if ($arglist) {
  8.         if (isset($arglist[0])) {
  9.             $name = $arglist[0];
  10.         }
  11.         else if (isset($arglist['name'])) {
  12.             $name = $arglist['name'];
  13.         }
  14.         if (isset($arglist[1])) {
  15.             $size = $arglist[1];
  16.         }
  17.         else if (isset($arglist['size'])) {
  18.             $size = $arglist['size'];
  19.         }
  20.     }
  21.  
  22.     if (!$name or !$size or !is_numeric($size) or $size < 16 or $size > 128) {
  23.         return run('error/badrequest', $lang);
  24.     }
  25.  
  26.     $img = identicon($name, $size);
  27.  
  28.     header('Content-Type: image/png');
  29.     header("Content-Disposition: inline; filename=$name");
  30.  
  31.     imagepng($img);
  32.     imagedestroy($img);
  33.  
  34.     return false;
  35. }

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 :

  1.         'avatar'                => 'avatar',

Ajoutez le fichier identicon.php dans le dossier library avec le contenu suivant :

  1. /cms/site17
    1. library
      1. identicon.php

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 :

  1.     $action=$args=$params=false;

Initialise le nom de l'action, la liste des arguments et la liste des paramètres.

  1.             if ($query) {
  2.                 $params = array();
  3.                 foreach (explode('&', $query) as $q) {
  4.                     $p = explode('=', $q);
  5.                     if (count($p) == 2) {
  6.                         list($key, $value) = $p;
  7.                         if ($key) {
  8.                             $params[$key]=urldecode($value);
  9.                         }
  10.                     }
  11.                 }
  12.             }

Fabrique la liste des paramètres lus après le ? dans une URL.

  1.     $arglist = $args ? $params ? array_merge($args, $params) : $args : $params;
  2.  
  3.     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.

  1. function run($action, $lang=false, $arglist=false) {

run a 3 arguments : le nom de l'action, la langue et une liste de paramètres.

  1.     $farg = array();
  2.     if ($lang) {
  3.         $farg[] = $lang;
  4.     }
  5.     if ($arglist) {
  6.         $farg[] = $arglist;
  7.     }
  8.  
  9.     $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 :

  1. function serviceunavailable($lang, $arglist=false) {
  2.     $closing_time=$arglist[0];
  3.     $opening_time=$arglist[1];

Ajoutez l'affichage de l'avatar dans la page d'accueil :

  1. <?php if (!empty($username)): ?>
  2. <p class="right"><img src="<?php echo $base_path; ?>/avatars/<?php echo $username; ?>.png" title="<?php echo $username; ?>" /></p>
  3. <?php endif; ?>
  1. <?php if (!empty($username)): ?>
  2. <p class="right"><img src="<?php echo $base_path; ?>/avatars/<?php echo $username; ?>.png" title="<?php echo $username; ?>" /></p>
  3. <?php endif; ?>

Passez la variable $username à la vue dans l'action home :

  1.     $username = isset($_SESSION['user']) ? $_SESSION['user']['name'] : false;
  2.  
  3.     $content = view('home', $lang, compact('username'));

Créez le dossier avatars à la racine du site :

  1. /cms/site17
    1. 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

Votre commentaire :
[p] [b] [i] [u] [s] [quote] [pre] [br] [code] [url] [email] strip aide 2000

Entrez un maximum de 2000 caractères.
Améliorez la présentation de votre texte avec les balises de formatage suivantes :
[p]paragraphe[/p], [b]gras[/b], [i]italique[/i], [u]souligné[/u], [s]barré[/s], [quote]citation[/quote], [pre]tel quel[/pre], [br]à la ligne,
[url]http://www.izend.org[/url], [url=http://www.izend.org]site[/url], [email]izend@izend.org[/email], [email=izend@izend.org]izend[/email],
[code]commande[/code], [code=langage]code source en c, java, php, html, javascript, xml, css, sql, bash, dos, make, etc.[/code].