Поддержать Проект

Обратная связь

[MODX] Guru
  • Информация
  • Разработчикам
  • Дополнения
    • DocLister
      • Параметры выборки
      • Обработка данных перед выводом
      • Вывод данных
      • Фильтры
      • Лексиконы
      • Примеры
      • Отладка
      • Разработчикам
      • MODxAPI
    • DLMenu
    • DLCrumbs
    • DLBuildMenu
    • DLLastViews
    • DLSiblings
    • DLRequest
    • DLglossary
    • DLSitemap
    • DocInfo
    • FormLister
    • Wayfinder
    • phpthumb
    • LikeDislike
    • eForm
    • Ditto
    • multiTV
    • AjaxMegaSearch
    • AjaxSearch
    • WebLoginPE
    • Breadcrumbs
    • CodeMirror
    • AnythingRating
    • Easy Newsletter
    • FirstChildRedirect
    • OpenGraphTags
    • ddTypograph
    • TagSaver
    • BlackList
    • CfgTv
    • ModxAccount
    • Forgot Manager Login
    • GetField
    • if
    • Jot
    • ListChild
    • ListIndexer
    • ManagerManager
    • ddMMEditor
    • MaxiGallery
    • MemberCheck
    • ddGetMultipleField
    • MetaX
    • MODxBB и phpBB
    • Yams
    • Personalize
    • PHx
    • Reflect
    • tagLinks
    • TransAlias
    • TvTagCloud
    • UltimateParent
    • WebSignup
    • WebLogin
    • countViews
    • thumb
    • imageCaptor
    • optimizeJPG
    • Preview Next
    • Shopkeeper
    • SiteMap
    • Sass
    • Selector
    • SimpleGallery
    • SimpleTube
    • SimpleFiles
    • Star Rating
    • MinifyX
    • adminNav
    • SimplePolls
    • CResource
    • MODxAPI
    • customTables
    • HtmlInLine
    • HtmlMinModxEvo
    • SHKUserProfile
    • PickDocsInTree
    • evoSearch
    • editDocs
    • PageBuilder
    • HybridAuth
    • Compare
    • alterTitle
  • Виджеты
  • Уроки
  • Разработчики
  • Готовые примеры
  • Блог
  • Конфиги
  • HTML коды
© [MODX] Guru
  • DocLister

DocLister: Разработчикам

  • Дополнения
  • DocLister
  • Разработчикам
3517

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();
}

Использовать подмену шаблонов может быть удобно, если вы редактируете сайт на горячую (без разворачивания девелоперских версий).