Ditto: Экстендеры
- Дополнения
- Ditto
- Экстендеры
Ditto: Экстендеры
Экстендеры - это дополнительные расширения, которые позволяют решать дополнительные задачи. Все экстендеры Ditto лежат в папке assets/snippets/ditto/extenders/.
dateFilter
Описание: Предназначен для фильтрации документов по дате, может использоваться месте со сниппетом Reflect.
Параметры: &dateFilterSource, &dateFilterDefault, &month, &year, &day
Плейсхолдеры: [+year+], [+month+], [+day+], [+month_numeric+]
Пример:
Экстендеры
Плейсхолдеры
Параметры request
<form id="dateFilterForm" method="get" action="[~[*id*]~]"> <select size="1" name="year"> <option selected value="">-- год --</option> <option value="2015">2015</option> <option value="2016">2016</option> </select> <select size="1" name="month"> <option selected value="">-- месяц --</option> <option value="1">Январь</option> <option value="2">Февраль</option> <option value="3">Март</option> <option value="4">Апрель</option> <option value="5">Май</option> <option value="6">Июнь</option> <option value="7">Июль</option> <option value="8">Август</option> <option value="9">Сентябрь</option> <option value="10">Октябрь</option> <option value="11">Ноябрь</option> <option value="12">Декабрь</option> </select> <input type="submit" value="Ок" name="Submit"> </form> <h3>[+year+] [+month+]</h3> [!Ditto? &parents=`163` &extenders=`dateFilter` &dateSource=`createdon`!]
где:
&extenders=`dateFilter`- имя используемого расширения&dateSource=`createdon`- поле по которому будет происходить фильтрация
request
Описание: Изменение параметров Ditto через URL.
Параметры: &stripTags, &bad, &good
Плейсхолдеры: нет
Пример:
Результат
Шаблоны
Примеры
Плейсхолдеры
Параметры пагинации
Параметры tvFilter
Параметры tagging
Параметры summary
Параметры search
Параметры request
Параметры glossaryFilter
Параметры dateFilter
Параметры
<form action="[~[*id*]~]" method="get"> <p>Сортировать по...</p> <select name="ditto_id1_sortDir"> <option value="">-- выбрать --</option> <option value="ASC">Возрастанию</option> <option value="DESC">Убыванию</option> </select> <input name="Submit" type="submit" value="Ок"> </form> <h3>Результат</h3> [!Ditto? &id=`id1` &parents=`163` &tpl=`@CODE:[+pagetitle+]<br>` &extenders=`request` &sortBy=`pagetitle`!]
где:
&extenders=`request`- имя используемого расширения&sortBy=`pagetitle`- параметр, по которому производится сортировка
summary
Описание: Формирование краткого описания и подстановка этого описания в плейсхолдер [+summary+].
Параметры: &truncSplit, &trunc, &truncAt, &truncLen, &truncOffset, &truncText, &tplTrunc.
Плейсхолдеры: [+summary+], [+link+]
Пример:
Вывести аннотации к документам, но поле [+introtext+] у документов не заполнено или заполнено не у всех документов. В шаблоне вместо плейсхолдера [+introtext+] вставляем плейсхолдер [+summary+], а вызов сниппета станет таким:
[!Ditto? &tpl=`@CODE:<h3>[+pagetitle+]</h3><p>[+summary+]</p><p>[+link+]</p>` &parents=`2` &extenders=`summary` &truncLen=`400` &truncText=`Подробнее...`!]
где:
&extenders=`summary`- имя используемого расширения&truncLen=`400`- максимальное количество отображаемых символов&truncText=`Подробнее...`- текст ссылки на подробное описание
tagging
Описание: Фильтрация документов по тегам.
Параметры: &tagDocumentID, &tags, &tagMode, &tagDelimiter, &caseSensitive, &tagDisplayDelimiter, &tagSort, &tagData, &tagDisplayMode, &tplTagLinks, &tagCallback
Плейсхолдеры: [+tagLinks+], [+tags+]
Экстендер tagging автоматически подключается при использовании параметра &tagData. В качестве значения параметра &tagData используется имя TV-параметра с типом ввода Text, Radio Options или Check Box. По умолчанию, разделителем между тегами является пробел. Изменить разделитель можно с помощью параметра &tagDelimiter=`, `. Теги отображаются в плейсхолдере [+tagLinks+] в виде набора ссылок.
[!Ditto? &parents=`4` &tagData=`keyw` &tagDelimiter=`,` &tagDisplayDelimiter=`, ` &tpl=`@CODE:<h3>[+pagetitle+]<small>[+tagLinks+]</small></h3>` &tagSort=`0` &tagDocumentID=`[*id*]`!]
где:
&tagData=`keyw`- поле документа или переменная шаблона, содержащая теги&tagDelimiter=`,`- разделитель между тегами&tagDisplayDelimiter=`, `- разделитель между тегами при их выводе&tagSort=`0`- отключаем сортировку тегов по алфавиту&tagDocumentID=`[*id*]`- ID документа, где будет выводиться список отфильтрованных документов
andFilter
Источник: /assets/snippets/ditto/extenders/andFilter.extender.inc.php
<?php
// ---------------------------------------------------
// Group: Filters
// The filter works with TV settings that have multiple values, checking for compliance with each
//**************************
// zk – http://nopreset.ru
//**************************
// Example call Ditto:
// [!Ditto? &startID=`42` &tpl=`tpl` &extenders=`andFilter` &andFilterTv=`color:green,red;size:L,XL,XXL` !]
// – will return documents where all the red and green things the size L, XL and XXL ;)
// ---------------------------------------------------
// If no fieldname value has been supplied, don't do anything else
if ($andFilterTv === false) {
return false;
}
global $tvsarray;
$tmparray = explode ( ';', $andFilterTv);
foreach ( $tmparray as $tmpvalue ) {
$tmpexplode = explode ( ':', $tmpvalue );
$tvsarray[] = $tmpexplode;
$filtertvs .= (empty($filtertvs)?"":",") . $tmpexplode[0];
}
$filters["custom"]["andFilter"] = array( $filtertvs, "andFilter");
if (!function_exists("andFilter")) {
function andFilter($resource) {
global $modx,$tvsarray;
$good = true;
foreach ( $tvsarray as $tv ) {
$values = explode( ',', $tv[1] );
if( array_search($resource[$tv[0]], $values) !== false ){
$good = $good && true;
} else {
$good = $good && false;
}
}
if ($good) { return 1; } else { return 0; }
}
}
?>
Ещё есть небольшой код для программного формирования фильтров, я их передаю через массив в GET с такими же названиями как TV. (Но у дитто есть баг с массивами, так что или фиксить дитто, или исправить на POST):
<?php
//$array_param = array ( 'tv1', 'tv2' .. )
function andFilterTvGet ( $array_param ) {
foreach ( $array_param as $param ) {
if (!is_array($_GET[$param])) continue;
$andfilter .= (empty($andfilter)?"":";") . $param . ':';
$params = '';
foreach ($_GET[$param] as $value) {
$param_g = htmlspecialchars($value);
if ( !empty($param_g) ) $params .= (empty($params)?"":",") . $param_g;
}
$andfilter .= $params;
}
return $andfilter;
}
Описание: Фильтрация по TV-параметру, имеющему несколько значений. Проверка на сооответствие каждому значению.
Параметры: &andFilterTv.
Плейсхолдеры: нет.
Пример: Вывести товары красного и зелёного цета, размеров L, XL и XXL
[!Ditto? &tpl=`tpl` &parents=`2` &extenders=`andFilter` &andFilterTv=`color:зелёный,красный;size:L,XL,XXL`!]
где:
&extenders=`andFilter`- имя используемого расширения&andFilterTv=`color:зелёный,красный;size:L,XL,XXL`- параметры, по которым происходит фильтрация документов.
countDocs
Описание: Подсчет количества документов.
Обязательные параметры: нет.
Плейсхолдеры: [+count+]
Пример: Вывести общее количество документов в контейнерах 3,4,5:
[!Ditto? &tpl=`@CODE:[+count+]` &parents=`3,4,5` &extenders=`countDocs` &display=`1`!]
где:
&extenders=`countDocs`- имя используемого расширения&display=`1`- устанавливаем значение равное 1, так как нам необходимо вывести количесто только один раз.
distinct
Источник: distinct
Описание: Возвращает только уникальные результаты полей, указанных в качестве значения параметра &distinct=`param1,param2`.
Параметры: &distinct
Плейсхолдеры: нет
Пример: получить только уникальные заголовки страниц для каждой даты.
[!Ditto? &parents=`4` &extenders=`distinct` &distinct=`pagetitle,pub_date`!]
где:
&extenders=`distinct`- имя используемого расширения&distinct=`pagetitle,pub_date`- параметры, по которым производится фильтрация
customsort или nosort
Источник: Создать экстендер в assets/snippets/ditto/extenders/ с именем customsort.extender.inc.php и следующее содержимое:
<?php
if(!function_exists('customsort')){
function customsort($a, $b){
$pos_a=array_search($a['id'],$GLOBALS['documents']);
$pos_b=array_search($b['id'],$GLOBALS['documents']);
if($pos_a == $pos_b){
return 0;
}
return($pos_a < $pos_b)?-1:1;
}
}
$GLOBALS['documents']=explode(',',$documents);
$orderBy["custom"][] = array("id", "customsort");
$ditto->advSort = true;
?>
Описание: Пользовательский порядок сортировки документов в параметре &documents.
Параметры: &documents
Плейсхолдеры: нет
Пример: вывести список документов в строго заданном порядке.
[!Ditto? &parents=`4` &extenders=`customsort` &documents=`40,46,47,35,36,37,44,41,43,49,48,50,54,53`!]
где:
&extenders=`customsort`- имя используемого расширения&documents=`40,46,47,35,36,37,44,41,43,49,48,50,54,53`- заданный порядок вывода документов
glossaryFilter
Источник: glossaryFilter
Описание: продвинутая фильтрация документов.
Параметры: &filterVar, &filterMode, &filterBy, &forceUTF8
Плейсхолдеры: нет
Пример: фильтрация документов по первым буквам алфавита.
<?php
$allowed_req = array(
# 'label-for-button-or-link' => 'actual-value-for-regex-clause',
'A' => 'A',
'B' => 'B',
'C' => 'C',
'D' => 'D',
'E' => 'E',
'F' => 'F',
'G' => 'G',
'H' => 'H',
'I' => 'I',
'J' => 'J',
'K' => 'K',
'L' => 'L',
'M' => 'M',
'N' => 'N',
'O' => 'O',
'P' => 'P',
'Q' => 'Q',
'R' => 'R',
'S' => 'S',
'T' => 'T',
'U' => 'U',
'V' => 'V',
'W' => 'W',
'X' => 'X',
'Y' => 'Y',
'Z' => 'Z',
'0-9' => '0|1|2|3|4|5|6|7|8|9',
'Все' => 'A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z',
);
$cur_filter = isset($_POST['filter']) && isset($allowed_req[$_POST['filter']]) && $allowed_req[$_POST['filter']] ? $allowed_req[$_POST['filter']] : '';
$index = '<form method="post" action="ditto/ekstendery">';
foreach ($allowed_req as $label => $request){
if ($request) {
$index .= '<input type="submit" name="filter" value="' . $label . '"' . ($request == $cur_filter ? ' disabled' : '') . '>' . ' ';
}
}
$index .= '<input type="submit" name="clear" value="Очистить"></form>';
$params['parents']='4';
$params['orderBy']='pagetitle ASC';
$params['filterVar']='pagetitle';
$params['filterBy']= $cur_filter;
$params['depth']='1';
$params['extenders']='glossaryFilter';
$custom_filter = $modx->runSnippet('Ditto',$params);
return $index . ($cur_filter ? $custom_filter : '');
?>
jotcount
Описание: количество комментариев Jot к определенной странице в шаблоне Ditto.
Параметры: нет
Плейсхолдеры: [+jotcount+]
Пример: вывести количество комментариев.
[!Ditto? &parents=`4` &extenders=`jotcount` &tpl=`@CODE:<h3>[+pagetitle+] <small>[+jotcount+]</small></h3>`!]
где:
&extenders=`jotcount`- имя используемого расширения
jotdatesort
Описание: информация о комментариях Jot к определенной странице в шаблоне Ditto.
Параметры: &jotfilter, &jotauthorfield
Плейсхолдеры: [+jotcount+], [+jotlastdate+], [+jotlastauthor+]
Пример: вывести количество комментариев.
[!Ditto? &parents=`4` &extenders=`jotdatesort` &tpl=`@CODE:<h3><a href="[~[+id+]~]">[+title+]</a></h3>Количество комментариев: [+jotcount+]<br />Автор комментария: [+jotlastauthor+]<br />Дата последнего комментария: [+jotlastdate:date=`%d.%m.%Y, %H:%M:%S`+]<br />Дата поста: [+date+]<br />Автор поста: [+author+]` &jotfilter=`1` &jotauthorfield=`Гость`!]
где:
&extenders=`jotdatesort`- имя используемого расширения&jotfilter=`1`- не выводить без комментариев&extenders=`jotdatesort`- имя автора комментария (гостя)
level
Описание: вывод документов определенного уровня.
Параметры: &level
Плейсхолдеры: нет
Пример: вывести количество комментариев.
[!Ditto? &parents=`4` &extenders=`level` &depth=`3` &level=`3`!]
где:
&extenders=`level`- имя используемого расширения&depth=`3`- глубина сканирования&level=`3`- вывести документы 3-го уровня
search
Описание: поиск на Ditto.
Параметры: &searchFields, &searchOptions, &searchString, &searchOptionsSeparators
Плейсхолдеры: нет
Пример:
[!Ditto? &parents=`4` &extenders=`search` &searchString=`my search string` &searchFields=`content,tv1,tv2` &searchOptions=`caseSensitive` ...`!]
где:
&extenders=`search`- имя используемого расширения&searchString=`my search string`- поисковый запрос&searchFields=`content,tv1,tv2`- поля и переменные шаблона, по которым происходит поиск&searchOptions=`caseSensitive`- производить поиск с учетом регистра
tvFilter
Описание: фильтрация документов по заданным TV.
Параметры: &tvFilterBy, &tvFilterMode
Плейсхолдеры: нет
Пример: показать все дочерние документы контейнеров 3, 4 и 5, к которым привязан TV-параметр dummy.
[!Ditto? &parents=`3,4,5` &extenders=`tvFilter` &tvFilerBy=`dummy` &tvFilterMode=`0`!]
где:
&extenders=`tvFilter`- имя используемого расширения&tvFilerBy=`dummy`- имя TV-параметра, по которому происходит фильтрация&tvFilterMode=`0`- исключить документы, к которым НЕ привязан TV-параметр dummy
multiTvFilter
Описание: фильтрация строк переменной шаблона multiTv.
Параметры: &multiTvFilterBy, &multiTvFilterOptions
Плейсхолдеры: нет
Пример: показать все дочерние документы контейнеров 3, 4 и 5, у которых переменная шаблона multiTv event в столбце title не содержит Important.
[!Ditto?
&parents=`3,4,5`
&extenders=`@FILE assets/tvs/multitv/dittoExtender/multitvfilter.extender.inc.php`
&multiTvFilterOptions=`[{"name":"title","type":"text","value":"Important","mode":"contains"}]`!]
где:
&extenders=`@FILE assets/tvs/multitv/dittoExtender/multitvfilter.extender.inc.php`- имя используемого расширения&multiTvFilterBy=`event`- имя переменной шаблона multiTv, по которой происходит фильтрация&multiTvFilterOptions=`[{"name":"title","type":"text","value":"Important","mode":"contains"}]`- исключить элементы, у которых в столбцеtitleне содержитсяImportant