Ім'я класу розташованого у файлі 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();
}
Використовувати підміну шаблонів може бути зручно, якщо ви редагуєте сайт на гарячу (без розгортання девелоперських версій).