Exemple d'implémentation : Un espace privé

Un article de ReaxiaWiki.

Dans cet exemple, apprenons à utiliser les fonctionnalités de Reaxia pour ajouter un espace privé à un site, accessible grâce à un identifiant et un mot de passe.

Sommaire

Création du type Reaxia

Notre liste de membres est un contenu structuré, qui s'appellera "Membres". Elle peut être représentée par les champs du tableau suivant :

Information Type de champ
Identifiant Identifiant
Mot de passe Mot de passe
Nom Texte sur une ligne
Prénom Texte sur une ligne
Adresse e-mail Texte sur une ligne
Champs
Agrandir
Champs

En général, les contenus structurés sont enregistrés dans deux tables : la table de prévisualisation et la table finale. Dans le cas d'une liste de membres, nous allons utiliser uniquement une table pour ne pas avoir à publier les données à chaque fois qu'un nouveau membre s'inscrit. Il faut donc cocher "Ce contenu est directement en ligne".

Propriétés du type
Agrandir
Propriétés du type

Ajout d'un contenu

Après avoir créé le type, il faut ajouter au site un contenu dont le type est "Membres". Dans les Outils d'Administration, cliquez sur "Gérer la structure du site, ajouter un contenu au site".

Sélectionnez le type "Membres" dans la liste déroulante en haut de la page, et cliquez sur Ajouter.

Mise en place du mot-clé

A présent, il faut ajouter le mot-clé [[FORMULAIRE_IDENTIFICATION]] dans un champ paragraphe d'un contenu structuré :

Mot-clé
Agrandir
Mot-clé

Pour que le contributeur ait une description de ce mot-clé dans la liste des mots-clés, il faut ajouter une ligne dans le fichier reaxia_conf/Reaxia_Conf.php :

$GLOBALS['conf']['keywords']['FORMULAIRE_IDENTIFICATION'] = "Affiche le formulaire
d'identification pour l'accès à l'espace membre";

Interprétation du mot-clé

Le code suivant est à ajouter dans la librairie traitant l'affichage des pages du site. Selon les données de $_POST et de $_SESSION, ce code remplace le mot-clé et effectue différentes actions :

  • si le login et le password ont été postés, il tente de créer une session en appelant la librairie 'login_membre' (voir paragraphe suivant),
  • si la session est en cours, il affiche le login,
  • dans les autres cas, il affiche le formulaire d'identification.
$textBefore = '';
$textAfter = '';
if (FindKeyword($Texte_de_la_page, '[[FORMULAIRE_IDENTIFICATION]]', $textBefore, $textAfter))
{
  $Texte_de_la_page = $textBefore;
  if (isset($_POST['membre_login']) && isset($_POST['membre_password']))
  {
    // create session
    display_thread('membres', 'login_membre', array(
        'login' => stripslashes($_POST['membre_login']),
        'password' => stripslashes($_POST['membre_password']),
        'return' => true));
  }
  if (isset($_SESSION['membre_login']))
  {
    // login info
    $Texte_de_la_page .= "Vous êtes identifié(e) : <b>".$_SESSION['membre_login']."</b>";
  }
  else
  {
    // form
    $Texte_de_la_page .= GetFormLoginStudent();
  }
  $Texte_de_la_page .= $textAfter;
}

/**
 * Get HTML for the identification form
 * @return string HTML code
 */
