Автоматическое увеличение числа (стаж работы) в определенный день каждый год.
Доброго времени суток.
На сайте есть раздел с преподавательским составом. В информации про преподавателя есть пункт «стаж», записанный таким образом:
Пока что дошел до такого:
• Создал новый сниппет, в котором, определяю текущую дату и сравниваю её с нужной датой. Затем увеличиваю число стажа, если дата подходит (так же в нём записана функция, которая в зависимости от числа подставляет слово «год» в правильно склонении – 1 год; 12 лет и т.д.):
Можно ли это дело сделать так что бы срабатывало на стороне сервера в определенный день и даже, если пользователь зайдет месяц (условно) спустя, то увидит уже новый стаж? Желательно без использования БД…
На сайте есть раздел с преподавательским составом. В информации про преподавателя есть пункт «стаж», записанный таким образом:
<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. И если я правильно понимаю, то изменение срабатывает только для того пользователя, который зашел на страницу.Можно ли это дело сделать так что бы срабатывало на стороне сервера в определенный день и даже, если пользователь зайдет месяц (условно) спустя, то увидит уже новый стаж? Желательно без использования БД…
Комментарии: 8
А не легче держать дату отсчёта и при выводе вычислять текущую дату? (Вопрос риторический)
Теоретически да, но это нужно сначала подсчитать для каждого учителя дату начала работы. И, опять же, она разная для всех, так что нужно будет всё равно указывать, как сейчас.
Правильно выше сказали — достаточно просто динамически подсчитывать стаж на основе даты заполнения.
Т.е. у каждого преподавателя должна быть дата, от которой нужно отсчитывать стаж, а затем нужно банально вычесть эту дату из текущей, округлив до лет.
Подсчитывать такие вещи через крон на сервере — лишняя головная боль.
Т.е. у каждого преподавателя должна быть дата, от которой нужно отсчитывать стаж, а затем нужно банально вычесть эту дату из текущей, округлив до лет.
Подсчитывать такие вещи через крон на сервере — лишняя головная боль.
Переписал таким образом:
допустим учитель начал работать в 1990 году. Значит на 02.06.2020 у него стаж 30 лет. И на 15.02.2021 всё ещё 30 лет. 31 год должен стать только после 01.06.2021. А сейчас 31 год становится, если ставлю дату, например, 15.04.2021.
$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.
$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, например), от которой нужно отсчитывать опыт.На выходе получаешь точное количество лет опыта.
Спасибище, работает!
Уровень владения MODX и php у меня ещё очень низкий :(
А за итоговое число лет отвечает $diff, правильно? Пытался подставить в функцию format_by_count, но не работает. Вообще не выводит ни одного слова.
Уровень владения MODX и php у меня ещё очень низкий :(
А за итоговое число лет отвечает $diff, правильно? Пытался подставить в функцию format_by_count, но не работает. Вообще не выводит ни одного слова.
А за итоговое число лет отвечает $diff, правильно?Не совсем, в $diff находится объект, который содержит в себе всю информацию об интервале между текущей датой и той, которая указана в from. Ты можешь распечатать его через print_f и посмотреть, что там есть. Оттуда можно достать даже точное количество дней между этими датами.
Подробнее можно почитать тут и тут.
Пытался подставить в функцию format_by_count, но не работаетвместо
return $diff->format('%Y');
пишешь$output = $diff->format('%Y');
return format_by_count($output);
Получилось :) Спасибо за помощь!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.