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(); }
Использовать подмену шаблонов может быть удобно, если вы редактируете сайт на горячую (без разворачивания девелоперских версий).