Wie füge ich eine Sitzungsnachricht hinzu, nachdem session_write_close aufgerufen wurde?

9

Wir verwenden das exzellente uRapidFlow-Modul von Unirgy, sind aber etwas verärgert. Wenn Sie eines ihrer Profile ausführen, rufen sie an session_write_close. Das Problem dabei ist, dass wir, wenn wir einen Prozess von einem Adminhtml-Controller ausführen möchten, keine Sitzungs-Flash-Nachricht festlegen können, um den Benutzer über Erfolg oder abgefangene Ausnahmen zu informieren.

Ist es möglich, die Sitzung nach Abschluss des Vorgangs neu zu starten, um eine Sitzungsnachricht hinzuzufügen?

Ich war mir anfangs nicht sicher, ob es möglich war, eine Sitzung in PHP neu zu starten, aber der Proof-of-Concept-PHP funktioniert:

session_start();
// if this is the second run, show the value
if (!empty($_SESSION['foo'])) {
    echo $_SESSION['foo'], PHP_EOL;
}
// set an initial value
$_SESSION['foo'] = 'bar';

// start running profile
session_write_close();
// after running profile
session_start();
// set a value to see if it takes
$_SESSION['foo'] = 'foo';

Ich konnte jedoch keine Flash-Nachricht in der Adminhtml-Sitzung richtig einstellen. Ich dachte, ich könnte etwas in der Art von:

Mage::getSingleton('adminhtml/session')
    ->init('core', 'adminhtml')
    ->addSuccess('Whoop');

Das scheint aber nicht zu funktionieren.

Peter O'Callaghan
quelle
Wenn Sie dem Kunden während der Profilausführung Nachrichten anzeigen möchten, können Sie $ pofile-> getLogger () verwenden, um die Instanz des Loggers abzurufen und Nachrichten an ihn zu übergeben. Es ist nicht dasselbe wie sie auf der Seite zu zeigen, aber Sie werden Aufzeichnungen darüber haben
Petar Dzhambazov

Antworten:

4

Das sollte funktionieren:

unset($_SESSION);
Mage::getSingleton('adminhtml/session')
    ->init('core', 'adminhtml')
    ->addSuccess('Whoop');

Die Sitzung geht danach nicht verloren session_write_close(). Wenn Sie erneut in die Sitzung schreiben möchten, müssen Sie sie jedoch erneut öffnen. Konzeptioneller Beweiß:

<?php
session_start();
// if this is the second run, show the value
if (!empty($_SESSION['foo'])) {
    echo $_SESSION['foo'], PHP_EOL;
}
// set an initial value
$_SESSION['foo'] = 'bar';

// start running profile
session_write_close();

// after running profile
session_start();
var_dump($_SESSION);
//// set a value to see if it takes
$_SESSION['test'] = 'foo';
Rick Kuipers
quelle
Wenn Sie init in der Sitzung aufrufen, wird session_start nicht aufgerufen, da es nur aufgerufen wird, wenn $ _SESSION nicht festgelegt ist (was nach dem Aufruf zu sein scheint session_write_close).
Peter O'Callaghan
Für alle, die daran interessiert sind, muss es funktionieren, damit es richtig funktioniert unset($_SESSION). Danach initwird die Sitzung korrekt neu geladen.
Peter O'Callaghan
@Cags Ich habe meine Antwort aktualisiert. Können Sie überprüfen, ob sie korrekt ist?
Rick Kuipers
Der session_start ist nicht erforderlich, da er als Teil des initMethodenaufrufs aufgerufen wird (in startdem auch aufgerufen wird von init). Davon abgesehen sollte es funktionieren.
Peter O'Callaghan
@Cags Danke, ich habe meine Antwort aktualisiert! Ich
Rick Kuipers