Was ist der richtige Weg, um ein dauerhaftes Cookie in Joomla 3.x zu setzen?

8

Ich möchte ein "Ziel" -Cookie für alle Benutzer auf meiner Website setzen, um maßgeschneiderte Inhalte bereitzustellen. Das Cookie muss über das Anmelden / Abmelden hinweg bestehen bleiben, damit ich anscheinend jSession nicht verwenden kann, das beim Anmelden / Abmelden gelöscht wird.

Ich kann das irgendwie auf die altmodische Weise erreichen

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

... aber ich bin sicher, Joomla hat irgendwo einen besseren Weg versteckt. PS - die Dokumentation dazu ist meines Erachtens praktisch nicht vorhanden.

user2097091
quelle
JSession benötigt ein Cookie, um eine Sitzung zu erkennen, aber sie sind nicht dasselbe.
Valentin Despa

Antworten:

5

Vielleicht möchten Sie sich das Cookie-Authentifizierungs-Plugin ansehen. Es setzt und liest einen dauerhaften Cookie.

Es ist hier zu finden: https://github.com/joomla/joomla-cms/tree/staging/plugins/authentication/cookie

Zum Lesen eines Cookies können Sie verwenden

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

Um ein Cookie zu setzen, verwenden Sie

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

Einige Dokumentationen finden Sie auf der API-Seite: http://api.joomla.org/cms-3/classes/JInputCookie.html

Bakual
quelle
Vielen Dank. versuchen das zu verstehen. Die Dokumentation ist für Anfänger wie mich kaum zu entziffern. Können Sie mir möglicherweise zeigen, wie das gesetzte Cookie speziell in meinem Fall angewendet wird? Wie stelle ich die Lebensdauer ein und wofür ist die SSL-Referenz?
user2097091
In diesem Fall $lifetimekommt von einem Parameter im Cookie-Plugin. Das Argument ist der Zeitpunkt, zu dem der Cookie abläuft. Sie geben dort einfach Ihren eigenen Wert weiter. Das SSL-Argument gibt an, ob das Cookie nur über SSL-Verbindungen gültig ist. In diesem Fall wird nur geprüft, ob auf die Seite über SSL zugegriffen wird, und das Sicherheitsflag im Cookie entsprechend gesetzt.
Bakual
2

Als ich das letzte Mal (März 2013) in diesem Bereich recherchiert habe, habe ich diese Lösung gefunden, die JInput nicht verwendet:

Ich habe überprüft, wie JFactory JSession aufruft, aber ich habe keine Möglichkeit gefunden, den Ablauf beim Speichern von Daten festzulegen.

Innerhalb eines System-Plugins mit der Methode onAfterRender()

    $cookie = session_get_cookie_params();

    $cookie['lifetime'] = DESIRED LIFETIME;

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

Der einzige Nachteil, den ich festgestellt habe, war, dass es jetzt zwei Cookies mit identischem Namen und Inhalt gibt. Ich habe keine Nebenwirkungen bemerkt.

Hoffe das hilft.

Quelle: Joomla! Allgemeine Entwicklung ›Legen Sie den Ablauf der Front-End-Benutzersitzung fest

Valentin Despa
quelle
2

Versuchen Sie Folgendes:

$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
quelle
Schwerwiegender Fehler: Der Rückgabewert der Methode kann im Schreibkontext in /path/to/templates/template/html/com_entrusters/itemform/default.php in Zeile 28
user2097091
@ user2097091 - Ich habe versehentlich ein zusätzliches Semikolon hinzugefügt. Der Code wurde aktualisiert. Können Sie es jetzt noch einmal versuchen?
Lodder
Sie verwenden die Variable, $inputCookiedie Sie nicht definiert haben - sollte das nicht sein $cookie?
MrWhite
@ w3d - ahh ja mein schlechtes. Der Code wurde aktualisiert. Vielen Dank für den Hinweis
Lodder