Уведомьте панель, подобную stackoverflow's

Неустранимая ошибка: Невозможно переопределить класс [имя класса]

Неустранимая ошибка: невозможно обновить [имя функции]

Это означает, что вы либо используете одно и то же имя функции / класса дважды, и вам нужно переименовать один из них, или это потому, что вы использовали require или include, где вы должны использовать require_once или include_once.

Когда класс или функция объявляется в PHP, он неизменен и не может быть позже объявлен с новым значением.

Рассмотрим следующий код:

class.php

<?php

class MyClass
{
    public function doSomething()
    {
        // do stuff here
    }
}

index.php

<?php

function do_stuff()
{
   require 'class.php';
   $obj = new MyClass;
   $obj->doSomething();
}

do_stuff();
do_stuff();

Второй вызов do_stuff() приведет к получению ошибка выше. Изменяя require на require_once, мы можем быть уверены, что файл, содержащий определение MyClass, будет загружен только один раз, и ошибка будет устранена.

26
задан tereško 13 July 2012 в 10:52
поделиться

5 ответов

После небольшого поиска кода, вот предположение:

Следующий контейнер уведомлений всегда находится в разметке представления:

<div id="notify-container"> </div>

Этот контейнер уведомлений скрыт по умолчанию и при определенных обстоятельствах заполняется javascript. Он может содержать любое количество сообщений.

Если пользователь не вошел в систему

Сохранение : Файлы cookie используются для отслеживания того, отображается сообщение или нет.

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

<script type="text/javascript">
    $(function() { notify.showFirstTime(); });
</script>

Метод javascript showFirstTime () просто определяет, нужно ли отображать сообщение «Это ваш первый раз здесь?» сообщение в зависимости от того, был ли установлен файл cookie. Если файла cookie нет, отображается сообщение. Если пользователь предпримет действия, cookie будет установлен, и сообщение не будет отображаться в будущем. Функция nofity.showFirstTime () обрабатывает проверку cookie.

Если пользователь вошел в систему

Постоянство : База данных используется для отслеживания того, было ли показано сообщение или нет.

Код, сгенерированный на стороне сервера, в представлении : Когда страница запрашивается, код на стороне сервера проверяет базу данных, чтобы увидеть, какие сообщения необходимо отобразить. Затем код на стороне сервера вставляет сообщения в формате json в представление и помещает вызов javascript в showMessages ().

Например, если я вошел в представление, я вижу следующее в разметке в SO:

    <script type="text/javascript">
1
2 var msgArray = [{"id":49611,"messageTypeId":8,"text":"Welcome to Super User! Visit your \u003ca href=\"/users/00000?tab=accounts\"\u003eaccounts tab\u003c/a\u003e to associate with our other websites!","userId":00000,"showProfile":false}];
3 $(function() { notify.showMessages(msgArray); });
4
</script>

Таким образом, код на стороне сервера либо вводит код для вызова метода «showFirstTime», если пользователь не вошел в систему, либо вводит сообщения и вызывает «showMessages» для зарегистрированного пользователя.

Подробнее о коде на стороне клиента

Другой ключевой компонент - это модуль JavaScript "уведомлений", который Picflight определил (вы можете сделать то же самое, используя yslow для firebug). Модуль уведомления обрабатывает заполнение блока уведомления на основе JavaScript, созданного на стороне сервера.

Вы не авторизовались, клиентская сторона

Если пользователь не вошел в систему, модуль обрабатывает события, когда пользователь X отправляет уведомление или переходит к FAQ, создавая cookie. Он также определяет, следует ли отображать первое сообщение, проверяя наличие cookie.

Выполнен вход на стороне клиента

Если пользователь вошел в систему, модуль уведомления добавляет все сообщения, сгенерированные сервером, в блок уведомления. Он также, скорее всего, использует ajax для обновления базы данных, когда пользователь закрывает сообщение.

модуль уведомлений добавляет все сообщения, созданные сервером, в блок уведомления. Он также, скорее всего, использует ajax для обновления базы данных, когда пользователь закрывает сообщение.

модуль уведомлений добавляет все сообщения, созданные сервером, в блок уведомления. Он также, скорее всего, использует ajax для обновления базы данных, когда пользователь закрывает сообщение.

11
ответ дан 28 November 2019 в 07:42
поделиться

Хотя они ни в коем случае не официальны, общие методы, которые я применяю, привели бы к чему-то вроде этого:

  • Создают элемент, который будет действовать как контейнер уведомления в разметке , но скрывать его по умолчанию (это может быть сделано многочисленные пути - JavaScript, внешний CSS или встроенные стили).
  • Сохраняют сценарии ответственными за поведение уведомления за пределами разметки . В примере выше, Вы видите, что существует onclick, а также другая функция, которая стреляет в загрузку страницы, содержавшуюся в разметке. Хотя это работает, я рассматриваю это как смешивание представления и поведения.
  • Сохраняют представление уведомления содержавшимся во внешней таблице стилей.

