Екстендери

    Ditto: Екстендери

    Екстендери сніпета Ditto це додаткові розширення які дозволяють вирішувати додаткові завдання.

    Екстендери - це додаткові розширення, які дозволяють вирішувати додаткові завдання. Всі екстендери Ditto лежать в папці assets/snippets/ditto/extenders/.

    dateFilter

    Опис: Призначений для фільтрації документів по даті, може використовуватися разом зі сніпетом Reflect.

    Параметри: &dateFilterSource, &dateFilterDefault, &month, &year, &day

    Плейсхолдери: [+year+], [+month+], [+day+], [+month_numeric+]

    Приклад:

    Застосування

    Автор: Admin від 19.03.2015
    Ditto це потужний інструмент для створення блогу, виведення блоків новин, каталогу товарів, пагінації, показу короткої версії статті, генерування архівів та сортування по заголовку.

    Параметри

    Автор: Admin від 19.03.2015
    Параметри сніпета Ditto.

    Шаблони

    Автор: Admin від 19.03.2015
    Шаблони сніпета Ditto.

    Параметри пагінації

    Автор: Admin від 19.03.2015
    Параметри пагінації сніпета Ditto.

    Параметри summary

    Автор: Admin від 19.03.2015
    Параметри summary сніпета Ditto.

    Параметри dateFilter

    Автор: Admin від 19.03.2015
    Параметри dateFilter сніпета Ditto.

    Параметри tagging

    Автор: Admin від 19.03.2015
    Параметри tagging сніпета Ditto.

    Параметри request

    Автор: Admin от 19.03.2015
    Завдяки екстендерів request сніпет Ditto обробляє значення і виводить результат відповідно до переданих параметрів.

    Параметри glossaryFilter

    Автор: Admin від 19.03.2015
    Параметри glossaryFilter сніпета Ditto.

    Параметри search

    Автор: Admin від 19.03.2015
    Параметри search сніпета Ditto.

    Параметри tvFilter

    Автор: Admin від 19.03.2015
    Фільтрація по ТВ параметрам в сніпеті Ditto.

    Плейсхолдери

    Автор: Admin від 19.03.2015
    У Дітто є свої власні пдейсхолдери плюс він підтримує змінні (поля), які використовуються в кожному документі.

    Приклади

    Автор: Admin від 19.03.2015
    Приклади виклику сніпета Ditto.

    Екстендери

    Автор: Admin від 19.03.2015
    Екстендери сніпета Ditto це додаткові розширення які дозволяють вирішувати додаткові завдання.
    <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