[REVO] Formit: редирект на текущую страницу с выводом сообщения "ОК" - как?

В документации есть пример как редиректить на отдельную страницу с сообщением об успешной отправке. Мне же нужно сделать редирект (чтобы отправка формы не попала в историю браузера) с выводом сообщения об успешной отправке. Как я понимаю, для этого нужно сначала установить флаг в сессии, редиректнуть, проверить флаг, и если он стоит — вывести сообщение.

Есть ли встроенные в FormIt средства для этого? Ведь такой сценарий нужен очень часто (если не чаще). Если нет, посоветуйте схему реализации (с FormIt плохо дружу, с сессиями не работал (в MODX есть что-то специальное для этого? Registry для этого подойдет?). Ведь полюбому кто-то такое уже делал.

10 комментариев

avatar
Там где
<code>redirectTo='[[*id]]'</code>
Это будет идти пересылка на текущую страницу.
А если нужно вывести сообщение об отправке. То куда-нибудь вставляем снипет с примерно таким кодом
<code><?php
if(isset($_POST['name']))
{
return 'сообщение отправлено';
}</code>
А вообще вот что я обнаружил читая документацию по
formit
Добавляем параметр
successMessage = 'Сообщение отправлено'

А redirectTo вообще убираем и оно будет оставаться на текущей странице.
Комментарий отредактирован 2012-12-06 20:14:15 пользователем Ser1ous
avatar
Мне нужен редирект, я это указал. Без редиректа криво получается: жмем назад, затем вперед (или просто обновить) и получаем повторную отправку сообщения.
avatar
Тогда вот какое решение. Опять же вставляем снипет. В него пишем.
<?php
$_SESSION['send_msg'] = 'OK';
?>
На странице приёмнике опять же пишем в снипет.
<?php
if (isset($_SESSION['send_msg']))
{
unset($_SESSION['send_msg']);
return 'Всё хорошо';
}
?>

если это один и тот же документ, то тогда вот так рекомендую текст оформить
<?php
if(isset($_POST['name']))
{
$_SESSION['send_msg'] = 'OK';
}
elseif($_SESSION['send_msg'] == 'OK')
{
unset($_SESSION['send_msg']);
return 'Всё хорошо';
}
avatar

if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL))
{
    mail(....);//смотрим функцию mail на офф сайте
    header('Location:...'); // место редиректа
}


Ну или продолжайте мучать FormIt, ага.
avatar
Не забывайте про валидацию полей и примитивную (хотя бы) защиту от спама. В FormIt все это встроено.
avatar
99 процентов спама отсеивается переименованием email в imail.
А уж валидацию простенькую сделать…
За то время, пока ты разбираешься — раз 10 бы написал.

Но я не настаиваю, каждый сам выбирает…
avatar
Переименовывать email в imail не всегда удачное решение.
Пользователи часто ошибаются при вводе, а оставив его как email сработает автоподстановка в браузере при наборе первых символов, т.к. скорей всего они вводили его на других сайтах и зачастую там он верный.
avatar
То есть пусть пользователь лучше пару раз ошибется с капчей? 0_о
еще вариант hidden или display:none на инпуте…
avatar
А если на этот адрес должен ответ прийти или ссылка на активацию аккаунта? Пользователь может и полдня прождать письма и вообще потом забить на регистрацию.
По крайней мере я сталкивался с ситуацией, когда постоянно по обратной связи пишут с неверных email, бывало и по 20 раз один так напишет (во втором и последующих случаях на imail браузер уже подставляет, а пользователь не замечает, что email неверный), а потом жалуется что техподдержка не отвечает.
Если спама немного, то со скрытым полем вариант самый оптимальный.
avatar
Вариант 1, через сессию:
Написать сниппет
<code>
if (isset($_SESSION['Send_Msg'])) {
    unset($_SESSION['Send_Msg']);
    //Тут как захотите: чанк выводить через getChunk или устанавливать плэйсхолдер
    return 'Сообщение отправлено';
}
</code>
Написать сниппет, например saveToSession:
<code>
<?php
$_SESSION['Send_Msg'] = true;
return true;
</code>
Это будет хуком.
В вызове FormIt указать:
&hooks=`email,saveToSession,redirect`
&redirectTo=`[[*id]]`

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

Вариант 2, через параметр
В вызове FormIt указать
&hooks=`email,redirect`
&redirectTo=`[[*id]]`
&redirectParams=`{«success»: 1}`

Написать сниппет с проверкой:
<code>
if (isset($_GET['success']) && $_GET['success']=1) {
    //Тут как захотите: чанк выводить через getChunk или устанавливать плэйсхолдер
    return 'Сообщение отправлено';
}
</code>
Комментарий отредактирован 2012-12-06 22:52:33 пользователем evd
  • evd
  • +1
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.