Автоматическое увеличение числа (стаж работы) в определенный день каждый год.

Доброго времени суток.
На сайте есть раздел с преподавательским составом. В информации про преподавателя есть пункт «стаж», записанный таким образом:
<p>пед. стаж: <span style="font-family:georgia,serif;"><em><strong>12 років</strong></em></span></p>
Каждый год, как вы понимаете, стаж увеличивается. Подскажите как бы правильно это дело автоматизировать.
Пока что дошел до такого:
• Создал новый сниппет, в котором, определяю текущую дату и сравниваю её с нужной датой. Затем увеличиваю число стажа, если дата подходит (так же в нём записана функция, которая в зависимости от числа подставляет слово «год» в правильно склонении – 1 год; 12 лет и т.д.):
<?php
  $oldStazh; //текущий стаж, записанный вручную

  $todayYear = date('Y');
  $mustBeDate = '01.06';
  $todayDate = date('d.m'); //день, когда стаж должен увеличиться
  $stazh = $oldStazh + $todayYear - 2020; //новый стаж
  if ($mustBeDate == $todayDate) $stazh++; //увеличиваем стаж, если сегодня 01.06

//функция для того что бы правильное окончание выдавало в слове "год"
if (!function_exists('format_by_count')) {
    function format_by_count($stazh)
    {
        if($stazh % 10 == 1 && $stazh % 100 != 11)
            return 'рік';
        if($stazh % 10 >= 2 && $stazh % 10 <= 4 && ($stazh % 100 < 10 || $stazh % 100 > 20))
            return 'роки';
        return 'років';
    }
}

return $stazh . ' ' . format_by_count($stazh);
• На странице где нужно выводить информацию о стаже вызываю созданный сниппет и передаю туда значение стажа на текущий год:
<p>пед. стаж: <span style="font-family:georgia,serif;"><em><strong>[[!pedStazh? &oldStazh=`25`]]</strong></em></span></p>
Поигрался на локальной копии меняя время в системе. Ставлю точную дату 01.06.2020 – стаж увеличивается. Ставлю 01.06.2021 – стаж увеличивается ещё на 1. Но если поставить дату 01.07.2020 стаж возвращается к значению $oldStazh. И если я правильно понимаю, то изменение срабатывает только для того пользователя, который зашел на страницу.
Можно ли это дело сделать так что бы срабатывало на стороне сервера в определенный день и даже, если пользователь зайдет месяц (условно) спустя, то увидит уже новый стаж? Желательно без использования БД…
Lem
Lem
01 июля 2020, 18:26
modx.pro
613
0

Комментарии: 8

Баха Волков
01 июля 2020, 20:48
+1
А не легче держать дату отсчёта и при выводе вычислять текущую дату? (Вопрос риторический)
    Lem
    Lem
    01 июля 2020, 20:58
    0
    Теоретически да, но это нужно сначала подсчитать для каждого учителя дату начала работы. И, опять же, она разная для всех, так что нужно будет всё равно указывать, как сейчас.
    Артем
    01 июля 2020, 21:21
    0
    Правильно выше сказали — достаточно просто динамически подсчитывать стаж на основе даты заполнения.
    Т.е. у каждого преподавателя должна быть дата, от которой нужно отсчитывать стаж, а затем нужно банально вычесть эту дату из текущей, округлив до лет.

    Подсчитывать такие вещи через крон на сервере — лишняя головная боль.
      Lem
      Lem
      02 июля 2020, 13:20
      0
      Переписал таким образом:
      $stazhStart; //значение передаю вызывая сниппент на странице
      $mustBeDate = '01.06';
      $todayDate = date('d.m');
      $startYear = '2019';
      $todayYear = date('Y');
      $stazh = $startYear - $stazhStart;
      if ($todayDate > $mustBeDate && $todayYear > $startYear) $stazh = $todayYear - $stazhStart;
      Но стаж увеличивается в любой день и месяц, если год больше $startYear. Мне нужно что бы работало так:
      допустим учитель начал работать в 1990 году. Значит на 02.06.2020 у него стаж 30 лет. И на 15.02.2021 всё ещё 30 лет. 31 год должен стать только после 01.06.2021. А сейчас 31 год становится, если ставлю дату, например, 15.04.2021.
        Артем
        02 июля 2020, 16:53
        1
        +1
        $from = $modx->getOption('from', $scriptProperties);
        try {
            $date = new DateTime($from);
            $diff = (new DateTime())->diff($date);
            return $diff->format('%Y');
        } catch (Exception $e) {
            return 'An error occurred while calculating experience: ' . $e->getMessage();
        }
        На вход принимает один параметр — from, где ты должен указать полную дату (02.06.1990, например), от которой нужно отсчитывать опыт.
        На выходе получаешь точное количество лет опыта.
          Lem
          Lem
          02 июля 2020, 17:41
          0
          Спасибище, работает!
          Уровень владения MODX и php у меня ещё очень низкий :(
          А за итоговое число лет отвечает $diff, правильно? Пытался подставить в функцию format_by_count, но не работает. Вообще не выводит ни одного слова.
            Артем
            02 июля 2020, 17:58
            +1
            А за итоговое число лет отвечает $diff, правильно?
            Не совсем, в $diff находится объект, который содержит в себе всю информацию об интервале между текущей датой и той, которая указана в from. Ты можешь распечатать его через print_f и посмотреть, что там есть. Оттуда можно достать даже точное количество дней между этими датами.
            Подробнее можно почитать тут и тут.

            Пытался подставить в функцию format_by_count, но не работает
            вместо
            return $diff->format('%Y');
            пишешь
            $output = $diff->format('%Y');
            return format_by_count($output);
              Lem
              Lem
              02 июля 2020, 18:25
              +1
              Получилось :) Спасибо за помощь!
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      8