API day : TYPO3 et les variables SESSIONS

L’API TYPO3 regroupe un nombre impressionnant de fonctionnalités dont certaines ne sont pas très connues.
Voici, par exemple, la gestion des variables sessions dans les plugins Frontend ainsi que les modules Backend, avec le CMS TYPO3.

Différents types de variables sessions

En premier lieu, il existe plusieurs types de variables sessions pour les plugins Frontend :

- les variables « session »

- les variables « utilisateur »

Les variables de type « session » ont un fonctionnement identique aux variables sessions de PHP, c’est à dire qu’elles suivent l’utilisateur pendant toute sa navigation.
Elles sont supprimées lorsque l’internaute quitte le site ou après une longue période d’inactivité.

Les variables de type « utilisateur » sont liées à l’utilisateur frontend connecté (le fe_user). Elles sont stockées de manière permanente dans la table des utilisateurs frontend du site et elles sont accessibles dès que l’utilisateur est identifié sur le site. Cela permet par exemple de se rappeler des préférences de navigation d’un utilisateur après son identification.
Ces variables ne sont pas supprimées, par contre elles ne peuvent pas être utilisées pour gérer des variables pour les utilisateurs non identifiés.

On trouve des informations sur la gestion des sessions sur le Wiki :
TYPO3 Extension Developers Guide : Using sessions

Différents types de données

Il est possible de stocker n’importe quel type de données dans les variables sessions.
Les variables sont automatiquement « désérialisées »  lors de l’initialisation des sessions par le framework TYPO3.
Elles sont automatiquement « sérialisées » lors de l’enregistrement des variables dans la session (via la fonction storeSessionData(…) ).
Cela permet de stocker des tableaux comme des variables simples (du texte ou des valeurs numériques).

PHP – l’affectation d’une variable de session

Exemple de code PHP qui permet l’affectation et la prise en compte des variables sessions depuis un plugin Frontend.

//preparation des données à mettre en session
$tabSession=array();
$tabSession['texte']='joh';
$tabSession['numerique']=316;

//préparation du nom de la variable dans la session
$nomVariableSession='tx_monext_pi1';

//on utilise ici la clé "ses" pour affecter
//une variable session qui ne nécessite pas d'identification
$GLOBALS["TSFE"]->fe_user->setKey('ses', $nomVariableSession, $tabSession);

//on valide toutes les variables dans la session
//cette fonction est normalement appelée automatiquement par le framework
//à la fin de la génération de la page.
//mais si on coupe le processus avant la fin (redirection php par exemple)
//il faut valider les sessions.
$GLOBALS['TSFE']->fe_user->storeSessionData();

Raccourci pour l’affectation d’une variable de session

La fonction précédente permet d’enregistrer les données à différents endroits (temporaire en session ou permanente dans le compte de l’utilisateur connecté).
Il existe une fonction plus courte permettant d’enregistrer uniquement dans la session : setAndSaveSessionData()

//ici on n'a pas besoin de spécifier le type de stockage, c'est obligatoirement en session
//les autres paramètres sont inchangés par rapport à la fonction précédente
$GLOBALS["TSFE"]->fe_user->setAndSaveSessionData($nomVariableSession, $tabSession);
// une autre différence est qu'il n'est plus nécessaire d'appeler la fonction "storeSessionData"
//la validation de la session est réalisée automatiquement par la fonction "setAndSaveSessionData"

PHP – la récupération d’une variable de session

Exemple de code PHP qui permet la récupération des variables sessions depuis un plugin Frontend.

//préparation du nom de la variable dans la session
$nomVariableSession='tx_monext_pi1';

//on utilise ici la clé "ses" pour récupérer
//une variable session qui ne nécessite pas d'identification
$tabDonneSession=$GLOBALS["TSFE"]->fe_user->getKey('ses', $nomVariableSession);

