Необходимо сделать сортировку товаров по новой цене (в бд в таблице catalog_item был добавлен столбец endprice и заполнен необходимыми значениями, сортировка производится через showItems и docLister).
Был создан новый TV параметр endprice. Вопрос: как положить значения с базы в этот TVпараметр.

Код сниппета showItems:
<?php
//////////////// ПРОВЕРКА НА ЗАПРЕЩЕННЫЕ ТОВАРЫ ////////////

/*$q = "SELECT * FROM ".$modx->getFullTableName('catalog_items');
$q.= " WHERE barcode IN (";
$q.= "SELECT barcode FROM ".$modx->getFullTableName('noshow_barcodes');
$q.= ")";*/
$q = "SELECT ".$modx->getFullTableName('catalog_items');
$q.= ".* FROM ".$modx->getFullTableName('catalog_items');
$q.= " LEFT JOIN ".$modx->getFullTableName('noshow_barcodes');
$q.= " on (".$modx->getFullTableName('catalog_items');
$q.= ".`barcode`=".$modx->getFullTableName('noshow_barcodes');
$q.= ".`barcode`) where (".$modx->getFullTableName('catalog_items');
$q.= ".`barcode`=".$modx->getFullTableName('noshow_barcodes');
$q.= ".`barcode`)";
$res = $modx->db->query($q);
$cnt = $modx->db->getRecordCount($res);
if ($cnt) {
    while ($row = $modx->db->getRow($res)) {
        $upd['deleted'] = 1;
        $upd['deletedon'] = time();
        $modx->db->update($upd, $modx->getFullTableName('site_content'), 'id='.$row['cid']);
    }
}

//////////////// _END_ ПРОВЕРКА НА ЗАПРЕЩЕННЫЕ ТОВАРЫ ////////////

$params = $modx->event->params;
$params['debug'] = 0;

// временно прячем все товары без картинок
$res = $modx->db->select('*', $modx->getFullTableName('sg_images'));
while ($row = $modx->db->getRow($res)) {
    $imgSet[$row['sg_rid']] = $row['sg_rid'];
}
$imgSetIds = implode(',', $imgSet);
if ($imgSetIds == '') {
    return 'Нет товаров для показа';
}

// товары-контейнеры
// $ar = $modx->getActiveChildren($parents);

// foreach ($ar as $key => $dAr) {
//     $fpIdAr[] = $dAr['id'];
// }

// ci - размер, c - цвет, p - товар-папка

$q = "SELECT p.id pid, SUM(ci.count) cnt, tvd.value newBefore 
            FROM ".$modx->getFullTableName('catalog_items')." ci
            LEFT JOIN ".$modx->getFullTableName('site_content')." c 
                ON c.id=ci.cid
            LEFT JOIN ".$modx->getFullTableName('site_content')." p 
                ON p.id=c.parent
            LEFT JOIN ".$modx->getFullTableName('site_tmplvar_contentvalues')." tvd 
                ON tvd.tmplvarid=14 AND tvd.contentid=p.id
            WHERE c.link_attributes='".$modx->db->escape($brand)."'
            AND p.parent<>58 AND c.id IN (".$imgSetIds.")
            GROUP BY ci.cid";
$res = $modx->db->query($q);

while ($row = $modx->db->getRow($res)) {
    // блок ниже закомментирован, т.к. теперь все товары с 0 на остатке считаются предзаказом
    // if ($row['cnt'] < 1) {
    //     if ($row['newBefore'] != '') {
    //         $date = DateTime::createFromFormat('d.m.Y', $row['newBefore']);
    //         $ts = $date->format('U');
    //         if ($ts < time()) { 
    //             // дата в tv меньше (раньше) чем сейчас, пропускаем вывод
    //             continue;
    //         } else {
    //             $fpIdAr[$row['pid']] = $row['pid'];
    //         }
    //     } 
    //     continue;
    // }
    $fpIdAr[$row['pid']] = $row['pid'];
}

if (!is_array($fpIdAr)) {
    $modx->setPlaceholder('total', '0');
    $modx->setPlaceholder('showf', ' style="display:none;"');
    $modx->setPlaceholder('showc', ' style="display:none;"');
    return substr($emptyTpl, 6);
} else {
    $modx->setPlaceholder('showf', '');
    $modx->setPlaceholder('showc', '');
}
$fpIds = implode(',', $fpIdAr);

