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.


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.