function GetFormLoginStudent()
{
  $html = '';
  
  if (isset($_POST['membre_login']))
  {
    $login = trim(EpiTools::stripslashes($_POST['membre_login']));
    $html .= '<span style="color: red;">Erreur : identifiant ou mot de passe incorrect.</span>';
  }
  else
    $login = '';
  
  $html .= '<form action="index.php?page='.$_GET['page'].'" method="POST">' . "\n";
  $html .= '<table width="250">' . "\n";
  
  $html .= '<tr>' . "\n";
  $html .= '<td width="100">Identifiant :</td>' . "\n";
  $html .= '<td width="150"><input type="text" name="membre_login"'.
      ' value="'.$login.'" style="width: 100%;"></td>' . "\n";
  $html .= '</tr>' . "\n";
  
  $html .= '<tr>' . "\n";
  $html .= '<td width="100" nowrap>Mot de passe :</td>' . "\n";
  $html .= '<td width="150"><input type="password" name="membre_password"'.
      ' style="width: 100%;"></td>' . "\n";
  $html .= '</tr>' . "\n";
  
  $html .= '<tr>' . "\n";
  $html .= '<td colspan="2" align="right">'.
      '<input type="submit" value="S\'identifier"></td>' . "\n";
  $html .= '</tr>' . "\n";
  $html .= '</table>' . "\n";
  $html .= '</form>' . "\n";
  
  return $html;
}

Librairie d'identification

Pour savoir si un internaute est dans notre liste de membres, nous allons créer une librairie qui sera chargée de faire la requête dans la base puis de créer une session PHP en cas d'identification réussie. Voici le code de cette librairie, à placer dans le fichier reaxia_lib/login_membre/login_membre.php :

<?php
class login_membre extends thread_displayer
{
  /**
   * @param array $thread array with threadname, display_name, categories, PublishedTime
   * @param array $options
   */
  function login_membre ($threadname, &$options)
  {
    // Call the parent's constructor, initializes the class members
    $this->thread_displayer($threadname, $options);
    
    // Override any of thread_displayer's class members here:
    $this->UsePreviewData = true;
  }

  /**
   * Specify the SQL query who returns blocs
   * @return string the SQL statement that fetches the data
   */
  function GetSQLQuery()
  {
    if ($this->UsePreviewData)
      $rxp = '_rxp';
    else
      $rxp = '';
    
    $sql = 'SELECT single_line_1, single_line_2 FROM `' . $this->threadRef . $rxp . '`';
    $sql .= " WHERE login_1 = '".mysql_escape_string($this->options['login'])."'".
            " AND password_1 = '".mysql_escape_string($this->options['password'])."'";

    // Si vous souhaitez crypter les mots de passe dans la base, 
    // vous pouvez utiliser la requète suivante à la place :
    //     $sql = 'SELECT single_line_1, single_line_2 FROM `' . $this->threadRef . $rxp . '`';
    //     $sql .= " WHERE login_1 = '".mysql_escape_string($this->options['login'])."'".
    //             " AND (password_1 = '".mysql_escape_string($this->options['password'])."'";
    //             "   OR password_1 = '".mysql_escape_string(md5($this->options['password']))."')";

    $sql .= ' LIMIT 1';
    
    return $sql;
  }

  /**
   * Does whatever needs to be done with the selected blocs
   * @return string usually an HTML fragment, but it can be nothing.
   */
  function process_thread_content()
  {
    $html = '';
    
    if (!empty($this->Blocs))
    {
      $Nom = $this->Blocs[0]['single_line_1'];
      $Prenom = $this->Blocs[0]['single_line_2'];
      
      $_SESSION['membre_login'] = $Prenom.' '.$Nom;
    }
    
    return $html;
  }
}
?>

Si la requête trouve un résultat pour l'identifiant et le mot de passe à tester, la librairie ajoute le nom et le prénom du membre dans $_SESSION['membre_login']. Ainsi, il sera possible d'afficher les informations de connexion sur la page.

Lors de l'appel à cette librairie, il faut fournir login et password en paramètres :

<?php
  include_once('reaxia_lib/reaxia.php');
  display_thread('membres', 'login_membre', array(
      'login' => stripslashes($_POST['membre_login']),
      'password' => stripslashes($_POST['membre_password'])));
?>

Pour se déconnecter, il suffit d'effacer les données en session :

<?php
  unset($_SESSION['membre_login']);
?>

Formulaire d'inscription

Pour créer un formulaire d'inscription, voir le chapitre sur les formulaires.