Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

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

Модераторы: Vl@d1m1r, Lorem Ipsum, Atlas

Правила форума
----
Аватара пользователя
ursego
Свой на все 100
Свой на все 100
Сообщения: 478
Стаж: 11 лет 2 месяца
Откуда: Днепропетровск
Контактная информация:

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Сообщение ursego »

Предлагаю сверх-лёгкое решение, которое высвечивает сообщение в формате "Форуму 3 года 11 месяцев и 5 дней" с соблюдением правильности русского языка.

Показ возраста - штука нелишняя для молодого форума, и вот почему: предположим кто-то забрёл на форум, на котором всего несколько сот или тысяч сообщений. Как можно понять эту информацию? Если форум старый, то очевидно, что он "не состоялся", бежать от такого подальше! Но если форум появился недавно, то солидное число сообщений ещё просто не успело накопиться - стОит поглядеть что это за тусовочка... Конечно, можно просто указать дату создания, но предлагаемое решение, по-моему, элегантней (уж прикольней - точно! :ps_ih: ).

Следующий фрагмент надо просто вставить в HTML в том месте, где хотите показывать возраст (Перед правкой поставить в выбранном шаблоне кодировку UTF-8 без BOOM иначе будут кракозябры):

Код: Выделить всё

<!-- Высветить "Форуму ... лет ... месяцев и ... дней" BEGIN -->
<SCRIPT language=JavaScript>
<!--
var fD = [2012, 7, 25], d1 = 6, m1 = 4, tx = [], rz, d = new Date,
tD = [d.getFullYear (), d.getMonth (), d.getDate ()], dr = tD [2] - fD [2],
mr = tD [1] - fD [1], yr = tD [0] - fD [0], Y = 'год-года-лет',
M = 'месяц-месяца-месяцев', D = 'день-дня-дней', t = function (v, w) {
var x = w.toString ().split (''), y = x [x.length - 1], z = 0; if (w > 4 && w < 21
|| y == 0) z = 2; else if (y > 1 && y < 5) z = 1; else if (y > 4) z = 2; return ' ' + v.split ('-') [z]}
if (dr < 0) dr = tD [2] + d1, mr--; if (yr > 0 && mr < 0) yr -= 1; if (mr < 0) mr = tD [1] + m1; 
var yt = (yr) ? yr + t (Y, yr) : ''; if (yt) tx [tx.length] = yt;
var mt = (mr) ? mr + t (M, mr) : ''; if (mt) tx [tx.length] = mt;
var dt = (dr) ? dr + t (D, dr) : ''; if (dt) tx [tx.length] = dt;
if (tx.length == 1) rz = tx [0];
if (tx.length == 2) rz = tx.join (' и ');
if (tx.length == 3) rz = tx [0] + ', ' + tx [1] + ' и ' + tx [2];
document.write("Форуму <strong>" + rz + "</strong> (основан 25 авг 2012)");
-->
</SCRIPT>
<!-- Высветить "Форуму ... лет ... месяцев и ... дней" END -->
Даты замените на дату создания вашего форума (памятуя о том, что в джаваскрипте месяца нумеруются от 0 до 11 - именно поэтому у меня стоИт "7" для августа: "var fD = [2012, 7, 25]").

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

Важный ремарк: автор кода - не я, мне его дали в готовом виде на форуме программистов (и автор разрешил опубликовать его здесь).
#1
Аватара пользователя
DeaDRoMeO
Старожил Форума
Старожил Форума
Сообщения: 16763
Стаж: 13 лет
Откуда: Витебск
Контактная информация:

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Сообщение DeaDRoMeO »

Отлично, и модов не нужно))
На вопросы, связанные с phpBB, по ЛС не отвечаю !!!
#2
Аватара пользователя
DeaDRoMeO
Старожил Форума
Старожил Форума
Сообщения: 16763
Стаж: 13 лет
Откуда: Витебск
Контактная информация:

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Сообщение DeaDRoMeO »

