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.

user2097091
la source
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

Bakual
la source
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

Valentin Despa
la source
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);
Lodder
la source
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