prevNext

    Сніпет Навігація по сусідніх документах Modx Evo

    Сніпет виведення сусідніх документів в MODX Evolution. Наприклад, посилання «Наступна стаття», «Попередня стаття», «Попередній товар», «Наступний товар».

    На багатьох сайтах після тексту статті часто можна зустріти блок посилань на інші матеріали сайту. Наприклад, посилання «Наступна стаття», «Попередня стаття». Також на сторінці товару, крім самого товару, можна побачити посилання на сусідні товари з тієї ж категорії.

    У Ditto, як і у Wayfinder, я такої можливості не знайшов. Тому написав простий сніпет і вирішив поділитися їм тут. Сподіваюся комусь він стане в нагоді. Сніпет, як і було сказано вище, дуже простий - відмінний приклад для тих, хто тільки починає писати свої рішення для MODX. У коді безліч коментарів, так що проблем з розумінням виникнути не повинно.

    Сніпету можна передавати 4 параметра:

    • &tpl – чанк-шаблон для виведення списку посилань (обов'язковий параметр)
    • &prevDocs – кількість документів з меншим ID (необов'язковий параметр)
    • &nextDocs – кількість документів з великим ID (необов'язковий параметр)
    • &sortRevert – порядок сортування документів (необов'язковий параметр)

    Чанк-шаблон:

    <a href="[~[+id+]~]">[+pagetitle+]</a>
    
    <?php
        // визначаємо значення за замовчуванням 
        $prevDocs = (isset($prevDocs)) ? $prevDocs : 2; // кількість сусідніх документів з меншим ID
        $nextDocs = (isset($nextDocs)) ? $nextDocs : 2; // кількість сусідніх документів з великим ID
    
        $sortRevert = (isset($sortRevert)) ? $sortRevert : 0; // параметр визначає порядок сортування
    
        // невелика перевірка наданих в параметрах значень
        $prevDocs = (int) $prevDocs;
        $nextDocs = (int) $nextDocs;
        $sortRevert = (int) $sortRevert;
    
        // отримуємо ID документа на якому відбувається виклик даного сніпета
        $id = $modx->documentIdentifier;
    
        // отримуємо ID документа-батька 
        $parent = $modx->documentObject['parent'];
    
        // перевірити чи не встановлено чанк
        if (!isset($tpl)) {
            echo "No chunk defined for siblings-snippet!";
            return;
        }
    
        // перевіряємо чи існує чанк
        if ($modx->parseChunk($tpl,array()) === NULL) {
            echo "Chunk specified, but not found!";
            return;
        }
    
        // отримуємо дані про сусідні документи з меншим ID
        $prev = $modx->db->makeArray($modx->db->select('id, pagetitle', 'modx_site_content', "id < {$id} and parent = {$parent} and published = 1", 'id DESC', $prevDocs));
    
        // отримуємо дані про сусідні документи з великим ID
        $next = $modx->db->makeArray($modx->db->select('id, pagetitle', 'modx_site_content', "id > {$id} and parent = {$parent} and published = 1", 'id ASC', $nextDocs));
    
        // об'єднуємо отримані даний в один масив
        $siblings = array_merge($next, $prev);
    
        // визначаємо масив в якому буде зберігатися індексований масив
        $indexed = array();
    
        // створюємо масив з індексами складеними з ID документів
        foreach ($siblings as $sibling) {
            $indexed[$sibling['id']] = $sibling;    
        }
    
        // сортуємо
        if ($sortRevert === 1) {
            rsort($indexed);
        } else {
            sort($indexed);
        }
    
        // формуємо html
        foreach($indexed as $sibling){
            $html .= $modx->parseChunk(
                $tpl,
                array(
                    'id' => $sibling['id'],
                    'pagetitle' => $sibling['pagetitle']        
                ),
                '[+','+]'
            );
        }
        echo $html;
    ?>
    

    <?php
    $ID = $modx->documentIdentifier;
    $parentId = array_pop($modx->getParentIds($modx->documentIdentifier, 1));
    
    $children = $modx->getActiveChildren($parentId, 'menuindex', 'ASC');
    
    $i=0;
    $key = false;
    while(!$key && $i < count($children)){
        $key = array_search($ID, $children[$i]);
        $i++;
    }
    
    if(!empty($key) && count($children) > 1){
        $placeholders = array(
            'prev'=>($i-2 >= 0 ? '<a href="'.$modx->makeUrl($children[$i-2]['id']).'">« назад</a>' : ''),
            'next'=>($i < count($children) ? '<a href="'.$modx->makeUrl($children[$i]['id']).'">вперед »</a>' : '')
        );
        $output = $modx->parseChunk('prevnext', $placeholders, '[+', '+]');
    }
    return $output;
    ?>
    

    Сніпет виводить результат в чанк prevnext, в якому використовуються два плейсхолдера:

    [+prev+] [+next+]

    Приклад сніпетів виведення сусідніх документів