Скрипт некорректно считает, допустим от 21 ноября 2009 года, тему в мусор скорее всего отправить придется
На вопросы, связанные с phpBB, по ЛС не отвечаю !!!
#3
Аватара пользователя
ursego
Свой на все 100
Свой на все 100
Сообщения: 478
Стаж: 11 лет 2 месяца
Откуда: Днепропетровск
Контактная информация:

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Сообщение ursego »

Ну так исправь чтоб было корректно, и человечество скажет спасибо! Функционал-то интереснейший.

Кстати, у меня вроде правильно работает:

Форуму 1 год и 26 дней (основан 25 авг 2012)

Но, возможно, ещё не наступила дата, когда скрипт заглючит.
#4
Аватара пользователя
DeaDRoMeO
Старожил Форума
Старожил Форума
Сообщения: 16763
Стаж: 13 лет
Откуда: Витебск
Контактная информация:

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Сообщение DeaDRoMeO »

Я в яве ноль, да и искать долго скрипт. Взял и поставил этот мод - https://www.phpbb.com/customise/db/mod/ ... e_on_index. Пример работы - напротив подфорума I-Valll
На вопросы, связанные с phpBB, по ЛС не отвечаю !!!
#5
Аватара пользователя
ursego
Свой на все 100
Свой на все 100
Сообщения: 478
Стаж: 11 лет 2 месяца
Откуда: Днепропетровск
Контактная информация:

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Сообщение ursego »

DeaDRoMeO писал(а):Пример работы - напротив подфорума I-Valll
Ничего не путаешь?
#6
Аватара пользователя
DeaDRoMeO
Старожил Форума
Старожил Форума
Сообщения: 16763
Стаж: 13 лет
Откуда: Витебск
Контактная информация:

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Сообщение DeaDRoMeO »

Чего мне путать то ???
На вопросы, связанные с phpBB, по ЛС не отвечаю !!!
#7
Аватара пользователя
ursego
Свой на все 100
Свой на все 100
Сообщения: 478
Стаж: 11 лет 2 месяца
Откуда: Днепропетровск
Контактная информация:

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Сообщение ursego »

Не знаю чего, но путаешь. На всякий случай повторю о чём речь в этой теме:
ursego писал(а):решение, которое высвечивает сообщение в формате "Форуму 3 года 11 месяцев и 5 дней" с соблюдением правильности русского языка
Решений, которые просто показывают сколько дней - уйма в интернете, у меня сначала такое стояло, но это "невкусно".
#8
Аватара пользователя
DeaDRoMeO
Старожил Форума
Старожил Форума
Сообщения: 16763
Стаж: 13 лет
Откуда: Витебск
Контактная информация:

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Сообщение DeaDRoMeO »

Теперь понял)
На вопросы, связанные с phpBB, по ЛС не отвечаю !!!
#9
Аватара пользователя
Олег В
Активно общаюсь
Активно общаюсь
Сообщения: 340
Стаж: 11 лет
Контактная информация:

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Сообщение Олег В »

У меня всё подсчитывает верно! :-00):
ursego, Спасибо! :uch_tiv:

[hide][/hide]
#10
Аватара пользователя
ursego
Свой на все 100
Свой на все 100
Сообщения: 478
Стаж: 11 лет 2 месяца
Откуда: Днепропетровск
Контактная информация:

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Сообщение ursego »

Олег В писал(а):ursego, Спасибо!
Пожалуйста от имени того программиста, который написал скрипт.
Олег В писал(а):У меня всё подсчитывает верно!
Честно говоря, я не очень обольщаюсь - вполне возможно, что баг проявляется при определённой комбинации дня, месяца и года (до которой я ещё не дошёл). У меня раньше другой скрипт стоял - показывал нормально, а когда форуму исполнился год, то вместо "1 год" высветил "12 месяцев".
DeaDRoMeO писал(а):Скрипт некорректно считает, допустим от 21 ноября 2009 года
А в чём конкретно косяк-то был? Какой возраст высветился?
#11
Аватара пользователя
Олег В
Активно общаюсь
Активно общаюсь
Сообщения: 340
Стаж: 11 лет
Контактная информация:

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Сообщение Олег В »

