Реализация флеш-сообщения на сайте Smarty? - PullRequest
1 голос
/ 23 марта 2011

Я пытаюсь реализовать «Flash-сообщение» (небольшое сообщение, которое будет отображаться вверху при «следующем» запросе, например «запись сохранена»), на PHP-сайте с довольно грязным кодоми использует Smarty.

Лучшее, что я мог придумать, это:

  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 ()?

Или, конечно, еще один совершенно другой и лучший способ сделать это?

Спасибо!
Даниэль

Ответы [ 2 ]

1 голос
/ 23 марта 2011

Я серьезно не использовал 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}
0 голосов
/ 23 марта 2011

Когда я использовал Smarty в прошлом и хотел показывать сообщения, я использовал следующий метод.

Внутри PHP-скрипта, который обрабатывает действие и генерирует сообщение:

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

В скрипте PHP, который обрабатывает следующий запрос / страницу и вызывает шаблон Smarty:

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

В шаблоне Smarty (обычно это часто используемый шаблон, например, раздел Header

{include file='messages.tpl'}

А затем в шаблоне Smarty "messages.tpl"

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

Это не идеально в том смысле, что если одновременно загружается более одной страницы, сообщение может отображаться не в том (редкий, но возможный), но в прошлом оно работало хорошо для меня.

(ПРИМЕЧАНИЕ. Это образцы поцарапанных кодов, доверяйте на свой страх и риск.)

...