Возраст человека

Как, имея в ТВ параметре дату рождения, вывести на странице «Возраст ХХХ лет»?
Михаил Боровов
05 февраля 2017, 20:55
modx.pro
4
3 075
0

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

Кирилл Бакулин
06 февраля 2017, 00:25
0
<?php 
$age = DateTime::createFromFormat('d/m/Y', '29/02/1880')
     ->diff(new DateTime('now'))
     ->y;
echo $age;
 ?>
    Михаил Боровов
    06 февраля 2017, 00:28
    0
    Спасибо, а можно откомментировать что за что отвечает?

    29/02/1880 — это вообще что? )))
      Алексей Ерохин
      06 февраля 2017, 01:13
      0
      Создается объект DateTime из даты в TV
      'd/m/Y' — формат хранения даты в TV, d — дни с начальным 0, m — месяцы с начальным нулем, Y — год 4 цифры
      '29/02/1880' — собственно дата рождения из TV
      diff — вычисляет разницу между созданным объектом и текущей датой (now = сейчас)
      y — вывод количеств полных лет из этой разницы, что будет соответствовать возрасту человека

      Вам нужно поменять формат согласно дате в вашей TV.
        Михаил Боровов
        06 февраля 2017, 01:18
        0
        Алексей, доброй ночи.
        Я так понимаю, что надо создать сниппет?
        В нем как вставить данные из ТВ? (ТВ называется birthday)
        и как потом его корректно вызвать на странице?
          Алексей Ерохин
          06 февраля 2017, 01:25
          0
          Пишите сниппет
          $age = DateTime::createFromFormat('d/m/Y', $input)
               ->diff(new DateTime('now'))
               ->y;
          return $age;
          Вызываете его как модификатор на TV
          В чанке:
          [[+tv.birthday:snippet]]
            Михаил Боровов
            06 февраля 2017, 01:42
            0
            Создал сниппет:



            вызвал на странице:

            <strong>Возраст:</strong>
             [[+tv.birthday:ages]]
            Не получилось.
            Вообще теперь пустая страница ((
              Алексей Ерохин
              06 февраля 2017, 01:50
              0
              В каком виде хранится дата в TV? Можно прямо в базе данных глянуть, что записывается
                Михаил Боровов
                06 февраля 2017, 02:04
                0
                вот пример:
                1999-03-11 00:05:00
                  Алексей Ерохин
                  06 февраля 2017, 02:07
                  0
                  Поменяйте в сниппете 'd/m/Y' на 'Y-m-d H:i:s'
                    Михаил Боровов
                    06 февраля 2017, 02:18
                    0
                    отлично!
                    Огромное спасибо!!!

                    Сделал сниппет:

                    <?php
                    $age = DateTime::createFromFormat('Y-m-d H:i:s', $input)
                         ->diff(new DateTime('now'))
                         ->y;
                    return $age;
                    вызов:

                    [[+tv.birthday:ages]]
                    Еще есть вопрос: как сделать чтобы после цифры добавлялось 20 лет, но 21 год и 22 года?
                      Максим Кузнецов
                      06 февраля 2017, 06:52
                      1
                      +2
                      $cases = array(2, 0, 1, 1, 1, 2);
                      $titles = array('год', 'года', 'лет');
                      			
                      return $titles[($input % 100 > 4 && $input % 100 < 20) ? 2 : $cases[min($input % 10, 5)]];
                      Михаил Боровов
                      06 февраля 2017, 09:37
                      0
                      Доброе утро, можно полностью весь код сниппета написать?
                      А то добавил и не получилось (((
                      Максим Кузнецов
                      06 февраля 2017, 10:00
                      +1
                      Это и есть весь код сниппета. Используется так:
                      [[+age:имя_сниппета]]

                      В вашем примере будет как-то так:
                      [[+tv.birthday:ages:имя_сниппета]]
                      Или так:
                      [[!имя_сниппета? &input=`[[+tv.birthday:ages]]`]]
                      Михаил Боровов
                      06 февраля 2017, 10:04
                      0
                      «лет» выводится, а цифра из сниппета ages перестала выводиться.
                      Андрей Коробков
                      06 февраля 2017, 10:20
                      0
                      [[+tv.birthday:ages]] [[+tv.birthday:ages: имя_сниппета]]
                      Михаил Боровов
                      06 февраля 2017, 10:39
                      0
                      Так то работает, но конструкция сложная.
                      Но и на том спасибо!
                      Все равно решение ))))
                Василий Столейков
                06 февраля 2017, 07:39
                1
                0
                А если дата рождения хранится в timestamp, получится в таком случае воспользоваться этим кодом?
Андрей Коробков
06 февраля 2017, 20:55
0
Подытожу, сниппет ages с выводом текста:
<?php
$cases = array(2, 0, 1, 1, 1, 2);
$titles = array('год', 'года', 'лет');
$age = DateTime::createFromFormat('Y-m-d H:i:s', $input)
     ->diff(new DateTime('now'))
     ->y;
$title = $titles[($age % 100 > 4 && $age % 100 < 20) ? 2 : $cases[min($age % 10, 5)]];
return $age . " " . $title;
и вызов [[+tv.birthday:ages]]
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    20