Екстендери сніпета Ditto це додаткові розширення які дозволяють вирішувати додаткові завдання.
Екстендери - це додаткові розширення, які дозволяють вирішувати додаткові завдання. Всі екстендери Ditto лежать в папці assets/snippets/ditto/extenders/
.
Опис: Призначений для фільтрації документів по даті, може використовуватися разом зі сніпетом Reflect.
Параметри: &dateFilterSource
, &dateFilterDefault
, &month
, &year
, &day
Плейсхолдери: [+year+]
, [+month+]
, [+day+]
, [+month_numeric+]
Приклад:
<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`
- поле по якому буде відбуватися фільтраціяОпис: Зміна параметрів Ditto через URL.
Параметри: &stripTags
, &bad
, &good
Плейсхолдери: ні
Приклад:
<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+]
.
Параметри: &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=`Докладніше...`
- текст посилання на докладний описОпис: Фільтрація документів за тегами.
Параметри: &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 документа, де буде виводитися список відфільтрованих документівДжерело: /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`
- параметри, за якими відбувається фільтрація документів.Опис: Підрахунок кількості документів.
Обов'язкові параметри: ні.
Плейсхолдери: [+count+]
Приклад: Вивести загальну кількість документів в контейнерах 3,4,5:
[!Ditto? &tpl=`@CODE:[+count+]` &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.
Параметри: ні
Плейсхолдери: [+jotcount+]
Приклад: вивести кількість коментарів.
[!Ditto? &parents=`4` &extenders=`jotcount` &tpl=`@CODE:<h3>[+pagetitle+] <small>[+jotcount+]</small></h3>`!]
де:
&extenders=`jotcount`
- ім'я використовуваного розширенняОпис: інформація про коментарі 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
Плейсхолдери: ні
Приклад: вивести кількість коментарів.
[!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