¿Cuál es la forma correcta de configurar una cookie persistente en Joomla 3.x

8

Me gustaría establecer una cookie de "destino" para todos los usuarios en mi sitio, para servir contenido personalizado. La cookie debe persistir durante el inicio de sesión / cierre de sesión, por lo que parece que no puedo usar jSession, que se borra al iniciar sesión / cerrar sesión.

Puedo lograr esto a la antigua usanza

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

... pero estoy seguro de que Joomla tiene una mejor manera escondida en alguna parte. PD: la documentación sobre esto es prácticamente inexistente hasta donde puedo encontrar.

usuario2097091
fuente
JSession necesita una cookie para reconocer una sesión, pero no son lo mismo.
Valentin Despa

Respuestas:

5

Es posible que desee echar un vistazo al complemento de autenticación de cookies. Establece y lee una cookie persistente.

Se encuentra aquí: https://github.com/joomla/joomla-cms/tree/staging/plugins/authentication/cookie

Para leer una cookie, puede usar

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

Para configurar una cookie, usa

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

Puede encontrar documentación en la página de la API: http://api.joomla.org/cms-3/classes/JInputCookie.html

Bakual
fuente
Gracias. tratando de entender esto La documentación es indescifrable para principiantes como yo. ¿Podría mostrarme cómo se aplica la cookie establecida específicamente en mi caso? ¿Cómo configuro el tiempo de vida y para qué es la referencia de SSL?
user2097091
En este caso, $lifetimeproviene de un parámetro en el complemento de cookies. El argumento es el momento en que la cookie caducará. Simplemente pasa su propio valor allí. El argumento SSL dice si la cookie solo será válida a través de conexiones SSL. En este caso, solo se ve si se accede a la página utilizando SSL y establece el indicador de seguridad en la cookie en consecuencia.
Bakual
2

La última vez que investigué un poco sobre esta área (marzo de 2013), encontré esta solución, que no usa JInput:

He inspeccionado cómo JFactory llama a JSession pero no he encontrado una manera de establecer la caducidad al almacenar datos.

Dentro de un complemento del sistema, utilizando el método onAfterRender()

    $cookie = session_get_cookie_params();

    $cookie['lifetime'] = DESIRED LIFETIME;

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

El único inconveniente que encontré fue que ahora hay dos cookies con el mismo nombre y contenido. No he notado ningún efecto secundario.

Espero que esto ayude.

Fuente: Joomla! Desarrollo general ›Establecer la caducidad de la sesión de usuario front-end

Valentin Despa
fuente
2

Intenta usar algo como lo siguiente:

$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
fuente
Error grave: no se puede usar el valor de retorno del método en el contexto de escritura en /path/to/templates/template/html/com_entrusters/itemform/default.php en la línea 28
user2097091
@ user2097091 - Agregué accidentalmente un punto y coma extra. Se actualizó el código. ¿Puedes intentarlo de nuevo ahora?
Lodder
Está utilizando la variable $inputCookieque no ha definido, ¿no debería ser así $cookie?
MrWhite
@ w3d - ahh, sí, mi mal. Se actualizó el código. Gracias por señalarlo
Lodder