Xpoint
   [напомнить пароль]

Организовать показ наличия обновлений в разделах

Метки: [без меток]
2009-10-13 12:16:57 [обр] Agar -Agar(0/68)[досье]

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

Нужно организовать показ разделов обновленных одним цветом, а просмотренных и без обновлений — другим. Структуру сделал примерно такой (см. ниже), уровень вложенности любой. В скобках время последнего обновления для простоты написал здесь в удобочитаемом варианте.

Как я себе это представляю. Допустим, появился новый посетитель, ставлю ему куку и завожу на него файл-досье по схеме с описанием всго дерева каталогов сайта. Т.е., напр. строка в этой базе-файле начинается с ID конечного файла и описывает ID всех папок до самой верхней, чтобы можно было подняться по этим уровням и сравнить дату обновления.

Допустим, пользователь посетил страницу-условный файл 1111 с датой последнего обновления 01:50, иду вверх и переписываю для пользователя у всех папок выше время на 01:50, если время папки не больше этого времени. Потом, когда выводится страница, в указании внутренних ссылок с истинным временем обновления сверяюсь с временем из пользовательского файла и в зависимости от этого маркирую ссылку как обновленную или без обновлений.

Но тут вылезает проблема: допустим, пользователь посетил последнюю обновленную страничку-условный файл. Тогда все что выше будет для него отображаться как посещенное. Но ведь он мог еще не посетить и другие страницы-условные файлы, которые обновлялись раньше?

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

папка 0 (01:53)
  |
  |-папка 1 (01:51)
  |  |
  |  |-папка 11 (01:51)
  |    |
  |    |-папка 111 (01:50)
  |    | |
  |    | |-файл 1111 (01:50)
  |    |
  |    |-папка 112 (01:51)
  |      |
  |      |-файл 1112 (01:51)
  |
  |-папка 2 (01:53)
     |
     |-папка 21 (01:53)
       |
       |-папка 211 (01:53)
         |
         |-файл 2111 (01:53)
спустя 46 минут [обр] Thirteensmay(0/157)[досье]
По моему вполне достаточно таблицы посещений пользователей (user_id, resource_id, visit_date), и информации о обновлении ресурсов (resource_id, update_date), что организуется весьма просто, в результате задача решается элементарным SQL запросом.
спустя 20 часов [обр] Agar -Agar(0/68)[досье]

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

Сейчас сделал движок на Перл с выдачей дат обновления по всем каталогам любого уровня вложенности, с отображением дерева навигации от главного каталога до исходного. Среднее время генерации страницы 0,03 с, хотя это мало о чем говорит. Хотелось бы сделать отображение еще более юзабельным, чтобы каждый пользователь ориентировался не только по датам, но и по цвету ссылок, чтобы сразу было видно, где что обновилось. Теоретически должен работать варант, когда каждой папке запишу вложенные файлы, в том числе из других подпапок. Но это большой объем и нерационально, особенно для солидного портала с неограниченным уровнем вложенности. Из предыдущего сообщения примерно понял, что там речь идет о времени как об истории обновления каждой папки, допустим, до 100-й переделок. Но как опять же привязать это к пользователю? Может, знатоки баз подскажут, как там примерно все устроено в этом плане?

спустя 1 час 39 минут [обр] Thirteensmay(0/157)[досье]

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

Что касается:

Но тут вылезает проблема: допустим, пользователь посетил последнюю обновленную страничку-условный файл. Тогда все что выше будет для него отображаться как посещенное. Но ведь он мог еще не посетить и другие страницы-условные файлы, которые обновлялись раньше ?

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

Вроде все просто, что конкретно у вас вызывает затруднение ?

спустя 25 минут [обр] Agar -Agar(0/68)[досье]

Спасибо, как сделаю, буду в других проектах наверное думать работать с базами.

Насчет отображения. Мне нужно показывать не конкретный файл когда обновился — здесь все просто и понятно. Мне нужно показывать, обновились ли для пользователя каталоги выше. Если по схеме, которую нарисовал в начале, новый пользователь сразу идет к условному файлу 2111, то ему после посещения выдается, что во всех папках уже все просмотрено, т.к. время 01:53 старше, чем у всех других файлов и папок, хотя он не видел еще файлы 1111 и 1112.

