Skip to content

Instantly share code, notes, and snippets.

@ASDAFF
Forked from coonica/how to use
Last active January 5, 2016 17:12
Show Gist options
  • Save ASDAFF/4da358581e0a01b5049b to your computer and use it in GitHub Desktop.
Save ASDAFF/4da358581e0a01b5049b to your computer and use it in GitHub Desktop.
MODX Revo snippet to divide resources into columns.
Call the snippet
[[multiCols?
&cols=`2`
&tvs=`{"image":1}`
&select=`pagetitle,introtext`
&where=`{"published":1, "deleted":0, "parent":2}`
&sortby=`publishedon`
&sortdir=`DESC`
&tpl=`tpl_article`
]]
And call columns. For example for 2-columned output it will be: [[+column1]] and [[+column2]]
Attention: you need to explicitly specify basePath for tvs with not default media source.
TV with name image will be available in tpl as [[+image]].
Описание
Для вывода ресурсов по шаблону в MODX Revo обычно испльзуем pdoResources или getResources.
Этих дополнений хватает для 99,9% случаев. Но иногда возникает экзотическая задача разбить выборку по колонкам,
и вызвать эти колонки в различных частях разметки кода HTML.
Для этих целей в нашей студии по разработке сайтов есть удобная и компактная заготовочка.
Вы можете взять готовый код сниппета на github. В посте я опишу его возможности и способы использования.
Возможности сниппета multiCols
Сниппет для разбиения выборки ресурсов на колонки принимает следующие параметры:
cols - на сколько колонок разбиваем выборку (по умолчанию 2)
limit - ограничение выборки (по умолчанию 0)
sortby - поле для сортировки (по умолчанию menuindex)
sortdir - направление сортировки (по умолчанию ASC)
select - поля через запятую, которые надо выбрать у ресурса
tvs - json дополнительных полей для выборки &tvs=`{"image":2}`, нужно указать имя и id дополнительного поля
where - json условий для выборки (по умолчанию published=1, deleted=0)
tpl - имя чанка шаблона для представления элемента
При вызове сниппет не возвращает ничего - он устанавливает плейсхолдеры.
Столько плейсхолдеров - насколько колонок надо было разбить выборку.
К примеру, если надо сделать разбиение на 2 колонки, то в коде после вызова сниппета
будут доступны плейсхолдеры [[+column1]], [[+column2]].
Количество ресурсов в непоследней колонке определяется по формуле n/cols с округлением до ближайшего нижнего целого.
В самой последней колонке выводится больше ресурсов на остаток от деления, чем во всех остальных.
Внимание! Сниппет не поддерживает обработку источников файлов. Т.е. если tv с изображением имеет источник файлов,
отличный от FileSystem, то basePath надо указать явно!
Дополнительные поля в файле шаблона вызываются без префиксов. К примеру, если вы подключали tv под именем image,
то оно будет доступно как [[+image]].
Пример вызова сниппета
[[multiCols?
&cols=`2`
&tvs=`{"image":1}`
&select=`pagetitle,introtext`
&where=`{"published":1, "deleted":0, "parent":2}`
&sortby=`publishedon`
&sortdir=`DESC`
&tpl=`tpl_article`
]]
<?php
// move it to snippet parameters
$cols = 2;
$limit = 0;
$sortby = 'menuindex';
$sortdir = 'ASC';
//snippet start
$c = $modx->newQuery('modResource');
// init select array
if (isset($select)){
$select = explode(',',$select);
$select[] = 'modResource.id as id';
}
else{
$select = array('modResource.id', 'modResource.pagetitle', 'modResource.longtitle', 'modResource.publishedon'
,'modResource.alias','modResource.content','modResource.introtext');
}
//process tvs
if (isset($tvs)){
$tvs = json_decode($tvs,1);
}
else{
$tvs = array();
}
foreach ($tvs as $name=>$id){
$alias = 'tv_'.$name;
$c->leftJoin('modTemplateVarResource',$alias
, array($alias.'.contentid=modResource.id', $alias.'.tmplvarid' => $id));
$select[] = $alias.'.value as '.$name;
}
// where condition
if (!isset($where)){
$where = array('modResource.published' => 1, 'modResource.deleted' => 0);
}
else{
$where = json_decode($where,1);
}
//query
$c->where($where);
$c->select($select);
$c->sortby($sortby, $sortdir);
$c->limit($limit);
$collections = array();
if ($c->prepare() && $c->stmt->execute()) {
$collections = $c->stmt->fetchAll(PDO::FETCH_ASSOC);
}
//generate collumns
$n = count($collections);
$delta = floor($n/$cols);
$columns = array();
for ($i=0; $i < $cols; $i++){
$output = '';
//$output .= '<br/>col:'.($i+1).'<br/>';
$offset = $i*$delta;
if ($i == $cols-1){
$to = $n;
}
else{
$to = $offset + $delta;
}
for ($j=$offset; $j < $to; $j++){
if (!isset($tpl)){
$output .= '<pre>'. print_r($collections[$j],1) .'</pre>';
}
else{
$output .= $modx->getChunk($tpl, $collections[$j]);
}
}
$columns['column'.($i+1)] = $output;
}
$modx->setPlaceholders($columns);
return;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment