getResources вывод ближайших 3 дат
Выводятся события таким образом.
Т.е если сегодня 12.10, а события есть на 13.10, 15.10, 18.11, 19.11 и 20.11, то он выведет последние 3. А мне нужно, чтобы вывел 13.10, 15.10 и 18.10
Помогите, пожалуйста. Заранее спасибо.
[[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
Помогите, пожалуйста. Заранее спасибо.
Комментарии: 17
Во-первых, поставьте pdoTools и верните обратно всякие getResources, getPage, Wayfinder и сайтмапы всякие. Повысьте свой рейтинг программиста.
Во-вторых, выбирайте только те ресурсы, у которых дата больше текущей (в &where) и измените направление сортировки на ASC.
Во-вторых, выбирайте только те ресурсы, у которых дата больше текущей (в &where) и измените направление сортировки на ASC.
К сожалению, а, может быть, и к счастью — я не программист.
Во-первых, не понял про pdoTools — сайт сделан не мной, мне досталось то, что досталось. Переделывать все я не буду, да и не имею на это права.
Во-вторых… я уже пробовал через where и ASC тоже было. Но вся то проблема как раз-таки в написании этого условия. Думаете, я не пробовал, прежде чем сюда написать? Но, так как знаний не хватает, а курение мануалов не помогло — обращаюсь за помощью.
Во-первых, не понял про pdoTools — сайт сделан не мной, мне досталось то, что досталось. Переделывать все я не буду, да и не имею на это права.
Во-вторых… я уже пробовал через where и ASC тоже было. Но вся то проблема как раз-таки в написании этого условия. Думаете, я не пробовал, прежде чем сюда написать? Но, так как знаний не хватает, а курение мануалов не помогло — обращаюсь за помощью.
Ах да, Вы видимо между строк читаете. Выводятся они и так больше текущей даты, но так как их может быть 5 и 10, то выводятся последние 3, а необходимо 3 ближайшие к текущей дате.
Между каких строк? В топике указан вызов, где никакого параметра where нет. Каким образом они выводятся больше текущей даты известно одному Бога и Вам.
Так как у тв текстовый тип данных и дата там храниться в виде 2016-10-13 01:00:00
и where date > '2016-10-13 01:00:00' не сработает.
Недавно в одном из проектов пришлось делать тоже самое что и в задаче, правда с pdoTools но подход одинаков.
Решалось это следующим образом.
Устанавливался плагин DateToTimestamp, который при сохранении tv с типом дата конвертирует дату в метку времени. Код плагина:
Так же в параметры необходимо добавить параметр tvs со значением ид вашей tv с датой.
Далее уже можно составлять условие date >= текущее время.
Но, скорее всего где то сломается вывод даты и его нужно будет чинить, т.к. значения будут сохраняться теперь в другом формате.
Скорее всего без навыков в программировании здесь не справиться, и нужно привлекать кого то со стороны.
и 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 >= текущее время.
Но, скорее всего где то сломается вывод даты и его нужно будет чинить, т.к. значения будут сохраняться теперь в другом формате.
Скорее всего без навыков в программировании здесь не справиться, и нужно привлекать кого то со стороны.
Так как у тв текстовый тип данных и дата там храниться в виде 2016-10-13 01:00:00Это с какой версии mySql такое началось?
и where date > '2016-10-13 01:00:00' не сработает.
А чуть-чуть подумать не хотите?))
Сортировка в обратном порядке. Лимит 3. Выводит 3 самые дальние даты. Так понятно?
Сортировка в обратном порядке. Лимит 3. Выводит 3 самые дальние даты. Так понятно?
То счастливое обстоятельство, что Вы не являетесь программистом, в данном случае играет против Вас.
Совет «Подумать» тут больше подойдёт Вам!
Совет «Подумать» тут больше подойдёт Вам!
Если вам нечего написать по сути, то вообще лучше не пишите.
Я ясно обозначил в стартпосте, какой вывод есть сейчас, а какой требуется
Я ясно обозначил в стартпосте, какой вывод есть сейчас, а какой требуется
Странно, на локальной машине сработала и сортировка и выборка, на хостинге не срабатывала выборка, поэтому пришлось искать решение с плагином. Не предполагал что текстовая строка может быть больше или меньше по значению без приведения типов)
В плагине дата сохраняется в timestamp. Т.е. там стоит другая задача.
Помогите. ))
Вам нужно писать свой сниппет. Сначала выбирать 3 ресурса, у которых дата больше, чем сегодня, потом 3, у которых меньше. Даты полученных ресурсов сравнивать и показывать только 3 ближайших.
тип ввода у ТВ date у Вас какой? Если стоит тип «дата», то допишите параметр &debug=`1` и напишите здесь sql запрос, который формируется. (Сам sql после установки параметра должен быть или на месте вызова, или в логах modx)
Не могу что-то найти ТВ date
Есть сниппет CurDate, там такой код
Есть сниппет CurDate, там такой код
<?php
return strtotime(now);
А, нет. Нашел date, тип ввода — дата
Поставил &debug=`1`
Не могу найти запрос, на месте вывода нет. А где лог modx глянуть?
Не могу найти запрос, на месте вывода нет. А где лог modx глянуть?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.