用户通知

时间:2011-06-04 19:58:09

标签: php javascript html notifications

对用户通知技术感到好奇。提到简单的东西。例如,用户提交联系表单。提交后,用户会看到一条消息,表明表单提交成功。

这是一个问题。你如何实现这一点(使用PHP),而不是在网址上附加字符串?我问这个是因为我看到越来越多的网站在网址中没有使用GET查询变量来通知用户。

他们只是在某个地方存储某个东西并在读取时读取/取消设置吗?目前使用哪些技术来实现这一目标?

要进一步添加,请在发布并保存表单时

//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");

7 个答案:

答案 0 :(得分:2)

一项名为POST的惊人技术:)

答案 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..
}

这需要某种持久存储。如果没有使用会话(它们可能应该是),那么你需要通过在页面加载时检查数据库来完成同样的事情,看看是否有相应的信息。

答案 2 :(得分:2)

你通常在保存功能中执行以下操作:

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

你也可以尝试使用try catch语句等...

答案 3 :(得分:2)

简单:cookies(或会话)。 Cookie实际上更容易,因为它们的值仅在后续请求中填充,并且它们不会占用您的服务器空间,您不必依赖会话。

这种推迟的消息通常被描述为flash消息。

我喜欢的一个特定实现是Note libraryDingo Framework

答案 4 :(得分: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
}

现在您可以使用消息变量来查看消息

答案 5 :(得分:0)

如果我正确理解了这个问题,他们可能正在使用ajax

答案 6 :(得分:0)

使用类并全局使用它。另外,将表单发布为空(action =“”),以便在确定要发送的代码之前验证并保存/发送所有信息,然后将其提供给通告程序类。

然后在每个页面上,文档中都有打印代码。

例如

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