Снова, это просто мои общие методы, указанные в контексте Вашего вопроса. Вещь с веб-разработкой, поскольку природа Вашего вопроса уже показывает, состоит в том, что существует столько способов сделать то же самое с теми же результатами.

4
ответ дан Tom 28 November 2019 в 07:42
поделиться

Использование StackOverflow jQuery - JS кодируют Вас отправленный от ТАК вызов jQuery. Это сделает точно, что Вы не хотите почти ни с каким кодом. Наиболее рекомендуемый.

2
ответ дан Mike Scott 28 November 2019 в 07:42
поделиться

В этом ответе есть полное решение.

Копирование и вставка:

Это разметка, изначально скрытая, чтобы мы могли ее скрыть:

<div id='message' style="display: none;">
    <span>Hey, This is my Message.</span>
    <a href="#" class="close-notify">X</a>
</div>

Вот примененные стили:

#message {
    font-family:Arial,Helvetica,sans-serif;
    position:fixed;
    top:0px;
    left:0px;
    width:100%;
    z-index:105;
    text-align:center;
    font-weight:bold;
    font-size:100%;
    color:white;
    padding:10px 0px 10px 0px;
    background-color:#8E1609;
}

#message span {
    text-align: center;
    width: 95%;
    float:left;
}

.close-notify {
    white-space: nowrap;
    float:right;
    margin-right:10px;
    color:#fff;
    text-decoration:none;
    border:2px #fff solid;
    padding-left:3px;
    padding-right:3px
}

.close-notify a {
    color: #fff;
}

А это javascript (с использованием jQuery):

$(document).ready(function() {
    $("#message").fadeIn("slow");
    $("#message a.close-notify").click(function() {
        $("#message").fadeOut("slow");
        return false;
    });
});

И вуаля. В зависимости от настроек вашей страницы вы также можете захотеть отредактировать верхний край основного поля на дисплее.

Вот его демонстрация в действии .

12
ответ дан 28 November 2019 в 07:42
поделиться

Я вижу следующую функцию jQuery? Я полагаю, что HTML-код вставляется в div с помощью id notify-container.

Я не понимаю, как этот JS используется и вызывается на основе определенных событий, возможно, кто-нибудь сможет объяснить.

var notify = function() {
var d = false;
var e = 0;
var c = -1;
var f = "m";
var a = function(h) {
    if (!d) {
        $("#notify-container").append('<table id="notify-table"></table>');
        d = true
    }
    var g = "<tr" + (h.messageTypeId ? ' id="notify-' + h.messageTypeId + '"' : "");
    g += ' class="notify" style="display:none"><td class="notify">' + h.text;
    if (h.showProfile) {
        var i = escape("/users/" + h.userId);
        g += ' See your <a href="/messages/mark-as-read?messagetypeid=' + h.messageTypeId + "&returnurl=" + i + '">profile</a>.'
    }
    g += '</td><td class="notify-close"><a title="dismiss this notification" onclick="notify.close(';
    g += (h.messageTypeId ? h.messageTypeId : "") + ')">&times;</a></td></tr>';
    $("#notify-table").append(g)
};
var b = function() {
    $.cookie("m", "-1", {
        expires: 90,
        path: "/"
    })
};
return {
    showFirstTime: function() {
        if ($.cookie("new")) {
            $.cookie("new", "0", {
                expires: -1,
                path: "/"
            });
            b()
        }
        if ($.cookie("m")) {
            return
        }
        $("body").css("margin-top", "2.5em");
        a({
            messageTypeId: c,
            text: 'First time here? Check out the <a onclick="notify.closeFirstTime()">FAQ</a>!'
        });
        $(".notify").fadeIn("slow")
    },
    showMessages: function(g) {
        for (var h = 0; h < g.length; h++) {
            a(g[h])
        }
        $(".notify").fadeIn("slow");
        e = g.length
    },
    show: function(g) {
        $("body").css("margin-top", "2.5em");
        a({
            text: g
        });
        $(".notify").fadeIn("slow")
    },
    close: function(g) {
        var i;
        var h = 0;
        if (g && g != c) {
            $.post("/messages/mark-as-read", {
                messagetypeid: g
            });
            i = $("#notify-" + g);
            if (e > 1) {
                h = parseInt($("body").css("margin-top").match(/\d+/));
                h = h - (h / e)
            }
        } else {
            if (g && g == c) {
                b()
            }
            i = $(".notify")
        }
        i.children("td").css("border-bottom", "none").end().fadeOut("fast", function() {
            $("body").css("margin-top", h + "px");
            i.remove()
        })
    },
    closeFirstTime: function() {
        b();
        document.location = "/faq"
    }
 }
} ();
4
ответ дан 28 November 2019 в 07:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: