web-dev-qa-db-fra.com

Stockage d'informations utilisateur anonymes dans un cookie

Je souhaite stocker le code postal d'un utilisateur, s'il l'utilise pour une recherche de proximité dans un cookie. Cependant, je ne sais pas où ni comment commencer à implémenter cela.

Comment puis-je stocker des informations d'utilisateur anonyme sur un cookie?

5
Adam S

Depuis Drupal 7, il existe deux fonctions pour stocker des données dans un cookie: ser_cookie_save () , et ser_cookie_delete () . Malgré la fonction noms, les fonctions fonctionnent également pour les utilisateurs anonymes, car ils n'obtiennent pas d'informations de l'objet $user ou des informations liées à l'ID utilisateur.

comment_form_submit () utilise user_cookie_save() dans les lignes de code suivantes:

if (user_is_anonymous()) {
  user_cookie_save(array_intersect_key($form_state['values'], array_flip(array('name', 'mail', 'homepage'))));
}

Si vous utilisez une version de Drupal qui ne définit pas ces fonctions, vous pouvez implémenter des fonctions similaires dans un module que vous utilisez.

function mymodule_cookie_save(array $values) {
  foreach ($values as $field => $value) {
    // Set cookie for 365 days.
    setrawcookie('Drupal.visitor.' . $field, rawurlencode($value), REQUEST_TIME + 31536000, '/');
  }
}

function mymodule_cookie_delete($cookie_name) {
  setrawcookie('Drupal.visitor.' . $cookie_name, '', REQUEST_TIME - 3600, '/');
}

Gardez à l'esprit que setrawcookie () est uniquement disponible dans PHP 5. Si vous développez un module qui pourrait être utilisé avec PHP = 4, alors vous devez utiliser setcookie () , et le code des fonctions doit être modifié en conséquence: le paramètre doit être déclaré comme $values (Pas array $values ), et l'appel à rawurlencode () doit être supprimé car les cookies sont déjà encodés en URL à partir de setcookie().

10
kiamlaluno

La configuration des cookies dans Drupal n'est pas différente de la façon dont vous le feriez avec un autre site PHP:

setcookie est la fonction que PHP fournit pour cela. Il y a aussi le $_COOKIE variable super globale à utiliser.

Exemple de code:

$cookieval = 'my cookie value';
if ($_COOKIE['my_cookie_key'] != $cookie_val) {
 setcookie('my_cookie_key', $cookie_val);
}
3
googletorp

Si vous avez Drupal installé dans le sous-dossier afin que l'URL racine de votre site ait la forme www.mydomain.com/mysite, vous devriez probablement utiliser base_path () au lieu de '/' lors de la configuration du cookie.

Les fonctions dans la réponse de kiamlaluno seraient alors:

function mymodule_cookie_save(array $values) {
  foreach ($values as $field => $value) {
  // Set cookie for 365 days.
  setrawcookie('Drupal.visitor.' . $field, rawurlencode($value), REQUEST_TIME + 31536000, base_path());
  }
}

function mymodule_cookie_delete($cookie_name) {
  setrawcookie('Drupal.visitor.' . $cookie_name, '', REQUEST_TIME - 3600, base_path());
}
0
jiv-e