Розробникам

    Контролери

    Ім'я класу розташованого у файлі 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);
                    }
            }
            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();
    }

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