Разница в датах документа опубликовано и снято

Подскажите пожалуйста, как можно вывести разницу во времени публикации и снято с публикации документа.
Например, должно выводится так:
до отмены публикации документа осталось 8 дней 23ч 30 мин 20 сек
Евгений Генералов
09 декабря 2015, 10:05
modx.pro
2
2 501
+2

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

Лев Вербицкий
09 декабря 2015, 13:33
+1
Все просто, можно, например, использовать такой сниппет.
Выдаст разницу между текущем временем и временем окончания публикации.
/* Сниппет untilEndPublish */
$until_end_publish = $modx->resource->unpub_date - time();
return date('d дней, H часов, m минут, s секунд ',$until_end_publish);
Вызов на странице с ресурсом: [[!untilEndPublish]].
    Сергей Шлоков
    09 декабря 2015, 13:34
    +1
    … и каждую секунду обновлять страницу. :)
      Лев Вербицкий
      09 декабря 2015, 13:36
      0
      Сергей, если вы подругому не умеете, можете обновлять :) А я бы дописал к этому еще обратный отсчет на js)
        Сергей Шлоков
        09 декабря 2015, 13:40
        +1
        Ну попробуйте дописать js к вашему сниппету, а я посмотрю и поучусь.
    Евгений Генералов
    09 декабря 2015, 15:23
    +2
    Спасибо большое за подсказку. Я не знал как получить дату в нужном формате, почему то с глупости пытался сделать по другому.
Сергей Шлоков
09 декабря 2015, 13:35
+1
Перед тем как задать вопрос я бы начал с Яндекса — javascript таймера обратного отсчета.
    Лев Вербицкий
    09 декабря 2015, 13:37
    0
    А что толку от таймера, если человеку надо сначала время получить? По той ссылке, что вы кинули на яндекс, это не очень понятно.
      Сергей Шлоков
      09 декабря 2015, 13:41
      0
      А по вашему сниппету все супер мега понятно. Мда.
      П.С. Сразу видно — школа Николая.
        Лев Вербицкий
        09 декабря 2015, 13:42
        +1
        Мой сниппет отдает время до окончания публикации, об этом и был вопрос. Про таймеры в вопросе не было ни слова.
          Сергей Шлоков
          09 декабря 2015, 13:46
          +1
          Точно.
          П.С. Анекдот вспомнился:
          — Товарищ прапорщик, разрешите спросить, под каким углом надо выстрелить из пушки, чтобы снаряд улетел максимально далеко?
          — Спрашивайте.
          ))
            Лев Вербицкий
            09 декабря 2015, 13:48
            +3
            Сергей, напишите ваше решение, если вы такой всезнающий. Мое тут есть, вашего нету. Человеку надо получить ответ на вопрос, а не смотреть наши дебаты.
    Евгений Генералов
    25 декабря 2015, 12:50
    1
    0
    Если кому то будет интересно, то я сделал так:
    <?php
    /* Сниппет untilEndPublish */
    if (isset($pageId)){
        $res = $modx->getObject('modResource',$pageId);
        $until_end_publish = $res->unpub_date;
        $until_end_publish -= time();
    }
    else{$until_end_publish = $modx->resource->unpub_date - time();}
    
    if ($until_end_publish < 0){
        return "Время вышло";
    }
    if($until_end_publish < 3600){
        return date('i минут, s секунд ',$until_end_publish);
    }
    if ($until_end_publish < 86400){
        return date('G часов, i минут, s секунд ',$until_end_publish);
    }
    if ($until_end_publish > 86400){
        return date('d дней, G часов, i минут, s секунд ',$until_end_publish);
    }
    И вызов:
    [[!untilEndPublish? &pageId=`[[*id]]`]]
      Евгений Генералов
      25 декабря 2015, 12:58
      0
      А если нужно живой счетчик то так:
      <?php
      /* Сниппет untilEndPublish */
      if (isset($pageId)){
          $res = $modx->getObject('modResource',$pageId);
          $until_end_publish = $res->unpub_date;
          $until_end_publish -= time();
      }
      else{$until_end_publish = $modx->resource->unpub_date - time();}
      return $until_end_publish;
      И JS на фронте:
      <div id="company-timer-[[*id]]" class="c2">[[!untilEndPublish? &kuponId=`[[*id]]`]]</div>
      <script type="text/javascript">new CreateTimer("company-timer-[[*id]]", [[!untilEndPublish? &kuponId=`[[*id]]`]]);</script>
      var Timer;
      var TotalSeconds;
      
      function CreateTimer(TimerID, Time) {
          var oop = this;
          this.Timer = document.getElementById(TimerID);
          this.TotalSeconds = Time;
          this.update();
          oop.to = setTimeout(function() {
              oop.tick();
          }, 1000);
      }
      CreateTimer.prototype = {
          tick: function() {
              var oop = this;
              if (this.TotalSeconds <= 0) {
                  return;
              }
              this.TotalSeconds -= 1;
              this.update()
              oop.to = setTimeout(function() {
                  oop.tick();
              }, 1000);
          },
          update: function() {
              var Seconds = this.TotalSeconds,
                  Days = Math.floor(Seconds / 86400);
              Seconds -= Days * 86400;
              var Hours = Math.floor(Seconds / 3600);
              Seconds -= Hours * (3600);
              var Minutes = Math.floor(Seconds / 60);
              Seconds -= Minutes * (60);
              var DD = ' дней ';
              if (Days < 5) DD = ' дня ';
              if (Days < 2) DD = ' день ';
              var TimeStr = ((Days > 0) ? Days + DD : "") + LeadingZero(Hours) + ":" + LeadingZero(Minutes) + ":" + LeadingZero(Seconds)
              this.Timer.innerHTML = TimeStr;
          }
      }
      
      function LeadingZero(Time) {
          return (Time < 10) ? "0" + Time : +Time;
      }
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        15