【发布时间】:2011-03-23 13:44:17
【问题描述】:
我正在尝试在一个代码非常混乱的 PHP 站点中实现一个“Flash 消息”(一条小消息,将显示在“下一个”请求的顶部,说诸如“记录已保存”之类的内容)并使用 Smarty。
我能想到的最好的方法是:
- 我将消息设置在 $_SESSION 中一个特别命名的变量中
- 我的“标题”模板检查该变量 ($smarty.session.flash),如果已设置,它会显示消息
- 渲染后,并且仅在渲染模板时,清除 $_SESSION 变量。
我的问题是#3。我能找到的唯一方法是向 Smarty 注册一个输出过滤器:
function smarty_outputfilter_flashmessage($tpl_output, $smarty) {
if (isset($_SESSION['flash'])) {
$_SESSION['flash'] = "";
}
return $tpl_output;
}
$smarty->register_outputfilter("smarty_outputfilter_flashmessage");
问题在于,如果一个模板有子模板,那么每个子模板都会调用该函数。另外,代码中有很多地方可以这样做
$variable = $smarty->fetch('something.tpl')
这也会触发我的输出过滤器。
发生这种情况时,输出过滤器会在标题模板呈现之前清除会话变量,并且消息会丢失。
关于如何更好地做到这一点的任何想法/建议?
当请求“结束”时,是否有某种 PHP 内置回调来执行自定义函数? (这样,我可以在那里添加清除,并让 output_filter 简单地设置一个变量来显示 something 是否被渲染)
理想情况下,除非代码调用 die(),否则会被调用?
或者,当然,另一种完全不同的更好的方法来做到这一点?
谢谢!
丹尼尔
【问题讨论】:
标签: php session smarty flash-message