Comment ajouter un message de session après l'appel de session_write_close?

9

Nous utilisons l'excellent module uRapidFlow d'Unirgy, mais nous sommes un peu contrariés. Lorsque vous exécutez l'un de leurs profils, ils appellent session_write_close. Le problème avec cela est que cela signifie que si nous souhaitons exécuter un processus à partir d'un contrôleur adminhtml, nous ne pouvons pas définir de message flash de session pour informer l'utilisateur du succès ou des exceptions détectées.

Est-il possible de redémarrer la session une fois le processus terminé, afin d'ajouter un message de session?

Au départ, je ne savais pas s'il était possible de redémarrer une session en PHP, mais la preuve de concept PHP fonctionne:

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

Je n'ai pas pu définir correctement un message flash sur la session adminhtml cependant. J'ai pensé que je pourrais être en mesure d'appeler quelque chose dans le sens de:

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

Mais cela ne semble pas fonctionner.

Peter O'Callaghan
la source
Si vous souhaitez afficher des messages au client pendant l'exécution du profil, vous pouvez utiliser $ pofile-> getLogger () pour obtenir une instance de l'enregistreur et lui transmettre des messages. Ce n'est pas la même chose que de les montrer sur la page, mais vous en aurez une trace
Petar Dzhambazov

Réponses:

4

Cela devrait fonctionner:

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

La session n'est pas perdue après session_write_close(), si vous voulez réécrire dans la session, vous devrez cependant la rouvrir. Preuve de concept:

<?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
la source
L'appel à init sur la session ne déclenchera pas l'appel de session_start, car il n'est appelé que si $ _SESSION n'est pas défini (ce qu'il semble être après l'appel session_write_close).
Peter O'Callaghan
Pour toute personne intéressée à le faire, vous devez le faire fonctionner correctement unset($_SESSION). Après cela init, la session sera rechargée correctement.
Peter O'Callaghan
@Cags J'ai mis à jour ma réponse, pouvez-vous vérifier si elle est correcte?
Rick Kuipers
Le session_start n'est pas requis car il est appelé dans le cadre de l' initappel de méthode (bien dans startlequel est appelé par init). A part ça, ça devrait marcher.
Peter O'Callaghan
@Cags Merci, j'ai mis à jour ma réponse! J'apprécie que vous reveniez avec des commentaires :)
Rick Kuipers