我正在尝试在一个代码非常混乱并使用 Smarty 的 PHP 站点中实现一个“Flash 消息”(一条小消息将显示在“下一个”请求的顶部,说诸如“记录已保存”之类的内容) .
我能想到的最好的是:
- 我在 $_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 简单地设置一个变量来显示是否呈现了某些东西)
理想情况下,除非代码调用 die(),否则会被调用?
或者,当然,另一种完全不同的更好的方法来做到这一点?
谢谢!
丹尼尔