¿Cómo se agrega un mensaje de sesión después de llamar a session_write_close?

9

Usamos el excelente módulo uRapidFlow de Unirgy, pero nos hemos topado con un poco de molestia. Cuando ejecutas uno de sus perfiles, llaman session_write_close. El problema con esto es que significa que si deseamos ejecutar un proceso desde un controlador adminhtml, no podemos establecer un mensaje flash de sesión para informar al usuario del éxito o de las excepciones detectadas.

¿Es posible reiniciar la sesión una vez que se completa el proceso para agregar un mensaje de sesión?

Inicialmente no estaba seguro de si era posible reiniciar una sesión en PHP, pero la prueba de concepto PHP funciona:

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

Sin embargo, no he podido configurar correctamente un mensaje flash en la sesión adminhtml. Pensé que podría llamar a algo como:

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

Pero esto no parece funcionar.

Peter O'Callaghan
fuente
Si desea mostrar mensajes al cliente durante la ejecución del perfil, puede usar $ pofile-> getLogger () para obtener una instancia del registrador y pasarle mensajes. No es lo mismo que mostrarlos en la página, pero tendrá registro de ellos
Petar Dzhambazov

Respuestas:

4

Esto debería funcionar:

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

La sesión no se pierde después session_write_close(), si desea volver a escribir en la sesión, deberá volver a abrirla. Prueba de concepto:

<?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
fuente
Llamar a init en la sesión no provocará que se llame a session_start, ya que solo se llama si $ _SESSION no está configurado (lo que parece ser después de llamar session_write_close).
Peter O'Callaghan
Para cualquier persona interesada en hacer esto, para que funcione correctamente, debe hacerlo unset($_SESSION). Después de hacer esto, initvolverá a cargar la sesión correctamente.
Peter O'Callaghan
@Cags He actualizado mi respuesta, ¿puedes verificar si es correcta?
Rick Kuipers
El session_start no es necesario ya que se llama como parte de la initllamada al método (bueno, en el startque se llama por init). Aparte de eso, debería funcionar.
Peter O'Callaghan
@Cags ¡Gracias, actualicé mi respuesta! Le agradezco que vuelva con comentarios :)
Rick Kuipers