// товары
$res = $modx->db->select('*', $modx->getFullTableName('site_content'), 'parent IN ('.$fpIds.') AND deleted=0 AND published=1 AND hidemenu=0');
while($row = $modx->db->getRow($res)) {
    $fIdAr[] = $row['id'];
}
if (!is_array($fIdAr)) {
    return 'Нет товаров в данной категории';
}
$fIds = implode(',', $fIdAr);


$params['display'] = isset($_REQUEST['display']) ? intval($_REQUEST['display']) : 30;
$params['orderBy'] = (isset($_REQUEST['orderBy']) && trim($_REQUEST['orderBy']) != '') ? $_REQUEST['orderBy'] : 'c.category';
$ph['active'.$params['display']] = ' class="active"';
$ph['active'.$params['orderBy']] = ' class="active"';


if (trim($_REQUEST['orderBy']) == 'endprice') {
    $params['tvSortType']='UNSIGNED';
}

$pho['display'] = $params['display'];
$pho['orderBy'] = $params['orderBy'];

if (isset($_REQUEST['color'])) {
    $pho['color'] = trim($_REQUEST['color']);
}
if (isset($_REQUEST['tm'])) {
    $pho['tm'] = trim($_REQUEST['tm']);
}
if (isset($_REQUEST['size'])) {
    $pho['size'] = trim($_REQUEST['size']);
}

$modx->toPlaceholders($pho,'si.');
$params['orderBy'].= ' ASC';

// формируем списки брендов и цветов
$ph['colors'] = '<option value="">Цвет</option>';
// $ph['brands'] = '<option value="">Бренд</option>';
$ph['sizes'] = '<option value="">Размер</option>';

$res = $modx->db->select('color', $modx->getFullTableName('catalog_items'), 'cid IN ('.$fIds.')');
while ($row = $modx->db->getRow($res)) {
    if (trim($row['color']) == '') continue;
    $colorAr[$row['color']] = $row['color'];
}
foreach ($colorAr as $key => $value) {
    $ph['colors'].= '<option value="'.$key.'">'.$key.'</option>';
}

// $res = $modx->db->select('link_attributes', $modx->getFullTableName('site_content'), 'id IN ('.$fIds.')');
// while ($row = $modx->db->getRow($res)) {
//     if (trim($row['link_attributes']) == '') continue;
//     $brandAr[$row['link_attributes']] = $row['link_attributes'];
// }

// foreach ($brandAr as $key => $value) {
//     $ph['brands'].= '<option value="'.$key.'">'.$key.'</option>';
// }

// список размеров
$sizeAr = array('40', '42', '44', '46', '48', '50', '52', '54', '56', '58', '60', '62', '64', '66', '68', '70', '72');
foreach ($sizeAr as $sz) {
    $ph['sizes'].= '<option value="'.$sz.'">'.$sz.'</option>';
}

$modx->toPlaceholders($ph);

$cAr = array();
$cAr2 = array();
$cAr3 = array();
$pAr = array();
$pAr2 = array();
$pAr3 = array();

// переписываем параметры вызова
$res = $modx->db->select('parent', $modx->getFullTableName('site_content'), 'id IN ('.$fIds.')');
while($row = $modx->db->getRow($res)) {
    $pAr[$row['parent']] = $row['parent'];
}
$modx->setPlaceholder('total', count($pAr));
$pIds = implode(',', $pAr);
$params['documents'] = $pIds;
$params['parents'] = '';
//$params['addWhereList'] = 'c.isfolder=0';


if (isset($_REQUEST['color']) && $_REQUEST['color'] != '') {
    $color = $modx->db->escape($_REQUEST['color']);
    $res = $modx->db->select('cid', $modx->getFullTableName('catalog_items'), 'color="'.$color.'"');
    while($row = $modx->db->getRow($res)) {
        $cAr[] = $row['cid'];
    }
    $ids = implode(',', $cAr); //список товаров
    if ($ids != '') {
        // получаем список товаров-контейнеров
        $res = $modx->db->select('parent', $modx->getFullTableName('site_content'), 'id IN ('.$ids.') AND id IN ('.$fIds.')');
        while($row = $modx->db->getRow($res)) {
            $pAr2[$row['parent']] = $row['parent'];
        }
        $pIds = implode(',', $pAr2);
        $modx->setPlaceholder('total', count($pAr2));
    } else {
        $modx->setPlaceholder('total', count($cAr));
    }
    $params['documents'] = $pIds;
    $params['parents'] = '';
    
}

