Екстендери сніпета Ditto це додаткові розширення які дозволяють вирішувати додаткові завдання.
Екстендери - це додаткові розширення, які дозволяють вирішувати додаткові завдання. Всі екстендери Ditto лежать в папці assets/snippets/ditto/extenders/.
Опис: Призначений для фільтрації документів по даті, може використовуватися разом зі сніпетом Reflect.
Параметри: &dateFilterSource, &dateFilterDefault, &month, &year, &day
Плейсхолдери: , , ,
Приклад:
<form id="dateFilterForm" method="get" action="04_extras/ditto/06_ekstendery.html">
<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> </h3>
[!Ditto? &parents=`163` &extenders=`dateFilter` &dateSource=`createdon`!]
где:
&extenders=`dateFilter` - ім'я використовуваного розширення&dateSource=`createdon` - поле по якому буде відбуватися фільтраціяОпис: Зміна параметрів Ditto через URL.
Параметри: &stripTags, &bad, &good
Плейсхолдери: ні
Приклад:
<form action="04_extras/ditto/06_ekstendery.html" 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:<br>` &extenders=`request` &sortBy=`pagetitle`!]
где:
&extenders=`request` - ім'я використовуваного розширення&sortBy=`pagetitle` - параметр, за яким проводиться сортуванняОпис: Формування короткого опису і підстановка цього опису в плейсхолдер .
Параметри: &truncSplit, &trunc, &truncAt, &truncLen, &truncOffset, &truncText, &tplTrunc.
Плейсхолдери: ,
Приклад:
Вивести анотації до документів, але поле у документів буде не у всіх. У шаблоні замість плейсхолдера вставляємо плейсхолдер , а виклик сніпета стане таким:
[!Ditto? &tpl=`@CODE:<h3></h3><p></p><p></p>` &parents=`2` &extenders=`summary` &truncLen=`400` &truncText=`Докладніше...`!]
де:
&extenders=`summary` - ім'я використовуваного розширення&truncLen=`400` - максимальна кількість відображуваних символів&truncText=`Докладніше...` - текст посилання на докладний описОпис: Фільтрація документів за тегами.
Параметри: &tagDocumentID, &tags, &tagMode, &tagDelimiter, &caseSensitive, &tagDisplayDelimiter, &tagSort, &tagData, &tagDisplayMode, &tplTagLinks, &tagCallback
Плейсхолдери: ,
Екстендер tagging автоматично підключається при використанні параметра &tagData. Як значення параметра &tagData використовується ім'я TV-параметра з типом введення Text, Radio Options або Check Box. За замовчуванням, роздільником між тегами є пробіл. Змінити роздільник можна за допомогою параметра &tagDelimiter=`, `. Теги відображаються в плейсхолдере у вигляді набору посилань.
[!Ditto? &parents=`4` &tagData=`keyw` &tagDelimiter=`,` &tagDisplayDelimiter=`, ` &tpl=`@CODE:<h3><small></small></h3>` &tagSort=`0` &tagDocumentID=`2947`!]
де:
&tagData=`keyw` - поле документа або змінна шаблону, що містить теги&tagDelimiter=`,` - роздільник між тегами&tagDisplayDelimiter=`, ` - роздільник між тегами при їх виведенні&tagSort=`0` - відключаємо сортування тегів за алфавітом&tagDocumentID=`2947` - ID документа, де буде виводитися список відфільтрованих документівДжерело: /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` - параметри, за якими відбувається фільтрація документів.Опис: Підрахунок кількості документів.
Обов'язкові параметри: ні.
Плейсхолдери:
Приклад: Вивести загальну кількість документів в контейнерах 3,4,5:
[!Ditto? &tpl=`@CODE:` &parents=`3,4,5` &extenders=`countDocs` &display=`1`!]
де:
&extenders=`countDocs` - ім'я використовуваного розширення&display=`1` - встановлюємо значення рівне 1, так як нам необхідно вивести тільки один раз.Джерело: distinct
Опис: Повертає тільки унікальні результати полів, зазначених в якості значення параметра &distinct=`param1,param2`.
Параметри: &distinct
Плейсхолдери: ні
Приклад: отримати тільки унікальні заголовки сторінок для кожної дати.
[!Ditto? &parents=`4` &extenders=`distinct` &distinct=`pagetitle,pub_date`!]
де:
&extenders=`distinct` - ім'я використовуваного розширення&distinct=`pagetitle,pub_date` - параметри, за якими проводиться фільтраціяДжерело: Створити екстендер в 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
Опис: просунута фільтрація документів.
Параметри: &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 : '');
?>
Опис: кількість коментарів Jot до певної сторінці в шаблоні Ditto.
Параметри: ні
Плейсхолдери:
Приклад: вивести кількість коментарів.
[!Ditto? &parents=`4` &extenders=`jotcount` &tpl=`@CODE:<h3> <small></small></h3>`!]
де:
&extenders=`jotcount` - ім'я використовуваного розширенняОпис: інформація про коментарі Jot до певної сторінці в шаблоні Ditto.
Параметри: &jotfilter, &jotauthorfield
Плейсхолдери: , ,
Приклад: вивести кількість коментарів.
[!Ditto? &parents=`4` &extenders=`jotdatesort` &tpl=`@CODE:<h3><a href="[~~]"></a></h3>Кількість коментарів: <br />Автор коментаря: <br />Дата останнього коментаря: <br />Дата поста: <br />Автор поста: ` &jotfilter=`1` &jotauthorfield=`Гість`!]
де:
&extenders=`jotdatesort` - ім'я використовуваного розширення&jotfilter=`1` - не виводити без коментарів&extenders=`jotdatesort` - ім'я автора коментаря (гостя)Опис: висновок документів певного рівня.
Параметри: &level
Плейсхолдери: ні
Приклад: вивести кількість коментарів.
[!Ditto? &parents=`4` &extenders=`level` &depth=`3` &level=`3`!]
де:
&extenders=`level` - ім'я використовуваного розширення&depth=`3` - глибина сканування&level=`3` - вивести документи 3-го рівняОпис: пошук на 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` - проводити пошук з урахуванням регіструОпис: фільтрація документів по заданим 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Опис: фільтрація рядків змінної шаблону 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