Comment enregistrer les données de session pour les utilisateurs anonymes?

20

Dans mon dernier projet pour Drupal 6, j'ai enregistré les données en utilisant un code similaire au suivant:

$_SESSION['xxx'] = serialize($data);

Dans Drupal 7, cela ne fonctionne pas.

Comment dois-je enregistrer les données de session pour les utilisateurs anonymes, dans Drupal 7?

vitaly.batonov
la source

Réponses:

4

Parce que la session de sauvegarde drupal avec la clé, cela signifie que vous devriez faire quelque chose comme

  $_SESSION['yourkey']['xxx'] = serialize($data);

Vous pouvez essayer ça.

function lists_session($key, $value = NULL) {
  global $user;

  static $storage;

  // If the user is anonymous, force a session start.
  if(!user->uid) {
    drupal_session_start();
  }

  if ($value) {
    $storage[$key] = $value;
    $_SESSION['lists'][$key] = $value;   // I use 'lists' in case some other module uses 'type' in $_SESSION
  }
  else if (empty($storage[$key]) && isset($_SESSION['lists'][$key])) {
    $storage[$key] = $_SESSION['lists'][$key];
  }
  return $storage[$key];
}

Donc, pour enregistrer une variable dans Session:

lists_session("xxx", serialize($data));

Et pour récupérer la valeur, utilisez simplement:

$myVar = lists_session("xxx");

et comme MOLOT mentionne parfois que la session n'est pas démarrée pour les utilisateurs anonymes, vous devez drupal_session_start()manuellement.

Yusef
la source
2

Selon les documents , c'est tout ce que vous devez faire.

Ce qui signifie qu'il y a soit un bug, soit que vos pages sont mises en cache pour les non-utilisateurs afin que les données de session ne soient pas lues. Je vérifierais vos paramètres de mise en cache dans un premier temps.

Jeremy French
la source
Merci. C'est peut-être un bug. mais jusqu'à ce que je décide de l'utiliser session_api
vitaly.batonov
@ vitaly.batonov pouvez-vous expliquer comment vous avez utilisé session_api pour résoudre votre problème?
lathomas64
2

Drupal 7 ne démarre parfois pas automatiquement les sessions pour les utilisateurs anonymes. Pour utiliser des sessions pour eux, vous devrez peut-être forcer la session démarrée avec drupal_session_start pour pouvoir utiliser $_SESSION.

Mołot
la source
1
Existe-t-il un moyen de dire à Drupal, TOUJOURS démarrer une session pour les utilisateurs anonymes?
1

Après avoir enregistré les données en suivant:

$_SESSION['xxx'] = serialize($data);

Besoin d'une autre fonction:

drupal_session_start();

Étant donné que la table Session a besoin d'un enregistrement avec id = 0, vous pouvez insérer manuellement un enregistrement avec id = 0.

Tony Mao
la source
0

créer un utilisateur avec uid = 0 dans la table des utilisateurs car drupal utilise toujours cet uid pour les utilisateurs anonymes

sqzaman
la source