MIGX. Выборка getImageList с условиями.
Данный топик — ответ вот этому: community.modx-cms.ru/blog/9281.html Я не буду особо лезть в детали, с какими мы здесь трудностями сталкивается, а хочу только сказать, что даже со средними знаниями php можно обходить многие эти сложности. При этом ваши скрипты будут выполняться гораздо быстрее, и будут они более гибкими в использовании.
Справедливости ради приведу работающий вызов этого сниппета на уровне MODX-синтаксиса.
$output= '[[getImageList?
&tvname=`afisha`
&tpl=`Tpl`
&docid=`338`
&limit=`3`
&sort=`[{"sortby":"data","sortdir":"ASC"}]`
&where=`{"data:>":"[[!today]]"}`
]]';
Заметка автору: [[!today]] в вашем случае должен возвращать полную дату, например 2012-12-18 22:00:00, а не time(). И вам внимательно надо продумать правильное кеширование всего этого.
Самые главные минусу нативного решения:
- В условие where можно прописать только одно поле.
- Хоть мы и указываем limit, выборка происходит все равно всех элементов, а потом уже на уровне перебора массива срабатывает limit. Хотя здесь как правило небольшое количество элементов, но этот минус справедлив для многих подобных решений.
А теперь мой скрипт на замену:
<?>
if(!$doc_id) {return '';}
$output = '';
// Получаем TV по ID документа
$q = $modx->newQuery('modTemplateVar');
$q->innerJoin('modTemplateVarResource', 'v', 'v.tmplvarid = modTemplateVar.id');
$q->where(array(
'v.contentid' => $doc_id,
'modTemplateVar.id' => $tv_id,
));
$q->limit(1);
$q->select(array('modTemplateVar.*', 'v.value'));
if(!$tv = $modx->getObject('modTemplateVar', $q)){
return '';
}
// Получаем его значение
$value = $tv->get('value');
// Получаем массив из JSON-строки
$array = $modx->fromJSON($value);
// Пробегаемся по всему массиву и фильтруем по дате
$data = array();
$now = time();
$i = 0;
foreach($array as $r){
$time = strtotime($r['data']);
if($time < $now){continue;}
$data[$time] = $r;
if(++$i == $limit){break;}
}
// Сортируем массив по ключу (чтобы по дате отсортировать)
ksort($data);
foreach($data as $r){
$output .= $modx->getChunk($tpl, $r);
}
return $output;
Да, он чуть сложнее, чем работа на уровне синтаксиса, но если вы освоите API MODX, то вы сможете работать с любыми объектами. Честно скажу, что у меня написание этого сниппета заняло меньше времени, чем изучение сниппета getImageList и выяснение, почему же &where=[{«data:>»:"[[!today]]"}] не работает, а &where={«data:>»:"[[!today]]"} работает (пришлось лезть в код модуля и выяснять, что он не умеет принимать массив условий, а только одно условие ключ->значение).
При этом решение на уровне таких сниппетов и более гибкое, и работает быстрее, и кеширование гибкое прописать можно. В общем здесь куча плюсов.