спустя 39 минут [обр] Thirteensmay(0/157)[досье]
тут вы не правильно мыслите, посещенным должен считаться только тот ресурс который был непосредственно посещен, посещения на его вышестоящие папки не проставляются, они как я писал выше затрагиваются только когда изменяется дата обновления ресурса
Т.е. когда пользователь просматривает файл изменяется только дата просмотра этого файла, дата просмотра его папки не изменяется, потому что пользователь не смотрел папку. Вот когда он посмотрит папку тогда дата ее просмотра и измениться, не раньше. По факту просмотра файлов в папке дата просмотра папки не меняется. Иначе во первых возникает описанная вами проблема, во вторых сами представьте, захожу я и вижу что папка обновилась, меня это заинтересовывает, захожу в нее - вижу что обновились файлы не интересные мне, не смотрю их, выхожу, опять вижу что папка "обновилась" ? хотя реально в ней ничего не обновилось и я уже в ней был. А так, получится все нормально, будет казать что папка не обновилась, т.к. реально не обновлялась с момента моего последнего захода, уйдет также описанная вами проблема, получится что некоторые папки будут показываться не обновленными с момента последнего просмотра, но в них будут "обновленные" файлы которые мы не смотрели, что нормально и без описанных выше косяков.
спустя 20 часов [обр] Agar -Agar(0/68)[досье]

Thirteensmay[досье], мне и надо, чтобы папки "светились", пока я не посмотрю все изменения или не нажму кнопку "пометить все темы прочтенными"(вроде, кнопка Друкса называется)для конкретного раздела. Т.е. если применить к этому форуму, при изменениях и появлении новых тем должны быть маркированы красным цветом все обновленные и новые папки в разделе "Теория и алгоритмы", а так же ссылки на разделы "Теория и алгоритмы", "Программирование", "Форумы". Пока решение вырисовывается некрасивое, и думаю, именно оно работает в "черном ящике" а именно при любом запросе перечитывание всей структуры с датами обновлений или же хранение информации о каждом файле во всех папках уровнями выше. Но не переписывать же все темы для каждой папки, тем более, в моей структуре с самодельными базами многое хранится в отдельных файлах, и при запросе открывается всего 1-3 файла, что чрезвычайно позитивно сказывается на скорости загрузки и обработки.

Может, я неправильно сформулировал вопрос? Ведь такая штука очень распространена и работает на большинстве форумов.

спустя 11 минут [обр] Thirteensmay(0/157)[досье]
Точно чтобы "светились", пока я не посмотрю все изменения ? Или все таки "потухали" после просмотра если не изменились ? Вы сайт для себя делаете или для пользователей ? Конечно не сложно сделать и по первому варианту, но помоему это не разумно.
спустя 19 минут [обр] Agar -Agar(0/68)[досье]

Да-да, в том и соль, именно чтобы были выделены цветом, пока пользователь все не просмотрит или не нажмет кнопку Друкса для выбранного раздела. По-моему, как раз было бы чрезвычайно удобно. Т.е. захожу я, к примеру, на Xpoint.ru, вижу, что ссылка "форумы" маркирована цветом, захожу на форумы, вижу, что "светится" Программирование, захожу в раздел программирование, вижу, что светится "Теория и алгоритмы", дальше идти не хочу, жму кнопку Друкса, ссылка "Теория и алгоритмы" принимает нормальный цвет, все персчитывается и если в других разделах нет ничего нового, вполть до раздела "форумы" ссылки становятся посещенными.

В-принципе, можно сделать такое для 2-3 уровней, но у меня число таких вложенностей неограниченно. Может, задача без серьезной нагрузки нерешаема и потому форумы обычно делают 2-3 уровневыми?

спустя 11 минут [обр] Thirteensmay(0/157)[досье]
Сдается мне что кнопка друкса - костыль, зачем чтото дополнительно нажимать если можно не нажимать, затруднение приводит к покладыванию на функционал, я например такой, и я такой не один, и визжать что отображение обновленности сделано криво - буду, рассказывайте потом что на самом деле не криво а надо вот тут чтото дополнительно дотелодвигать ;)
Powered by POEM™ Engine Copyright © 2002-2005