Existe-t-il nativement sur SPIP une solution pour prévenir un utilisateur connecté que sa session est expirée, sans qu’il ait besoin de charger une page (donc en AJAX) ? Idéalement, quand la session de l’utilisateur est expirée, le système lui propose de ressaisir ses identifiants dans une boite de dialogue et lui réaffiche ensuite la page sur laquelle il était, pour éviter de lui faire perdre d’éventuelles informations saisies dans des champs de formulaire.
Sauf erreur, ça ne couvrirait pas le cas où l’utilisateur ouvre une session, commence à compléter un formulaire, laisse sa session expirer/fenêtre ouverte, puis enregistre le formulaire alors que son compte est déconnecté. La date d’expiration de la session ne peut pas être rallongée puisque l’utilisateur est déjà déconnecté. Dans ce cas précis, soit les informations que l’utilisateur avait saisi sont perdues (cas très frustrant pour l’utilisateur), soit les informations sont soumises mais non rattachées à son id_auteur (cas très frustrant pour le webmestre).
Sauf erreur, ça ne couvrirait pas le cas où l’utilisateur ouvre une
session, commence à compléter un formulaire, laisse sa session
expirer/fenêtre ouverte, puis enregistre le formulaire alors que son compte
est déconnecté.
tu veux dire … laisse sa fenêtre ouverte durant au moins deux jours ?
La date d’expiration de la session ne peut pas être rallongée puisque
l’utilisateur est déjà déconnecté. Dans ce cas précis, soit les
informations que l’utilisateur avait saisi sont perdues (cas très frustrant
pour l’utilisateur), soit les informations sont soumises mais non
rattachées à son id_auteur (cas très frustrant pour le webmestre).
pas forcément, on pourrait très bien repêcher la session au moment du POST,
à condition qu'elle ne soit pas déjà passée par le garbage collector.
tu veux dire … laisse sa fenêtre ouverte durant au moins deux jours ?
Oui, exactement, en ayant probablement mis sa machine en veille entre temps.
pas forcément, on pourrait très bien repêcher la session au moment du POST, à condition qu’elle ne soit pas déjà passée par le garbage collector.
Je ne maitrise pas suffisamment SPIP pour voir comment faire ça. Mais si ça permet d’atteindre le même objectif (pas de perte d’info pour l’utilisateur, et pas de mauvaise surprise pour le webmestre), pourquoi pas !
Pour information, je suis parvenu à ce que je voulais, à savoir afficher un message d’expiration de session, et déconnecter automatiquement l’utilisateur si celui-ci ne clique pas sur le bouton « Rester connecté ». Son mon installation SPIP 3.1.2 (SPIPr, framework Z + Bootstrap 3), ça se fait en 3 étapes :
J’ai réglé une expiration à 1h (3600000 millisecondes), soit largement inférieur à la durée de session par défaut de SPIP, et la déconnexion automatique à 10 secondes une fois que le message s’affiche. J’ai du bricoler un peu pour que l’url logout fonctionne correctement (la balise #URL_LOGOUT ne fonctionnait pas dans ce cas). Le message d’intègre parfaitement dans un thème bootstrap (syntaxe modal bootstrap 3). Ce script ne se charge que pour les utilisateurs connectés sur la partie publique du site. Les utilisateurs/admin connectés sur la partie privée ne sont pas concernés.
bonjour, et merci pour le tuto
je teste avec la même installation il me semble z-core, spip-r, que ce soit bootstrap ou bootstrap3
j’obtiens Twitter Bootstrap 3 was not found! Please load the proper libraries and their themes to utilize this plugin!
bonne journée
Au cas ou ça puisse aider,
voici un filtre que j’ai créé pour se déconnecter, vider le panier, la session et les cookies liés
<?php
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* SPIP action/supprimer_connexion.php
*
* Anne-lise Martenot
*
* effacer le panier, le cookie et la session du visiteur
*
* Usage dans un squelette
*
* [(#BOUTON_ACTION{<:icone_deconnecter:>,#URL_ACTION_AUTEUR{supprimer_connexion,#SELF,ajax}})]
*
*
**/
function action_supprimer_connexion_dist(){
include_spip('inc/paniers');
// Si on trouve un panier pour le visiteur actuel
if ($id_panier = paniers_id_panier_encours()){
$supprimer_panier_encours = charger_fonction('supprimer_panier', 'action/');
$supprimer_panier_encours($id_panier);
}
include_spip('inc/session');
include_spip('inc/cookie');
$nom_cookie = $GLOBALS['cookie_prefix'].'_panier';
//on efface toute la session avec une valeur numérique ainsi que les cookies
if (isset($_COOKIE['spip_session'])) {
$session = charger_fonction('session', 'inc');
$session($GLOBALS['visiteur_session']['id_auteur']);
spip_setcookie('spip_session', $_COOKIE['spip_session'], time()-3600);
spip_setcookie($nom_cookie, $_COOKIE[$nom_cookie], time()-3600);
}
}
C’est le but de l’étape 1 du tuto qui permet depasser outre la vérification debootstrap3 dans le script usertimeout. Je n’ai pas regardé en détail pourquoi cette vérification échoue sur spip avec le plugin bootstrap 3.