// if (isset($_REQUEST['tm']) && $_REQUEST['tm'] != '') {
//     $pIds = $params['documents'];
//     $brand = $modx->db->escape($_REQUEST['tm']);
//     if (isset($pIds) && $pIds != '') {
//         $where = 'link_attributes="'.$brand.'" AND parent IN ('.$pIds.')';
//     } else {
//         $where = 'link_attributes="'.$brand.'" AND id IN ('.$fIds.')';
//     }

//     $res = $modx->db->select('parent', $modx->getFullTableName('site_content'), $where);
//     while($row = $modx->db->getRow($res)) {
//         $cAr2[$row['parent']] = $row['parent'];
//     }
//     $ids2 = implode(',', $cAr2);
//     $params['documents'] = $ids2;
//     $params['parents'] = '';
//     $modx->setPlaceholder('total', count($cAr2));
// }

if (isset($_REQUEST['size']) && $_REQUEST['size'] != '') {
    $pIds = $params['documents'];
    $size = $modx->db->escape($_REQUEST['size']);
    $res = $modx->db->select('cid', $modx->getFullTableName('catalog_items'), 'size="'.$size.'" AND visible=1');
    while($row = $modx->db->getRow($res)) {
        $sAr[] = $row['cid'];
    }
    $ids2 = implode(',', $sAr); //список товаров

    if ($ids2 != '') {
        // echo 'id IN ('.$ids2.') AND id IN ('.$fIds.')';
        // получаем список товаров-контейнеров
        $res = $modx->db->select('parent', $modx->getFullTableName('site_content'), 'id IN ('.$ids2.') AND id IN ('.$fIds.')');
        while($row = $modx->db->getRow($res)) {
            $pAr3[$row['parent']] = $row['parent'];
        }
        $pIds = implode(',', $pAr3);
        $modx->setPlaceholder('total', count($pAr3));
        // } else {
        //     $modx->setPlaceholder('total', count($cAr));
        $params['documents'] = $pIds;
        $params['parents'] = '';
    }    
}

file_put_contents('file.txt', var_export($params, true));
$ret = $modx->runSnippet('DocLister', $params);

return $ret;
?>


Код чанка, где выводятся товары:

<form name="sort" action="[~[*id*]~]" id="sortform">
    <input type="hidden" name="display" id="display" value="[+si.display+]" />
    <input type="hidden" name="orderBy" id="orderBy" value="[+si.orderBy+]" />
    <input type="hidden" name="color" id="color" value="[+si.color+]" />
    <input type="hidden" name="tm" id="tm" value="[+si.tm+]" />
        <input type="hidden" name="size" id="size" value="[+si.size+]" />
</form>
                        <div class="block-cat">
                            [!showItemsByBrand?
                                &brand=`[*pagetitle*]`
                                &tvList=`price, action, endprice`
                                &prepare=`dl.prepare`
                                &paginate=`pages`
                                &TplNextP=`@CODE:<span class="next-page"><a href="[+link+]">→</a></span>`
                                &TplPrevP=`@CODE:<span class="prev-page"><a href="[+link+]">←</a></span>`
                                &TplPage=`@CODE:<li><a href="[+link+]">[+num+]</a></li>`
                                &TplCurrentPage=`@CODE:<li class="active"><a href="[+link+]">[+num+]</a></li>`
                                &TplWrapPaginate=`@CODE:<ul class="pager">[+wrap+]</ul>`
                                &tpl=`@CODE
                                    <div class="cat-item">
                                        <div class="img-i"> 
                                            <a href="[~[+iid+]~]"><img src="[+thumb+]" alt=""></a>
                                        </div>
                                        <h4><a href="[~[+iid+]~]">[+pagetitle+] [+model+]</a></h4>
                                        <span class="name">[+link_attributes+]</span>
                                        <span class="art">артикул: <span>[+articul+]</span></span>
                                        [+isnew+]
                                        [+sale+]
                                        <span class="cost-link">
                                            [+price.or.login+]
                                        </span>
                                    </div>
                                `
                                                        &emptyTpl=`@CODE: 
                                    <div class="cat-item">В этой категории пока нет товаров
                                    </div>`
                            !]
                        </div>


