Qual é a maneira correta de definir um cookie persistente no Joomla 3.x

8

Gostaria de definir um cookie de "destino" para todos os usuários do meu site, para veicular conteúdo personalizado. O cookie precisa persistir durante o login / logout, de modo que parece que não posso usar o jSession, que é limpo no login / logout.

Eu posso meio que conseguir isso da maneira antiquada

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

... mas tenho certeza que o joomla tem uma maneira melhor de esconder em algum lugar. PS - a documentação sobre isso é praticamente inexistente, tanto quanto eu posso encontrar.

user2097091
fonte
O JSession precisa de um cookie para reconhecer uma sessão, mas eles não são a mesma coisa.
Valentin Despa

Respostas:

5

Você pode dar uma olhada no plugin de autenticação de cookies. Ele define e lê um cookie persistente.

Pode ser encontrada aqui: https://github.com/joomla/joomla-cms/tree/staging/plugins/authentication/cookie

Para ler um cookie, você pode usar

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

Para definir um cookie, você usa

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

Alguma documentação pode ser encontrada na página da API: http://api.joomla.org/cms-3/classes/JInputCookie.html

Bakual
fonte
Obrigado. tentando entender isso. A documentação é indecifrável para novatos como eu. Você poderia me mostrar como o cookie definido se aplica especificamente no meu caso? como faço para definir a vida útil e para que serve a referência ssl?
User2097091
Nesse caso, $lifetimeé proveniente de um parâmetro no plug-in de cookie. O argumento é o momento em que o cookie expirará. Você acabou de passar seu próprio valor lá. O argumento SSL diz se o cookie será válido apenas por conexões SSL. Nesse caso, apenas verifica se a página é acessada usando SSL e define o sinalizador seguro no cookie de acordo.
Bakual
2

A última vez que fiz algumas pesquisas nesta área (março de 2013), encontrei esta solução, que não está usando o JInput:

Inspecionei como o JFactory chama JSession, mas não encontrei uma maneira de definir a expiração ao armazenar dados.

Dentro de um plugin do sistema, usando o 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);

O único retrocesso que encontrei foi que agora existem dois cookies com nome e conteúdo idênticos. Eu não notei nenhum efeito colateral.

Espero que isto ajude.

Fonte: Joomla! Desenvolvimento geral ›Definir a expiração da sessão do usuário front-end

Valentin Despa
fonte
2

Tente usar algo como o seguinte:

$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
fonte
Erro fatal: não é possível usar o valor de retorno do método no contexto de gravação em /path/to/templates/template/html/com_entrusters/itemform/default.php na linha 28
user2097091
@ user2097091 - adicionei acidentalmente um ponto e vírgula extra. Atualizado o código. Você pode tentar novamente agora?
Lodder
Você está usando a variável $inputCookieque não definiu - não deveria ser $cookie?
MrWhite
@ w3d - ahh sim meu mal. Atualizado o código. Obrigado por apontar isso
Lodder