Имя класса расположенного в файле php файле должно заканчиваться на DocLister, а сам класс должен быть унаследован от абстрактного класса DocLister.
В параметре dir можно указать пусть от корня сайта к папке с контроллером.
Экстендеры могут загружаться из контроллера или с помощью параметра extenders, в котором перечислены имена файлов *.extender.inc из папки /core/extender/
Загружаемый экстендер должен быть классом имя которого должно начинаться с имени экстендера и заканчиваться на _DL_Extender. Помимо этого, загружаемый экстендер должен быть унаследован от абстрактного класса extDocLister.
Правила фильтрации можно найти в файле *.filter.php по имени фильтра из папки /core/filter/. Класс в файле должен быть унаследован от абстрактного гласса filterDocLister, а само имя должно заканчиваться на _DL_filter.
public function changeSortType($field, $type)
{
$type = trim($type);
switch (strtoupper($type)) {
case 'TVDATETIME':
{
$field = "STR_TO_DATE(" . $field . ",'%d-%m-%Y %H:%i:%s')";
break;
}
default:
{
$field = parent::changeSortType($field, $type);
}
}
return $field;
}
Это может быть удобно, когда один и тот же список необходимо шаблонизировать 2 раза.
$out1 = $modx->runSnippet('DocLister', array(
'idType' => 'parents',
'parents' => 0,
'tpl' => '@CODE: [+pagetitle+]<br />',
'saveDLObject' => '_DL'
));
$_DL = $modx->getPlaceholder('_DL');
$out2 = $_DL->docsCollection()->reduce(function($out, $data) use ($_DL, $modx){
$data['title'] = empty($data['menutitle']) ? $data['pagetitle'] : $data['menutitle'];
$data['url'] = $modx->makeUrl($data['id']);
return $out.$_DL->parseChunk('@CODE: [+title+]<br />', $data);
});
/** Либо через подмену конфига, чтобы задействовать экстендеры и штатную подготовку плейсхолдеров */
$_DL->setConfig(array(
'tpl' => '@CODE: [+title+]<br />'
));
$out2 = $_DL->render();
return implode("<hr />", array($out1, $out2));
Или, например, нужно получить массив ID документов, которые задействованы в выводе
$out = $modx->runSnippet('DocLister', array(
'saveDLObject' => '_DL'
));
$_DL = $modx->getPlaceholder('_DL');
$ids = $_DL->getOneField('id');
/** или через коллекцию */
$ids = $_DL->docsCollection()->map(function($val){
return $val['id'];
})->toArray();
Подключив класс DLTemplate вы уже можете пользоваться шаблонизатором, который:
Наиболее удачная практика - создание шаблонизатора в переменной tpl у объекта $modx. Чтобы не делать это постоянно, лучше всего воспользоваться небольшим плагином на событиях OnWebPageInit и OnPageNotFound
require_once(MODX_BASE_PATH.'assets/snippets/DocLister/lib/DLTemplate.class.php');
$modx->tpl = DLTemplate::getInstance($modx);
$data = array(
array('id' => 1, 'text' => 'hello',
'info' => array(
'phone' => '01',
'site' => 'http://example.org'
)
),
array('id' => 2, 'text' => 'world',
'info' => array(
'phone' => '02',
'site' => 'http://example.com'
)
)
);
$out = '';
foreach($data as $item){
$out .= $modx->tpl->parseChunk('@CODE: <strong>[+id+]</strong>. [+text+] ([+info.phone+], [+info.site+])', $item);
}
return $out;
Наиболее удачный пример - версия для печати. Порой бывает проще сделать минимальный шаблон каждого типа и настроить вывод так, как нужно, нежели играться с CSS.
Для упрощения восприятия, весь процесс настройки ТВ параметров будет упущен. Поэтому представим, что у нас имеется:
Создаем плагин для событий OnLoadWebDocument и OnLoadWebPageCache
if(isset($modx->print)) return;
$defaultTPL = $modx->getConfig('cfg_printTPL');
$modx->print = true;
if(isset($_GET['save']) && $_GET['save']=='print' && !empty($modx->documentObject)){
$tpl = !empty($modx->documentObject['printTPL'][1]) ? $modx->documentObject['printTPL'][1] : $defaultTPL;
if(!empty($tpl)){
$modx->print = $modx->tpl->renderDoc($modx->documentObject['id'], true, (int)$tpl);
}else{
$modx->print = false;
}
}
if($modx->print){
if($modx->print !== true){
echo $modx->print;
die();
}
}else{
$modx->sendErrorPage();
}
Использовать подмену шаблонов может быть удобно, если вы редактируете сайт на горячую (без разворачивания девелоперских версий).