私は、かなり厄介なコードを持ち、Smarty を使用する PHP サイトで、「フラッシュ メッセージ」(「次の」リクエストで上部に表示される「レコードが保存されました」などの小さなメッセージ) を実装しようとしています。 .
私が思いつくことができる最高のものは次のとおりです。
- $_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() を呼び出さない限り呼び出される何か?
または、もちろん、これを行うための別の完全に異なるより良い方法はありますか?
ありがとう!
ダニエル