getResources вывод ближайших 3 дат

Выводятся события таким образом.
[[getResources?
	    &parents=`15`
	    &tpl=`seminary_tpl`
	    &includeTVs=`1`
	    &limit=`3`
	    &includeTVList=`date,last_date`
	    &sortbyTV=`date`
	    &sortdirTV=`DESC`
	]]
В итоге я вижу 3 события, все как нужно. НО, если есть события на месяц вперед, то он выводит 3 последних.

Т.е если сегодня 12.10, а события есть на 13.10, 15.10, 18.11, 19.11 и 20.11, то он выведет последние 3. А мне нужно, чтобы вывел 13.10, 15.10 и 18.10

Помогите, пожалуйста. Заранее спасибо.
Евгений
12 октября 2016, 11:47
modx.pro
2 383
-1

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

Сергей Шлоков
12 октября 2016, 16:09
+2
Во-первых, поставьте pdoTools и верните обратно всякие getResources, getPage, Wayfinder и сайтмапы всякие. Повысьте свой рейтинг программиста.
Во-вторых, выбирайте только те ресурсы, у которых дата больше текущей (в &where) и измените направление сортировки на ASC.
    Евгений
    12 октября 2016, 16:54
    0
    К сожалению, а, может быть, и к счастью — я не программист.

    Во-первых, не понял про pdoTools — сайт сделан не мной, мне досталось то, что досталось. Переделывать все я не буду, да и не имею на это права.

    Во-вторых… я уже пробовал через where и ASC тоже было. Но вся то проблема как раз-таки в написании этого условия. Думаете, я не пробовал, прежде чем сюда написать? Но, так как знаний не хватает, а курение мануалов не помогло — обращаюсь за помощью.
      Евгений
      12 октября 2016, 17:11
      0
      Ах да, Вы видимо между строк читаете. Выводятся они и так больше текущей даты, но так как их может быть 5 и 10, то выводятся последние 3, а необходимо 3 ближайшие к текущей дате.
        Сергей Шлоков
        12 октября 2016, 19:53
        0
        Между каких строк? В топике указан вызов, где никакого параметра where нет. Каким образом они выводятся больше текущей даты известно одному Бога и Вам.
      Дмитрий Меркурьев
      12 октября 2016, 17:14
      1
      +1
      Так как у тв текстовый тип данных и дата там храниться в виде 2016-10-13 01:00:00
      и where date > '2016-10-13 01:00:00' не сработает.

      Недавно в одном из проектов пришлось делать тоже самое что и в задаче, правда с pdoTools но подход одинаков.
      Решалось это следующим образом.
      Устанавливался плагин DateToTimestamp, который при сохранении tv с типом дата конвертирует дату в метку времени. Код плагина:
      <?php
      /*
       * DateToTimestamp Plugin for MODX Revolution
       * @code @theboxer
       * @comments @sepiariver
       *
       * DateToTimestamp is free software; you can redistribute it and/or modify it under the
       * terms of the GNU General Public License as published by the Free Software
       * Foundation; either version 2 of the License, or (at your option) any later
       * version.
       *
       * DateToTimestamp is distributed in the hope that it will be useful, but WITHOUT ANY
       * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
       * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
       *
       * You should have received a copy of the GNU General Public License along with
       * DateToTimestamp; if not, write to the Free Software Foundation, Inc., 59 Temple
       * Place, Suite 330, Boston, MA 02111-1307 USA 
       *
       */
       
      // Only for use in the MODX mgr
      if ($modx->context->get('key') != 'mgr') {
              return;
      }
      
      // Enable events 'OnResourceTVFormRender' and 'OnDocFormSave'
      $eventName = $modx->event->name;
      switch($eventName) {
          
          // When rendering, convert timestamps back to dates so standard TV Date Inputs can read it
          case 'OnResourceTVFormRender':
              // Must set IDs of TVs on which to operate in the Plugin's Properties
              $tvs = $modx->getOption('tvs', $scriptProperties, '');
              $tvs = explode(',', $tvs);
              $tvs = array_map('trim', $tvs);
              $tvs = array_keys(array_flip($tvs));
              $tvs = array_filter($tvs);
              $tvs = array_flip($tvs);
              
              // John is awesome
              foreach ($categories as $idc => $category) {
                  foreach ($category['tvs'] as $idt => $tv) {
                      if ($tv->type != 'date' || !isset($tvs[$tv->id])) {
                          continue;
                      }
      
                      $timestamp = $categories[$idc]['tvs'][$idt]->processedValue;
                      $badValue = $categories[$idc]['tvs'][$idt]->value;
      
                      $categories[$idc]['tvs'][$idt]->set('value', strftime('%Y-%m-%d %H:%M:%S', $timestamp));
                      $categories[$idc]['tvs'][$idt]->set('formElement', str_replace($badValue, $categories[$idc]['tvs'][$idt]->value, $categories[$idc]['tvs'][$idt]->formElement));
                  }
              }
      
              break;
          // When saving, convert values to timestamp for sorting and comparing
          case 'OnDocFormSave':
              if (intval($resource->tvs) != 1) {
                  break;
              }
              // Must set IDs of TVs on which to operate in the Plugin's Properties
              $tvs = $modx->getOption('tvs', $scriptProperties, '');
              $tvs = explode(',', $tvs);
              $tvs = array_map('trim', $tvs);
              $tvs = array_keys(array_flip($tvs));
              $tvs = array_filter($tvs);
      
              foreach ($tvs as $tv) {
                  if ($resource->get('tv' . $tv) == '') {
                      continue;
                  }
      
                  $tvObject = $modx->getObject('modTemplateVar', $tv);
                  if (!$tvObject || $tvObject->type != 'date' ){
                      continue;
                  }
      
                  $value = $modx->getObject('modTemplateVarResource', array('tmplvarid' => $tv, 'contentid' => $resource->id));
                  if (!$value) {
                      continue;
                  }
      
                  $value->set('value', strtotime($value->value));
                  $value->save();
      
              }
      
              break;
      }
      Он подключается на события OnResourceTVFormRender' и 'OnDocFormSave'
      Так же в параметры необходимо добавить параметр tvs со значением ид вашей tv с датой.
      Далее уже можно составлять условие date >= текущее время.

      Но, скорее всего где то сломается вывод даты и его нужно будет чинить, т.к. значения будут сохраняться теперь в другом формате.

      Скорее всего без навыков в программировании здесь не справиться, и нужно привлекать кого то со стороны.
        Сергей Шлоков
        12 октября 2016, 19:43
        0
        Так как у тв текстовый тип данных и дата там храниться в виде 2016-10-13 01:00:00
        и where date > '2016-10-13 01:00:00' не сработает.
        Это с какой версии mySql такое началось?
          Евгений
          12 октября 2016, 19:57
          0
          А чуть-чуть подумать не хотите?))

          Сортировка в обратном порядке. Лимит 3. Выводит 3 самые дальние даты. Так понятно?
            Сергей Шлоков
            12 октября 2016, 20:02
            0
            То счастливое обстоятельство, что Вы не являетесь программистом, в данном случае играет против Вас.
            Совет «Подумать» тут больше подойдёт Вам!
              Евгений
              12 октября 2016, 20:08
              0
              Если вам нечего написать по сути, то вообще лучше не пишите.

              Я ясно обозначил в стартпосте, какой вывод есть сейчас, а какой требуется
            Дмитрий Меркурьев
            12 октября 2016, 20:01
            0
            Странно, на локальной машине сработала и сортировка и выборка, на хостинге не срабатывала выборка, поэтому пришлось искать решение с плагином. Не предполагал что текстовая строка может быть больше или меньше по значению без приведения типов)
              Сергей Шлоков
              12 октября 2016, 20:04
              0
              В плагине дата сохраняется в timestamp. Т.е. там стоит другая задача.
          Евгений
          18 октября 2016, 13:18
          0
          Помогите. ))
            Илья Уткин
            18 октября 2016, 19:19
            0
            Вам нужно писать свой сниппет. Сначала выбирать 3 ресурса, у которых дата больше, чем сегодня, потом 3, у которых меньше. Даты полученных ресурсов сравнивать и показывать только 3 ближайших.
              Александр
              18 октября 2016, 19:58
              0
              тип ввода у ТВ date у Вас какой? Если стоит тип «дата», то допишите параметр &debug=`1` и напишите здесь sql запрос, который формируется. (Сам sql после установки параметра должен быть или на месте вызова, или в логах modx)
                Евгений
                19 октября 2016, 13:04
                0
                Не могу что-то найти ТВ date

                Есть сниппет CurDate, там такой код
                <?php
                return strtotime(now);
                  Евгений
                  19 октября 2016, 13:05
                  0
                  А, нет. Нашел date, тип ввода — дата
                Евгений
                19 октября 2016, 13:08
                0
                Поставил &debug=`1`
                Не могу найти запрос, на месте вывода нет. А где лог modx глянуть?
                  Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                  17