//la variable $tabDonneSession contient maintenant
//les informations stockées dans la session du visiteur
//on utilise la fonction devlog pour debugger les donnees et eviter l'affichage coté internaute (pas de print_r)
t3lib_div::devLog('debug données de session', 'tx_monextension', 0, $tabDonneSession);
//ou sinon
print_r($tabDonneSession);

Raccourci pour la récupération d’une variable de session

Il existe une fonction plus courte permettant de récupérer les variables depuis la session : getSessionData()
Elle est identique à la fonction « getKey », sauf qu’il n ‘est pas nécessaire de préciser le type de variable (session ou utilisateur).

//ici on n'a pas besoin de spécifier le type de stockage, c'est obligatoirement en session
$tabDonneSession=$GLOBALS["TSFE"]->fe_user->getSessionData($nomVariableSession);

Et en Backoffice, me direz vous…

Il existe des mécanismes équivalent en backoffice, à savoir, les variables « sessions » et les variables « utilisateurs ».

Comme pour le coté Frontend, il existe plusieurs types de variables sessions pour les plugins Backend:

- les variables « session »

- les variables « utilisateur » (qui restent actives même après une déconnexion puis reconnexion)

Le wiki de TYPO3 fait référence à ces éléments : http://wiki.typo3.org/Extension_Developers_Guide#Backend_2

PHP – gestion des sessions en Backoffice

Cette gestion s’effectue avec les fonctions raccourcies, mais sur l’objet « BE_USER ».
Pour rappel, ces variables « session » ne sont pas conservées après une déconnexion.

//préparation des données à mettre en session
$tabSession=array();
$tabSession['texte']='joh';
$tabSession['numerique']=316;

//préparation du nom de la variable dans la session
$nomVariableSession='tx_monext_pi1';
//ici on n'a pas besoin de spécifier le type de stockage, c'est obligatoirement en session
//les autres paramètres sont inchangés par rapport à la fonction précédente
$GLOBALS['BE_USER']->setAndSaveSessionData($nomVariableSession, $tabSession);

//récupération des données
$tabDonneSession= $GLOBALS['BE_USER']->getSessionData($nomVariableSession);

PHP – gestion des données « utilisateur » en Backoffice

Les données utilisateurs sont regroupées dans le tableau $GLOBALS['BE_USER']->uc qui est chargé automatiquement par TYPO3.
Pour rappel, ces variables « utilisateur » sont conservées après une déconnexion/reconnexion.

Pour ajouter/modifier une donnée, il faut modifier ce tableau puis forcer l’enregistrement des données.

//préparation des données à affecter à l'utilisateur
$tabSession=array();
$tabSession['texte']='joh';
$tabSession['numerique']=316;

//préparation du nom de la variable dans la session
$nomVariableSession='tx_monext_pi1';
//ici on n'a pas besoin de spécifier le type de stockage, c'est obligatoirement en session
//les autres paramètres sont inchangés par rapport à la fonction précédente
$GLOBALS['BE_USER']->uc[$nomVariableSession]= $tabSession;
//on appel une fonction spéciale chargée de regrouper les données issues de plusieurs sources (ex tsconfig)
$GLOBALS['BE_USER']->overrideUC();
//on force l'écriture des données dans la base
$GLOBALS['BE_USER']->writeUC();

//récupération des données
//on fait simplement appel au tableau $GLOBALS['BE_USER']->uc qui est chargé automatiquement
$tabDonneSession= $GLOBALS['BE_USER']->uc[$nomVariableSession];

Conclusion

En utilisant ces fonctions il est possible de mettre en place tous les mécanismes liés aux sessions comme :

  • le développement de panier de commande
  • le stockage de préférences utilisateur
  • l’analyse de la navigation
  • etc….

Changelog de cet article :
16 avril 2012 : Publication d’origine
19 décembre 20113 : ajout d’informations sur les sessions en Backoffice

un commentaire
  1. OlivierSC dit :

    Article mis à jour pour présenter la gestion des sessions dans les développements en backoffice :)

Laisser une réponse