Como você adiciona uma mensagem de sessão depois que session_write_close é chamado?

9

Usamos o excelente módulo uRapidFlow da Unirgy, mas tivemos um certo aborrecimento. Quando você executa um dos perfis deles, eles chamam session_write_close. O problema é que, se desejamos executar um processo a partir de um controlador adminhtml, não podemos definir uma mensagem instantânea da sessão para informar o usuário sobre o sucesso ou exceções detectadas.

É possível reiniciar a sessão após a conclusão do processo, para adicionar uma mensagem de sessão?

Inicialmente, não tinha certeza se era possível reiniciar uma sessão em PHP, mas a prova de conceito do 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';

Não consegui definir corretamente uma mensagem em flash na sessão adminhtml. Eu pensei que poderia chamar algo ao longo das linhas de:

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

Mas isso não parece funcionar.

Peter O'Callaghan
fonte
Se você quiser mostrar mensagens ao cliente durante a execução do perfil, use $ pofile-> getLogger () para obter a instância do logger e passar mensagens para ele. Não é o mesmo que mostrá-los na página, mas você terá um registro deles #
Petar Dzhambazov

Respostas:

4

Isso deve funcionar:

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

A sessão não será perdida depois session_write_close(), se você quiser gravar na sessão novamente, será necessário reabri-la. Prova de conceito:

<?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
fonte
Chamar init na sessão não fará com que o session_start seja chamado, pois ele será chamado apenas se $ _SESSION não estiver definido (o que parece ocorrer após a chamada session_write_close).
Peter O'Callaghan
Para qualquer pessoa interessada em fazer isso, para fazê-lo funcionar corretamente, você precisa unset($_SESSION). Depois de fazer isso init, recarregará a sessão corretamente.
Peter O'Callaghan
@ Cags Atualizei minha resposta, você pode verificar se está correto?
precisa
O session_start não é necessário, pois é chamado como parte da initchamada do método (na startqual é chamado por init). Fora isso, deve funcionar.
Peter O'Callaghan ''
@ Cags Obrigado, eu atualizei minha resposta! Agradeço-lo a voltar com feedback :)
Rick Kuipers