Quelle est la bonne façon de définir un cookie persistant dans Joomla 3.x


8

Je souhaite définir un cookie "de destination" pour tous les utilisateurs de mon site, afin de proposer un contenu personnalisé. Le cookie doit persister pendant la connexion / déconnexion, il semble donc que je ne puisse pas utiliser jSession, qui est effacé lors de la connexion / déconnexion.

Je peux en quelque sorte y parvenir à l'ancienne

setcookie( "destinationcookie", $_POST['destination'], strtotime( '+90 days' ) );
$destination =  isset($_POST['destination']) ? $_POST['destination'] : $_COOKIE["destinationcookie"];

... mais je suis sûr que joomla a une meilleure façon de se cacher quelque part. PS - la documentation à ce sujet est pratiquement inexistante pour autant que je puisse trouver.


JSession a besoin d'un cookie pour reconnaître une session, mais ce n'est pas la même chose.
Valentin Despa

Réponses:


5

Vous voudrez peut-être jeter un œil au plugin d'authentification des cookies. Il définit et lit un cookie persistant.

Il se trouve ici: https://github.com/joomla/joomla-cms/tree/staging/plugins/authentication/cookie

Pour lire un cookie, vous pouvez utiliser

$app = JFactory::getApplication();
$cookieValue = $app->input->cookie->get($cookieName);

Pour définir un cookie, vous utilisez

$app = JFactory::getApplication();
$app->input->cookie->set($cookieName, $cookieValue, time() + $lifetime, $app->get('cookie_path', '/'), $app->get('cookie_domain'), $app->isSSLConnection());

Une documentation peut être trouvée sur la page API: http://api.joomla.org/cms-3/classes/JInputCookie.html


Merci. essayer de comprendre cela. La documentation est largement indéchiffrable pour les novices comme moi. Pourriez-vous éventuellement me montrer comment le cookie défini s'applique spécifiquement dans mon cas? comment définir la durée de vie et à quoi sert la référence ssl?
user2097091

Dans ce cas, $lifetimeprovient d'un paramètre du plugin cookie. L'argument est le moment où le cookie expirera. Vous passez juste votre propre valeur là-bas. L'argument SSL indique si le cookie ne sera valide que sur les connexions SSL. Dans ce cas, il regarde simplement si la page est accessible en utilisant SSL et définit le drapeau sécurisé dans le cookie en conséquence.
Bakual

2

La dernière fois que j'ai fait des recherches dans ce domaine (mars 2013), j'ai trouvé cette solution, qui n'utilise pas JInput:

J'ai vérifié comment JFactory appelle JSession mais je n'ai pas trouvé de moyen de définir l'expiration lors du stockage des données.

À l'intérieur d'un plugin système, en utilisant la méthode onAfterRender()

    $cookie = session_get_cookie_params();

    $cookie['lifetime'] = DESIRED LIFETIME;

    session_set_cookie_params($cookie['lifetime'], $cookie['path'], $cookie['domain'], $cookie['secure'], true);

Le seul tirage au sort que j'ai trouvé était qu'il y a maintenant deux cookies avec un nom et un contenu identiques. Je n'ai remarqué aucun effet secondaire.

J'espère que cela t'aides.

Source: Joomla! Développement général ›Définir l'expiration de la session utilisateur front-end


2

Essayez d'utiliser quelque chose comme ce qui suit:

$input  = JFactory::getApplication()->input;
$cookie = $input->cookie;
$post = $input->post;

$cookie->set('destinationcookie', $post->get('destination'), strtotime( '+90 days' ));
$destination =  isset($post->get('destination')) ? $post->get('destination') : $cookie->get($name = 'destinationcookie', $defaultValue = null);

Erreur fatale: impossible d'utiliser la valeur de retour de la méthode dans le contexte d'écriture dans /path/to/templates/template/html/com_entrusters/itemform/default.php sur la ligne 28
user2097091

@ user2097091 - J'ai accidentellement ajouté un point-virgule supplémentaire. Mise à jour du code. Pouvez-vous réessayer maintenant?
Lodder

Vous utilisez la variable $inputCookieque vous n'avez pas définie - ne devrait-il pas en être ainsi $cookie?
MrWhite

@ w3d - ahh oui ma mauvaise. Mise à jour du code. Merci de l'avoir signalé
Lodder
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.