Jak dodać komunikat sesji po wywołaniu session_write_close?

9

Korzystamy z doskonałego modułu uRapidFlow firmy Unirgy, ale wpadliśmy w trochę irytacji. Gdy uruchamiasz jeden z ich profili, dzwonią session_write_close. Problem polega na tym, że jeśli chcemy uruchomić proces z kontrolera adminhtml, nie możemy ustawić komunikatu flash sesji informującego użytkownika o sukcesie lub przechwyconych wyjątkach.

Czy można ponownie uruchomić sesję po zakończeniu procesu, aby dodać komunikat o sesji?

Początkowo nie byłem pewien, czy można zrestartować sesję w PHP, ale dowód na to, że PHP działa:

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';

Jednak nie byłem w stanie poprawnie ustawić wiadomości flash w sesji adminhtml. Pomyślałem, że mogę zadzwonić po coś w stylu:

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

Ale to nie działa.

Peter O'Callaghan
źródło
Jeśli chcesz wyświetlać wiadomości klientowi podczas wykonywania profilu, możesz użyć $ pofile-> getLogger (), aby uzyskać instancję programu rejestrującego i przekazać do niego wiadomości. To nie jest to samo, co pokazywanie ich na stronie, ale będziesz mieć ich zapis
Petar Dzhambazov

Odpowiedzi:

4

To powinno działać:

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

Sesja nie zostaje utracona session_write_close(), jeśli chcesz ponownie napisać do niej sesję, musisz ją ponownie otworzyć. Dowód koncepcji:

<?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
źródło
Wywołanie init w sesji nie spowoduje wywołania session_start, ponieważ jest wywoływane tylko wtedy, gdy $ _SESSION nie jest ustawione (co wydaje się być po wywołaniu session_write_close).
Peter O'Callaghan,
Każdy, kto chce to zrobić, musi działać poprawnie unset($_SESSION). Po wykonaniu tej czynności initpoprawnie załaduje ponownie sesję.
Peter O'Callaghan
@Tagi Zaktualizowałem moją odpowiedź. Czy możesz sprawdzić, czy jest poprawna?
Rick Kuipers,
Sesja_start nie jest wymagana, ponieważ jest wywoływana jako część initwywołania metody (dobrze, w startktórej jest wywoływana przez init). Poza tym powinien działać.
Peter O'Callaghan,
@ Tagi Dzięki, zaktualizowałem swoją odpowiedź! Doceniam, że wracasz z opiniami :)
Rick Kuipers