ursego писал(а):А в чём конкретно косяк-то был? Какой возраст высветился?
Вот что показывает если выставить дату DeaDRoMeO,

Код: Выделить всё

Форуму 3 года, 12 месяцев и 26 дней (основан 21 ноября 2009г)
Но 12 месяцев и 26 дней быть не может. должно быть так по моему

Код: Выделить всё

Форуму 4 года, 0 месяцев и 26 дней (основан 21 ноября 2009г)
но даже если не брать этот факт во внимание, всё равно подсчёт не верен. По итогу, правильно должно быть вроде так.

Код: Выделить всё

Форуму 3 года, 10 месяцев и 30 дней (основан 21 ноября 2009г)
#12
Аватара пользователя
Олег В
Активно общаюсь
Активно общаюсь
Сообщения: 340
Стаж: 11 лет
Контактная информация:

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Сообщение Олег В »

как по мне, правда с меня ещё тот математик. Ошибку создаёт именно этот момент 12 месяцев и 26 дней. Вот этот 13-ты месяц и путает все вычисления!
#13
Аватара пользователя
ursego
Свой на все 100
Свой на все 100
Сообщения: 478
Стаж: 11 лет 2 месяца
Откуда: Днепропетровск
Контактная информация:

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Сообщение ursego »

Ну, я когда дойду до проблем, тогда и буду думать как решить. Пока работает как швейцарские часы.
#14
Аватара пользователя
Олег В
Активно общаюсь
Активно общаюсь
Сообщения: 340
Стаж: 11 лет
Контактная информация:

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Сообщение Олег В »

ursego писал(а):Ну, я когда дойду до проблем, тогда и буду думать как решить.
Думаю что Вашему знакомому эту проблему решить будет не сложно и в данный момент. Зачем ждать проблем то? Швейцарские часы не должны требовать доработок в будущем. Их вообще разбирать не рекомендуется! :ne_ne_ne:
#15
Аватара пользователя
Олег В
Активно общаюсь
Активно общаюсь
Сообщения: 340
Стаж: 11 лет
Контактная информация:

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Сообщение Олег В »

В общем всё вроде заработало нормально.
Проблема с 13 -тым месяцем решается заменой. в строке

Код: Выделить всё

var fD = [2012, 7, 25], d1 = 6, m1 = 4, tx = [], rz, d = new Date,
заменить цифру 4 в m1 = на цифру 3.
#16
Аватара пользователя
DeaDRoMeO
Старожил Форума
Старожил Форума
Сообщения: 16763
Стаж: 13 лет
Откуда: Витебск
Контактная информация:

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Сообщение DeaDRoMeO »

Олег В писал(а):заменить цифру 4 в m1 = на цифру 3.
Вот если бы получить код с комментариями, тогда проще было б, а так фиг поймешь за что отвечает какая то переменная
На вопросы, связанные с phpBB, по ЛС не отвечаю !!!
#17
Аватара пользователя
ursego
Свой на все 100
Свой на все 100
Сообщения: 478
Стаж: 11 лет 2 месяца
Откуда: Днепропетровск
Контактная информация:

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Сообщение ursego »

Там проблема в некачественных именах переменных. Имя переменной должно дать исчерпывающий ответ на вопрос "ой, а шо это за переменная?" - да так, чтобы не было нужды в комментариях. Сам алгоритм-то пустяковый, но я как увидел эти клинические имена - сразу пропало желание возиться.
#18
Аватара пользователя
белк
Хорошо тут живется
Хорошо тут живется
Сообщения: 1322
Стаж: 10 лет 6 месяцев
Откуда: Россия
Контактная информация:

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Сообщение белк »