Код dl.prepare:

<?php
/**
 * dl.prepare snippet
 */
// $saleTpl = '<span class="sale">Есть размеры со скидкой</span>';
$saleTpl = '<span class="sale">Скидка [+pc+]%</span>';
$newTpl = '<span class="new">Новинка</span>';

$data['isnew'] = '';
$data['sale'] = '';


// получаем товары-цвета, первый из них используем для получения картинок
// $resCh = $modx->db->select('id', $modx->getFullTableName('site_content'), 'published=1 AND parent='.$data['id']);
// $query = "SELECT c.id iid, ci.*, tvv.value newBefore 
//         FROM ".$modx->getFullTableName('site_content')." c 
//         LEFT JOIN ".$modx->getFullTableName('site_content')." cc ON cc.parent=c.id 
//         LEFT JOIN ".$modx->getFullTableName('catalog_items')." ci ON ci.cid=c.id 
//         LEFT JOIN ".$modx->getFullTableName('site_tmplvar_contentvalues')." tvv 
//             ON tvv.contentid=c.id AND tvv.tmplvarid=14
//         WHERE c.published=1 AND c.deleted<>1 AND c.hidemenu<>1
//             AND c.parent=".$data['id'];
// echo $query;  
// die();       

// c- цвета, c.parent - товары-папки
$query = "SELECT c.id iid, c.menutitle articul, ci.*, tvv.value newBefore, ci.endprice 
        FROM ".$modx->getFullTableName('site_content')." c 
        LEFT JOIN ".$modx->getFullTableName('catalog_items')." ci ON ci.cid=c.id 
        LEFT JOIN ".$modx->getFullTableName('site_tmplvar_contentvalues')." tvv 
            ON tvv.contentid=c.parent AND tvv.tmplvarid=14
        WHERE c.published=1 AND c.deleted<>1 AND c.hidemenu<>1
            AND c.parent=".$data['id']." AND ci.endprice>0
        ORDER BY c.menuindex ASC
    ";
// die($query);


$resCh = $modx->db->query($query);
$cntCh = $modx->db->getRecordCount($resCh);
if (!$cntCh) return serialize($data);

$imgSet = false;
$colorIds = array();

while ($rowCh = $modx->db->getRow($resCh)) {
    // записываем все размеры в массив, если они должны выводиться на сайте

    $data['iid'] = $rowCh['iid'];
    $data['articul'] = $rowCh['articul'];
    $colorIds[] = $rowCh['iid'];
        $data['endprice'] = $rowCh['endprice'];
        $data['model'] = $modx->runSnippet('setAdditional', array('iid'=>$data['iid'],'field'=>'model'));

    // проверяем для товара, не является ли он новинкой
    // формат 28.06.2015
    if ($rowCh['newBefore'] != '') {
        $date = DateTime::createFromFormat('d.m.Y', $rowCh['newBefore']);
        if (is_object($date)) {
            $ts = $date->format('U');
            if ($ts > time()) { 
                // дата в tv больше (позже) чем сейчас, товар можно выводить
                $data['isnew'] = $newTpl;
            }
        }
        // var_dump($date);
        // var_dump($rowCh['newBefore']);
        // die();
    } 

    if (!isset($itemsAr[$rowCh['iid']])) {
        if ($rowCh['count'] < 1) {
            // проверяем для товара с нулевым остатком, не является ли он новинкой
            // if ($data['isnew'] == '') {
            //     continue;
            // } else {
                $itemsAr[$rowCh['iid']] = $rowCh;
            // }
        } else {
            // этот размер есть в наличии, дописываем при необходимости
            $itemsAr[$rowCh['iid']] = $rowCh;
        }

        // если этот товар содержит размеры, на которые действует скидка, запоминаем это
        if (isset($rowCh['sale']) && intval($rowCh['sale']) > 0) {
            // $data['sale'] = str_replace('[+pc+]', intval($rowCh['sale']), $saleTpl);
            $data['salepc'] = intval($rowCh['sale']);
            $itemsAr[$rowCh['iid']]['salepc'] = $data['salepc'];
        }

        // если мы находимся в каталоге Последних размеров, выводим скидку принудительно
                /*if ($modx->documentIdentifier == 68817) {
            // $data['sale'] = str_replace('[+pc+]', '10', $saleTpl);
            $data['salepc'] = 10;
            $itemsAr[$rowCh['iid']]['salepc'] = $data['salepc'];
        }*/
    } else {
        // проверяем, записана ли в $data['salepc'] максимальная скидка для этого товара
        if (isset($rowCh['sale']) && intval($rowCh['sale']) > $itemsAr[$rowCh['iid']]['sale']) {
            $data['salepc'] = intval($rowCh['sale']);
            $itemsAr[$rowCh['iid']]['salepc'] = $data['salepc'];
        }
    }  
}

