在session_write_close被调用后,如何添加会话消息?


9

我们使用了Unirgy出色的uRapidFlow模块,但遇到了一些麻烦。当您运行他们的个人资料之一时,他们会叫session_write_close。这样做的问题是,这意味着如果我们希望从adminhtml控制器运行进程,则无法设置会话Flash消息来通知用户成功或捕获的异常。

完成该过程后,是否可以重新启动会话以添加会话消息?

最初我不确定是否可以用PHP重新启动会话,但是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();
// set a value to see if it takes
$_SESSION['foo'] = 'foo';

但是,我无法在adminhtml会话上正确设置Flash消息。我认为我可以按照以下方式调用某些内容:

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

但这似乎不起作用。


如果要在配置文件执行期间向客户显示消息,则可以使用$ pofile-> getLogger()获取logger实例并将消息传递给它。它与在页面中显示它们不同,但是您将获得它们的记录
Petar Dzhambazov 2013年

Answers:


4

这应该工作:

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

之后session_write_close(),会话不会丢失,如果您想再次写入会话,则必须重新打开它。概念证明:

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

在会话上调用init不会触发session_start的调用,因为只有在未设置$ _SESSION的情况下才调用session_start(这似乎是在调用后session_write_close)。
彼得·奥卡拉汉

对于任何对此感兴趣的人,为了使其能够正常运行,您必须unset($_SESSION)。完成此操作后,init将正确重新加载会话。
彼得·奥卡拉汉

@Cags我已经更新了答案,可以检查一下是否正确吗?
里克·库珀斯

session_start不是必需的,因为它是init方法调用的一部分(在start中由调用init)。除此之外,它应该工作。
彼得·奥卡拉汉

@Cags谢谢,我更新了答案!感谢您的反馈:)
Rick Kuipers 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.