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, 14:47    Евгений   
0    410 -1

Комментарии (17)

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

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

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

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

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

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

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

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