// если еще не заполнялись картинки для этого iid товара, заполняем
if (!$imgSet) {
    // картинки еще не заполнялись
    $resImg = $modx->db->select('*', $modx->getFullTableName('sg_images'), 'sg_rid IN ('.implode(',', $colorIds).')', 'sg_index DESC');
    if ($rowImg = $modx->db->getRow($resImg)) {
        $data['thumb'] = $modx->runSnippet('phpthumb',array(
                'input' => $rowImg['sg_image'],
                'options' => 'w=196&h=299&zc=1'
            ));
        $data['thumb2'] = $modx->runSnippet('phpthumb',array(
                'input' => $rowImg['sg_image'],
                'options' => 'w=92&h=99&zc=1'
            ));
    } else {
        $data['thumb'] = $modx->runSnippet('phpthumb',array(
                'input' => 'noimage.png',
                'options' => 'w=196&h=299&zc=1'
            ));
        $data['thumb2'] = $modx->runSnippet('phpthumb',array(
                'input' => 'noimage.png',
                'options' => 'w=92&h=99&zc=1'
            ));
    }
    $imgSet = true;
}

// если после перебора всех размеров для всех цветов товара у нас остался пустым массив $itemsAr
// выводить ничего не нужно
if (!$itemsAr || !is_array($itemsAr)) return serialize($data);
$row = array_shift($itemsAr);
while (intval($row['endprice']) < 1 && $row2 = array_shift($itemsAr)) {
        $row = $row2;
}
// $data['iid'] = $row['iid'];

// цены выводим только для авторизованных юзеров
if(isset($_SESSION['webShortname'])) {
    $price = intval($row['price']);
    $sale = intval($row['salepc']);
    $endprice = intval($row['endprice']);
        file_put_contents('endprice.txt', var_export($endprice, true));
        // $endPrice = $price - $price*$sale/100;
    $price = number_format($price, 0, '.', ' ');
    $endprice = number_format($endprice, 0, '.', ' ');

    if (intval($endprice) < 1) {
                //$data['price.or.login'] = ' 0 руб';
                $data['price.or.login'] = ' '.$endprice.' руб';
        $data['sale'] = '';
    } else if (intval($endprice) != intval($price)) {
        $data['price.or.login'] = '<s class="black item_oldprice">'.$price.' руб</s> '.$endprice.' руб';
        $data['sale'] = str_replace('[+pc+]', $sale, $saleTpl);
    } else {
        $data['price.or.login'] = ' '.$endprice.' руб';
        $data['sale'] = '';
    }    
} else {
        // $data['price.or.login'] = '<a href="'.$modx->makeUrl(117).'" class="fancybox" data-fancybox-type="iframe" onclick="yaCounter23658859.reachGoal(\'price\'); return true;">Узнать цену</a>';
         $data['price.or.login'] = '<a href="'.$modx->makeUrl(116).'" onclick="yaCounter23658859.reachGoal(\'price\'); return true;">Узнать цену</a>';
    $data['sale'] = '';
}

return serialize($data);
?>


dl.prepare передает следующие данные в docLister. Как можно заметить endprice остается пустым.

Параметры в docLister