1

私は、かなり厄介なコードを持ち、Smarty を使用する PHP サイトで、「フラッシュ メッセージ」(「次の」リクエストで上部に表示される「レコードが保存されました」などの小さなメッセージ) を実装しようとしています。 .

私が思いつくことができる最高のものは次のとおりです。

  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テンプレート内(通常、ヘッダーセクションのように一般的に再利用されるテンプレート)

{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 に答える