Сортировка Doclister по полю TV типа дата

Приветствую.

Задача вроде простая — вывести все документы. у которых дата больше сегодняшней.

Поле TV startdate, дата в базе записана или 11-05-2019, или 11-05-2019 0:00:00

Как отфильтровать нужные документы?

Заранее спасибо!

10 комментариев

avatar
Здравствуйте!
По идее можно попробовать
Создать [+time0+] плэйсхолдер надо устанавливать сниппетом
<?php
взять текущее время и установить в плэйсхолдер time0 
if ($_GET['time0']) $modx->setPlaceholder('time0',$_GET['time0']);
...
для второго плэйсхолдера сделать вычитание 1 суток и установить этот плэйсхолдер

В DocLister использовать параметр &filters=`tv:[+time1+]:lt:[+time0+]`
avatar
Удалено
Комментарий отредактирован 2019-07-17 18:01:23 пользователем Aharito
avatar
Документация tvSortType='TVDATETIME'
  • 1px
  • 0
avatar
вот вызов:
[!DocLister?
&parents=`9`
&tpl=`@CODE <a href="[+url+]">[+pagetitle+] [+startdate+]</a>
`
&depth=`0`
&tvList=`startdate`
&tvPrefix=``
&orderBy=`startdate DESC`
&tvSortType=`TVDATETIME`
&display=`10`
&addWhereList=`STR_TO_DATE(startdate,'%d - %m - %Y')  >= STR_TO_DATE([!time!], '%d - %m - %Y')`
!]

time —
<?php
echo time();


Вот нашел ссылку, но не понимаю, как воспользоваться этим решением(
gist.github.com/Pathologic/0090d821b2aa3e87061c7b00d87873aa
avatar
Ну судя по всему тут используется преобразование строки в дату.
За это отвечает STR_TO_DATE функция, погуглите её.

STR_TO_DATE(startdate,'%d - %m - %Y')  >= STR_TO_DATE([!time!], '%d - %m - %Y')`

Вот это переводится так: выбрать всё, где дата из ТВ по имени startdate, преобразованная в нужный для mysql вид, больше либо равна дате, отданной неким сниппетом time. Не знаю, зачем. Можно просто NOW() поставить после равенства.
А дальше:
&orderBy=`startdate DESC`
&tvSortType=`TVDATETIME`

Сортировать по startdate
Учесть, что тип startdate — datetime.
avatar
[!DocLister?
&parents=`9`
&tpl=`folter`
&depth=`0`
&tvList=`startdate`
&tvPrefix=``
&orderBy=`startdate DESC`
&tvSortType=`TVDATETIME`
&display=`10`
&addWhereList=`TO_DAYS(startdate)  >= TO_DAYS(NOW())`
!]

как я понимаю:
я беру дату из tv startdate. функцией to_days преобразую дату в число (количество дней с начала отсчета)
затем беру время на сейчас now(), преобразую его этой же функцией в число.
и потом два числа сравниваю. выводиться должны документы, где дата startdate больше чем сегодня

но не выводится вообще ничего

где моя логика страдает?
avatar
Просто откройте mySQL и попробуйте поиграться на таблице с этими условиями.
avatar
с ещ_вфны я понял ошибку.

SELECT * FROM `modx_site_tmplvar_contentvalues` WHERE tmplvarid=8 AND STR_TO_DATE(value,'%d - %m - %Y') >= now()


вот такой запрос выдает мне необходимые записи

аналогичный запрос в addWhereList:
&addWhereList=`STR_TO_DATE(startdate,'%d - %m - %Y')  >= now()`


не дает ничего вообще
avatar
Вызывайте с параметром debug=1, смотрите в логах, как он его формирует. Возможно для ТВ надо какой-то префикс сделать в запросе, типа dltv.startdate или что-то такое.
avatar
ахереть!

короче нужно вместо названия tv (startdate в моем случае) указать value (название столбца из базы):
&addWhereList=`STR_TO_DATE(value,'%d - %m - %Y')  >= now()`

большое спасибо за подсказки!
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.