Спасибо за простой скрипт. Удобно.
три головы - это хорошо. но как же трудно придти к согласию...
* белк может помочь, но ставить за кого-то моды не будет... ни платно, ни бесплатно. *
#19
Аватара пользователя
ursego
Свой на все 100
Свой на все 100
Сообщения: 478
Стаж: 11 лет 2 месяца
Откуда: Днепропетровск
Контактная информация:

Показ возраста форума - "Форуму Х лет Х месяцев и Х дней"

Сообщение ursego »

Короче, задолбала меня глючность предыдущего скрипта (приходилось что-то менять 2 раза в месяц чтоб правильно показывал - то туда, то обратно) и я нашёл другой скрипт. Правда, он был англоязычный, ну а уж я русифицировал его как смог (начиная с объявления переменной res - это уже моя самодеятельность). В общем, ниже выкладываю готовый кусок джаваскрипта. Только не забудьте инициализировать переменные yearDob, monthDob и dateDob датой создания Вашего форума (не забывая, что индекс месяца, помещаемый в monthDob, на единицу меньше его порядкового номера т.к. в джаваскрипте месяца нумеруются с нуля - например, я помещаю туда 7, что значит "август"; на года и дни это не распространяется - я помещаю 2012 для 2012-го года и 25 для 25-го числа).

Правда, имеется баг - now.getYear() почему-то возвращает неправильный текущий год, так что я заполняю переменную yearNow просто числом 2014 (как исправлю - отпишусь).

Код: Выделить всё

<!-- Высветить "Форуму ... лет ... месяцев и ... дней" BEGIN -->
<SCRIPT language=JavaScript>
<!--
  var now = new Date();
  var today = new Date(now.getYear(),now.getMonth(),now.getDate());
 
  var yearNow = 2014; //now.getYear();
  var monthNow = now.getMonth();
  var dateNow = now.getDate();
 
  var yearDob = 2012;
  var monthDob = 7;
  var dateDob = 25;
  var age = {};
 
  yearAge = yearNow - yearDob;
 
  if (monthNow >= monthDob)
    var monthAge = monthNow - monthDob;
  else {
    yearAge--;
    var monthAge = 12 + monthNow -monthDob;
  }

  if (dateNow >= dateDob)
    var dateAge = dateNow - dateDob;
  else {
    monthAge--;
    var dateAge = 31 + dateNow - dateDob;
 
    if (monthAge < 0) {
      monthAge = 11;
      yearAge--;
    }
  }

  age = {
      years: yearAge,
      months: monthAge,
      days: dateAge
      };

var res = "Форуму "; // result

if (age.years == 1)
   res += "<strong>1</strong> год";
else if (age.years > 1 && age.years < 5)
   res += "<strong>" + age.years + "</strong> года";
else if (age.years >= 5)
   res += "<strong>" + age.years + "</strong> лет";

if (age.days == 0)
   res += " и ";
else
   res += ", ";

if (age.months == 1)
   res += "<strong>1</strong> месяц";
else if (age.months > 1 && age.months < 5)
   res += "<strong>" + age.months + "</strong> месяца";
else if (age.months >= 5)
   res += "<strong>" + age.months + "</strong> месяцев";

if ((age.years > 0 || age.months > 0) && age.days > 0)
   res += " и ";

if (age.days == 1 || age.days == 21)
   res += "<strong>" + age.days + "</strong> день";
else if (age.days == 2 || age.days == 3 || age.days == 4 || age.days == 22 || age.days == 23 || age.days == 24)
   res += "<strong>" + age.days + "</strong> дня";
else if (age.days >= 5)
   res += "<strong>" + age.days + "</strong> дней";

document.write(res);
-->
</SCRIPT>
<!-- Высветить "Форуму ... лет ... месяцев и ... дней" END -->
#20
Ответить