2011-06-04 2 views
4

Любопытно о методах уведомления пользователей. Ссылаясь на простые вещи. Например, пользовательская передача представляет собой контактную форму. После отправки пользователь видит сообщение, в котором говорится, что представление формы прошло успешно.Пользовательское уведомление

Вот вопрос. Как вы это делаете (с PHP), не добавляя строку в URL? Я спрашиваю об этом, потому что я вижу все больше и больше сайтов, уведомляющих пользователей, не используя запрос GET var в URL-адресе.

Они просто хранят что-то в глобальном var где-то и читают, что/отмена при чтении? Какие методы в настоящее время используются для этого?

Чтобы добавить дальше, когда форма размещена и спаслась

//The form has been processed, emailed, etc. Now redirect the user back to the page 
//We redirect the user so that if they click refresh, the form doesn't re-submit. 
//So without a query var in the url, who does the page no that a form was saved? 
//Sessions are one solution, what if sessions are not being used? 
header("Location:the_original_page.php"); 
+0

см. Примечание, добавленное к моему ответу об использовании базы данных вместо сеансов, чтобы определить успешный пост –

ответ

2

Простые: печенье (или сессии). Куки-файлы на самом деле проще, потому что их значения заполняются только в последующем запросе, и они не съедают ваше пространство на сервере, и вам не нужно полагаться на сеансы.

Этот вид отложенных сообщений обычно описывается как флэш-сообщения.

Один конкретный вариант, который мне нравится, это Note library of Dingo Framework.

+0

Мне нравится этот вариант. Кроме того, вы можете установить cookie с PHP на сервере и прочитать его с помощью Javascript на клиенте, если вам нужно. Может быть лучшим решением. Как и в случае с параметром базы данных, это кажется немного ресурсоемким. – Chris

1

Вы можете сохранить его в переменной сеанса, которая получает очищается, когда данные извлекаются

Пример:

// when the form is processed successfully; 

session_start(); 

$_SESSION['message'] = "Thank you for signing up"; 

// the redirect; 

на странице благодарности вы можете получить доступ к переменной

session_start(); 
if (isset($_SESSION['message'])){ 
    $message = $_SESSION['message']; 
    unset($_SESSION['message']); // delete the message 
} 

теперь вы можете использовать переменное сообщение для просмотра сообщения

+0

Это правда. Вероятно, лучший метод. Но что, если вы не используете сеансы на своем сайте? Например, сайт Wordpress. – Chris

+0

Вы имеете в виду, если вы отправляете данные через ajax? – Ibu

0

Если я правильно понял вопрос правильно, они, вероятно, с помощью AJAX

+0

AJAX упростит :) Но не все эти сайты используют AJAX. – Chris

2

Удивительной технологии называется POST :)

+0

+1 конечно .... – dynamic

+0

Очевидно. Но после отправки формы переадресация отправляет пользователя обратно на исходную страницу. Так «техника» отправляет сообщение об успешном завершении через POST при отправке? – Chris

+0

Я не думаю, что это вопрос. Похоже, что OP видит в командной строке такие вещи, как '/ page? Success = 1', чтобы указать успех. –

2

Они обычно устанавливая переменную сеанса, чтобы указать успешность после проверки и проверки на нее при загрузке следующей страницы:

// After handling the $_POST: 
// Assume all data validated and inserted already and you have 
// set the variable $post_was_successful.... 
session_start(); 
if ($post_was_successful) { 
    $_SESSION['post_success'] = TRUE; 
} 


// Upon loading the next page: 
session_start(); 
if ($_SESSION['post_success']) { 
    echo "you successfully submitted the form."; 

    // Then remove the session variable so it isn't reused 
    unset($_SESSION['post_success']); 
} 
else { 
    // Whatever you need to say if it was a failure 
    // or reload the form for resubmission or whatever.. 
} 

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

+0

Правда. Что делать, если вы не используете сеансы? – Chris

+0

@Chris, если вы не используете сеансы, и вам нужно, чтобы состояние сохранялось на странице загрузки, тогда вам нужно использовать параметр querystring, как в вашем вопросе !. Сессии необходимы, если это необходимо для загрузки страницы. –

+0

Я предполагаю, что он хотел бы, чтобы там была команда else, если сообщение/подчинение не прошло. Не уверен, где он хотел бы соответствовать этому, основываясь на том, как он строит эти страницы с успешными результатами и т. Д. Но, вероятно, разумно иметь уведомителя о том, что представление также не удалось. – Jem

2

я обычно в вашем сохранить функцию вы могли бы сделать что-то вроде:

if(thingWasSaved) { 
    NotifyUser("Your Thing was saved, awesome") 
} else { 
    NotifyUser("There was a problem saving your thing") 
} 

вы также можете сделать то же самое с попытаться поймать заявление и т.д. ...

0

Используйте класс и используйте его по всему миру. Кроме того, post form to empty (action = ""), чтобы вы могли проверять и сохранять/отправлять информацию, прежде чем определять, что отправить meessage, а затем передать его классу Notifier.

Затем на каждой странице в документе есть код печати.

например.

<? 
require_once('Notifier.class.php'); 
$Notifier = Notifier::getInstance(); 

if($_SERVER['REQUEST_METHOD'] == 'POST'){ 
    // VALIDATE DATA/SAVE DATA/EMAIL DATA 
    if($saved == true){ 
     $Notifier->add('Thank you for your input!', 'success'); 
    } else { 
     $Notifier->add('There was an error!', 'error'); 
    } 
} 

?> 
<html> 
<body> 
<? $Notifier->_print(); ?> 
<form name="contact" method="post" action=""> 
Name: <input type="text" name="name" /> 
Email: <input type="text" name="email" /> 
<input type="submit" value="Save" /> 
</form> 
</body> 

Вы можете сделать все виды интересных вещей, делая это таким образом: форма проверки, липкий ввод, красно-поля помечены на ошибочных входов, форма скрывается от представления, и уведомление обо всем. Ниже приведен пример класса Notification:

<? 
class Notifier{ 

    public static $instance; 
    private $messages = array(); 

    private function __construct(){ 
    } 

    public static function getInstance(){ 
     if(!isset(self::instance)){ 
      self::instance = new Notifier(); 
     } 
     return self::instance; 
    } 

    public function add($message, $class){ 
     $this->messages[] = '<p class='.$class.'>'.$message.'</p>'; 
    } 

    public function _print(){ 
     if(!is_array($this->messages)){ 
      $this->messages = array($this->messages); 
     } 

     if(count($this->messages)){ 
      foreach($this->messages as $msg){ 
      print $msg; 
     } 
    } 
} 

Я создал измененную версию. Он использует сеансы и является статическим классом. Прекрасно работает:

<?php 
/// Notifier 3.0 
class Notifier { 

private function __construct() { 
} 

public static function add($message, $class = NULL) { 
    $message_node = '<div class="notification'.(NULL !== $class ? ' '.$class : '').'"'.($this->click_to_dismiss ? ' onclick="this.style.display=\'none\'"' : '').'>'.$message.'</div>'; 
    $_SESSION[SESSION_NAMESPACE][SESSION_MESSAGES][] = $message_node; 
} 

public static function print() { 
    while(!empty($_SESSION[SESSION_NAMESPACE][SESSION_MESSAGES])) { 
     $message = array_shift($_SESSION[SESSION_NAMESPACE][SESSION_MESSAGES]); 
     print $message; 
     $message = NULL; 
    } 
} 

private function _session_start() { 
    if (!headers_sent()) { 
     if(session_id() == "") { 
      session_start(); 
     } 
    } 
} 
} 
?> 
Смежные вопросы