DocLister: Разработчикам
- Дополнения
- DocLister
- Разработчикам
DocLister: Разработчикам
Контроллеры
Имя класса расположенного в файле php файле должно заканчиваться на DocLister, а сам класс должен быть унаследован от абстрактного класса DocLister.
В параметре dir можно указать пусть от корня сайта к папке с контроллером.
Экстендеры
Экстендеры могут загружаться из контроллера или с помощью параметра extenders, в котором перечислены имена файлов *.extender.inc из папки /core/extender/
Загружаемый экстендер должен быть классом имя которого должно начинаться с имени экстендера и заканчиваться на _DL_Extender. Помимо этого, загружаемый экстендер должен быть унаследован от абстрактного класса extDocLister.
Фильтры
Правила фильтрации можно найти в файле *.filter.php по имени фильтра из папки /core/filter/. Класс в файле должен быть унаследован от абстрактного гласса filterDocLister, а само имя должно заканчиваться на _DL_filter.
Приведение типов TV-параметров
Пример в контроллере site_content:
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);
break;
}
return $field;
}
Сохранение объекта DocLister
Это может быть удобно, когда один и тот же список необходимо шаблонизировать 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();
Использование шаблонизатора DocLister в своих сниппетах
Подключив класс DLTemplate вы уже можете пользоваться шаблонизатором, который:
- Понимает inline шаблоны
- Умеет создавать плейсхолдеры из многомерных массивов
- Автоматически активирует phx при необходимости
- Позволяет отрендерить документ применив любой шаблон (как с применением событий, так и без них)
Наиболее удачная практика - создание шаблонизатора в переменной 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.
Для упрощения восприятия, весь процесс настройки ТВ параметров будет упущен. Поэтому представим, что у нас имеется:
- Плагин cfgTV с префиксом для настроек cfg_.
- ТВ параметр со списком ID возможных шаблонов для печати (для каждого документа можно выбрать свой шаблон)
- Ссылки на версию для печати выводятся в виде
[~[id]~]?save=print
Создаем плагин для событий 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();
}
Использовать подмену шаблонов может быть удобно, если вы редактируете сайт на горячую (без разворачивания девелоперских версий).