web-dev-qa-db-fra.com

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

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?

20
vitaly.batonov

Parce que drupal enregistrer la session 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.

4
Yusef

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.

2
Mołot

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.

2
Jeremy French

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 de session a besoin d'un enregistrement avec id = 0, vous pouvez insérer manuellement un enregistrement avec id = 0.

1
Tony Mao

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

0
sqzaman