LINUX.ORG.RU

У меня есть задача, а я её нагуглить не могу.


0

2

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

Когда админ залогинен и сидит на форуме у него появляются всякие кнопки и дополнительные элементы (любые).

А теперь нужно знать, какие сообщения админ смотрел, а какие нет, без всяких кнопочек, типо скролим тему и понимаем, что мы читаем. В базе отдельный столбец с enum(1,0) на борту, если мы проскролили сообщение, меняем ячейку сообщения с 0 на 1.

Я понимаю копать нужно в ajax, но хотелось бы что бы тыкнули меня носом в пример или еще что по круче, а еще лучше в готовое, я понимаю, что где то оно валяется, но где?

Надеюсь обрисовал все.

Ну как вариант когда доскроливается до конца сообщения отсылать ajax запрос на сервер - с номером поста и менять значение. Совсем готового у меня нет.

pi11 ★★★★★
()
Ответ на: комментарий от pi11

была такая идея, но задачу поставили четко и ясно... Вот сижу гуглю.

boomflack
() автор топика

Ну.. разбейте на подзадачи, проще же будет:

  • Создать событие 'messageread', которое будет возгораться, как только админ «просмотрел» (докрутил, провёл мышью, нажал кнопку, etc) пост
  • Повесить обработчик на это событие, позаботится, чтоб он (обработчик) собирал все нужные данные и отправлял AJAX:
    function readHandler(e) {
      var data = {};
      data.something = e.target.id; // или как-то так
      makeAjax('some/url', {
        post: data
      });
    }
    
  • Написать обработчик запроса на стороне сервера. Допустим perl:
    use strict;
    use warnings;
    use CGI;
    
    my $q = CGI->new();
    my $id = $q->param('something');
    my $sth = $dbh->prepare('UPDATE Posts SET seen = 1 WHERE id = :id');
    my $rh = $sth->execute($id);
    if ($rh->rows) {
       # response success
    } else {
       # response failure
    }
    
  • На window.onload повесить еще один хендлер, который будет отмечать непрочитанные посты:
    window.onload = function () {
      makeAjax('other/url', {
        success: function (data) {
          for (i in data) {
            markUnread(document.getElementById(data[i]));
          }
        }
      });
    }
    
KennyMinigun ★★★★★
()
Ответ на: комментарий от PaulAS

Как на клиенте узнать что элемент отрисован/отображен ?

[sarcasm]Хм, какая сложная задача[/sarcasm]

Да хоть так:

var posts = document.getElementsByClassName('message-box');
for (var i in posts) {
   // пост становится "прочитанным" если провести по нему мышью
   posts[i].addEventListener('onmouseover', function (e) {
      if (isRead(e.target)) {
         return;
      }

      var event = new CustomEvent('messageread', e.target);
      document.dispatchEvent(event);
   });
}

Вариант с мышью мне кажется самым адекватным. Нечто похожее будет и для случая проверки «элемент отрисован/отображён».

И да — код написан на коленке, и передает суть. На предмет правильности не проверялся. Сходу скажу, что в ИЕ не работает.

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)
Ответ на: комментарий от PaulAS

любой элемент имеет событие isRead при отображении браузером ?

Нет, isRead это функция, которую надо реазизовать в комплекте с markRead. Например так:

function isRead(domElement) {
   return domElement.className.indexOf('post-is-read') !== -1;
}

function markRead(domElement) {
   ddomElement.className += ' post-is-read';
}
KennyMinigun ★★★★★
()
Ответ на: комментарий от KennyMinigun

Не понял, в каком месте скрипт узнает что браузер отобразил элемент?

Браузер вызовет функцию с именем markRead(domElement), если я ее реализую, для каждого отображаемого элемента?

PaulAS
()
Ответ на: комментарий от PaulAS

Не понял, в каком месте скрипт узнает что браузер отобразил элемент?

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

Еще раз

  • Как я уже сказал — лучше (и проще) считать пост прочитанным, если админ провёл по нему мышью. (Для случая именно «отображён» нужно шаманить с window.onload и прокруткой).
  • После того, как пост прочитан (одним из поддерживаемых способов) запускаем свой event (напр. 'messageread')
  • Где-то прикрепляем слушателя для этого ивента. Внутри слушателя отправляем ajax на сервер с запросом «пометить как прочтённое»
  • на загрузку страницы вешаем еще один обработчик, который по данным с БД помечает посты как «прочитанные».
  • И по кругу:
    • Загрузили страничку, расставили метки на прочитанных постах
    • Как только пользователь проведёт мышью по посту (aka прочитает) запускаем евент 'messageread'
    • Ловим евент в другой части странички, отправляем ajax «пометить, как прочитано» (можно заодно пометить источник ивента как «прочитанный»)

Суть в том, что: а) Нужно определить факт прочтения сообщения
б) Нужно отослать соответствующий запрос «о прочтении» на сервер
в) Нужно получить от сервера данные о «прочитанных постах»

P.S. Реализацию я не предлагаю. Это лишь концепция. За реализацию — деньги наперёд :)

KennyMinigun ★★★★★
()
Ответ на: комментарий от KennyMinigun

Аа..., есть событие window.onScroll, теперь понятно
спасибо

PaulAS
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.