Сниппет может выводить страницы как на прямую так и через установленые плейсхолдеры [+page_prev+] и [+page_next+]. Шаблон плейсхолдеров можно задать чанке. Можно установить префикс для плейсхолдеров, для множественного вызова на странице.
Если в родительском документе один дочерный документ ссылки не выводятся. Если два дочерных документа - выводится одна, предыдущая или следующая, страница. Если дочерных страниц больше чем две можно «зацикливать» ссылки. Это касается первой и последней страницы в родительском документе.
Также можно учитывать или не учитывать скрытые в меню пункты, использовать плейсхолдеры или выводить на прямую, использовать свой класс для ссылок и оформить шаблон для ссылки в чанке.
Но что самое главное, в сниппете, можно использовать любые поля документа и TV в том числе (например что бы присоединить изображение в шаблоне).
Итак, приступим к установке сниппета. Еще хочу сказать, что для работы данного сниппета используется библиотека ddTools, скачать можно здесь.
Установка сниппета PagesPrevNext
1. Созданим сниппет, который и будет обрабатывать даные:
- Название сниппета: PagesPrevNext
- Описание: Ссылки на предыдущую и следующую страницы
- Код сниппета:
<?php
/*
* @name PagesPrevNext
* @author Watson
* @version 1.2
* @description Создает ссылки на предыдущую и следующую страницы по необходимым полям документа (и TV в том числе)
* @copyright 2014, CMS-Blog.ru
*
*/
//Подключаем modx.ddTools
require_once $modx->config['base_path'].'assets/snippets/ddTools/modx.ddtools.class.php';
if (isset($field)) {
$id = isset($id) ? $id : 'page_';
$pageCycle = (isset($pageCycle) && $pageCycle == '1') ? true : false;
$nextClass = isset($nextClass) ? $nextClass : 'next';
$prevClass = isset($prevClass) ? $prevClass : 'prev';
$sortBy = isset($sortBy) ? $sortBy : 'pub_date';
$sortDir = isset($sortDir) ? $sortDir : 'ASC';
$showHidden = (isset($showHidden) && $showHidden == '1') ? 1 : 0;
$output = (isset($output) && $output == '1') ? true : false;
$curentId = $modx->documentIdentifier;
$folderId = array_pop($modx->getParentIds($curentId,1));
$docId = $modx->getDocumentChildren($folderId, 1, 0, 'id', 'hidemenu = '.$showHidden, $sortBy, $sortDir.'');
$countDoc = count($docId);
if ($countDoc == 1) return;
foreach ($docId as $docKey => $docValue) {
if ($docValue['id'] == $curentId) $curentKey = $docKey;
}
$nextId = $docId[$curentKey + 1];
$prevId = $docId[$curentKey - 1];
if ($countDoc != 2) {
if (!isset($nextId) && $pageCycle) $nextId = $docId[0];
if (!isset($prevId) && $pageCycle) $prevId = $docId[$countDoc - 1];
}
$fieldDoc = explode(',', $field);
if (isset($nextId)) {
$nextDoc = ddTools::getTemplateVarOutput($fieldDoc, $nextId['id']);
$nextDoc['class'] = $nextClass;
$resultNext = $modx->parseChunk($pageTpl, $nextDoc, '[+', '+]');
}
if (isset($prevId)) {
$prevDoc = ddTools::getTemplateVarOutput($fieldDoc, $prevId['id']);
$prevDoc['class'] = $prevClass;
$resultPrev = $modx->parseChunk($pageTpl, $prevDoc, '[+', '+]');
}
if ($output) {
$modx->setPlaceholder($id.'next', $resultNext);
$modx->setPlaceholder($id.'prev', $resultPrev);
} else {
$result = ddTools::parseText('[+next+][+prev+]', array('next' => $resultNext,'prev' => $resultPrev));
return $result;
}
}
?>
2. Создадим чанк с шаблоном вывода ссылки:
- Название чанка: PagesLinkTpl
- Описание: Шаблон блока с ссылкой
- Код чанка:
<div class="[+class+]">
<img src="[+image+]" alt="[+pagetitle+]" />
<h3><a href="[~[+id+]~]">[+pagetitle+]</a></h3>
<p>[+introtext+]</p>
</div>
3. В шаблон страницы где будут выводится ссылки на предыдущую и следующую страницы вставляем вызов сниппета PagesPrevNext:
- получение значений полей документа (id,pagetitle,introtext и TV image) которые используются в чанке
- чанк шаблона ссылок 'PagesLinkTpl'
- ссылки циклические
<div id="pages">
[[PagesPrevNext? &field=`id,pagetitle,introtext,image` &pageCycle=`1` &pageTpl=`PagesLinkTpl`]]
</div>
4. Осталось только оформить стилями контейнер id="pages" с сылками.
Параметры снипета FileDownload
- id - Префикс плейсхолдеров для вывода результата, по умолчанию - 'page_'
- field - Поля документа, которые надо получить, перечисленные через запятую
- pageTpl - Чанк для шаблона ссылок
- pageCycle - Циклические ссылки (0 - нет, 1 - да), по умолчанию - 0
- nextClass - CSS класс, по умолчанию - 'next'
- prevClass - CSS класс, по умолчанию - 'prev'
- sortBy - Поле в базе данных для сортировки, по умолчанию - 'pub_date'
- sortDir - Порядок сортировки ASC или DESC, по умолчанию - 'ASC'
- showHidden - Показывать скрытые пункты в меню (0 - нет, 1 - да), по умолчанию - 0
- output - Вывод результата (0 - напрямую, 1 - через плэйсхолдеры [+page_next+][+page_prev+]), по умолчанию - 0
Так как парсер иногда съедает код, выкладываю файл для скачивания даного сниппета. В архиве будет файл сниппета и текстовый документ с чанками.