1

我正在尝试在一个代码非常混乱并使用 Smarty 的 PHP 站点中实现一个“Flash 消息”(一条小消息将显示在“下一个”请求的顶部,说诸如“记录已保存”之类的内容) .

我能想到的最好的是:

  1. 我在 $_SESSION 的一个特别命名的变量中设置了消息
  2. 我的“标题”模板检查该变量($smarty.session.flash),如果已设置,它会显示消息
  3. 渲染后,并且仅在渲染模板时,清除 $_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(),否则会被调用?

或者,当然,另一种完全不同的更好的方法来做到这一点?

谢谢!
丹尼尔

4

2 回答 2

2

我已经很久没有认真使用 PHP 或 Smarty 了,但是与其尝试猜测模板何时呈现,你不能做一个 Smarty 函数来执行以下操作:

function smarty_function_pop_flash_message($params, $smarty) {
    $msg = "";
    if (isset($_SESSION['flash'])) {
        $msg = $_SESSION['flash'];
        $_SESSION['flash'] = "";
    }
    return $msg;
}

然后在显示此消息的模板中:

{if isset($smarty.session.flash) && $smarty.session.flash != ''}
    <div id="flash">{pop_flash_message}</div>
{/if}
于 2011-03-23T14:34:45.477 回答
0

当我过去使用 Smarty 并希望能够显示消息时,我使用了以下方法。

在处理动作然后生成消息的 PHP 脚本中:

$_SESSION['message'][] = 'The Message Content!';

在处理下一个请求/页面并调用 Smarty 模板的 PHP 脚本中:

$smarty->assign( 'messages' , $_SESSION['message'] );
unset( $_SESSION['messages'] );

在 Smarty 模板中(通常是一个常用的模板,如 Header 部分

{include file='messages.tpl'}

然后在“messages.tpl”Smarty 模板内

{if $messages}
  <div id="messages">
    <ul>
      {foreach $messages as $m}
        <li>{$m}</li>
      {/foreach}
    </ul>
  </div>
{/if}

这并不完美,如果同时加载多个页面,则消息可能会出现在错误的页面中(一种罕见的情况,但有可能),但过去对我来说效果很好。

(注意:这些是拼凑的代码示例,请您自担风险。)

于 2011-03-23T15:23:17.797 回答