Session in der Klasse ShopControl

Ho!

ich möchte gerne die letzten zehn besuchten Seiten eines Benutzers in einer Session speichern. Dazu würde ich einfach in ShopControl ein paar Variablen wie z.B. die URL / Controller etc speichern: https://pastebin.com/PAGKKSF3

Leider existieren die Daten nach einem Reload nicht mehr.

Ich habe versucht in der config.inc.php den Wert blForceSessionStart auf true zu setzen und in der Klasse Session habe ich Testweise die Funktion _forceSessionStart() überschrieben, so dass diese true zurück gibt.

Auch das hilft nicht:

class ShopControl extends ShopControl_parent
{
    public function __construct()
    {
        $session = oxNew(Session::class);
        $session->setForceNewSession();
        parent::__construct();
    }
}

Könnt ihr mir bitte sagen, was ich übersehe? Die Forenbeiträge dazu haben mir leider nicht weitergeholfen. (Der z.B. Session in modules)

Danke & LG
Sascha

Setz mal blForceSessionStart in config.inc.php auf true. Damit:

bekommst du nicht das gleiche Session-Objekt das der Shop nutzt sondern erstellst ein neues.

Danke, habe ich schon.

    $session = Registry::getSession();
    $session->setForceNewSession();
    parent::__construct();

So funktioniert es auch nicht :confused:

Wie komme ich an das Session-Object das Oxid erstellt?

schau dir mal die Klasse oxarticlelist.php an - die Methoden kannst du sinngemäß auch für andere Seiten / OXIDs verwenden

Schon so. Also mit getSession()

protected function _forceSessionStart()
{
    return true;
}

geht bei mir. blForceSessionStart auf true auch.

public function __construct(){
    $session = Registry::getSession();
    $session->setForceNewSession();
    parent::__construct();
}

Geht auch…

Das funktioniert bei mir leider nicht.

public function start($controllerKey = null, $function = null, $parameters = null, $viewsChain = null)
{
    parent::start($controllerKey, $function, $parameters, $viewsChain);
    echo "<pre>" . print_r(Registry::getSession()->getVariable("swwFeedbackTrace"), true) . "</pre>";
    Registry::getSession()->setVariable("swwFeedbackTrace", [1,2,3]);
}

Das Echo gibt immer ein leeres PRE zurück. Ich deaktiviere mal alle Module.

Danke, welche Methoden genau denn und meinst du “Model/ArticleList” ? Ich möchte das gerne für alle Seiten und nicht nur für einige Controller, deswegen dachte ich in ShopControl sollte das passen.

Hm bei mir nicht, da kommt 123. Geht denn die Session ansonsten? (z.B. Login)

Ja das geht alles, ich teste es jetzt mal durch ohne Module und installiere diese nach und nach dazu.

Funktioniert auch nicht. Ich hab’s mit drei PHP-Versionen auf 2 verschiedenen Servern getestet.

Ich hab das Modul hier hochgeladen evt. wird da der Fehler sichtbar? https://github.com/Sioweb/OxidSomethingWentWrong

ShopControl

Ja - heißt ab Oxid 6 so
-> z.B. in setHistoryArticles() werden die Artikel-Ids in der Session gespeichert - ansonsten im cookie

Jo, die Funktionen kenn ich ja soweit. Nur funktionieren die nicht o: Die Session bleibt nur bis zum Reload bestehen. Seltsamerweise funktionieren die später gesetzten Sessions variablen.

Wenn ich den Code direkt in ShopControl von Oxid einfüge, funktioniert es.

Wenn du parent::start aufrufst wird die Session gekillt. Musst also hinterher aufrufen. Außerdem ist die Session noch nicht gestartet an der Stelle.

public function start($controllerKey = null, $function = null, $parameters = null, $viewsChain = null)
{
    Registry::getConfig()->setConfigParam('blForceSessionStart', true);
    Registry::getSession()->start();
    echo "<pre>" . print_r(Registry::getSession()->getVariable("swwFeedbackTrace"), true) . "</pre>";
    Registry::getSession()->setVariable("swwFeedbackTrace", [1,2,3]);
    parent::start($controllerKey, $function, $parameters, $viewsChain);
}

Das hat funktioniert. Danke sehr!