Ссылки на предыдущую и следующую страницы по необходимым полям документа

Ссылки на предыдущую и следующую страницы
Дата: 19 Ноября 2014, в 12:06
Рубрика: MODx Evolution
Просмотры: 1650

Вероятно у всех рано или поздно возникает необходимость создать ссылки на предыдущую и следующую страницы в родительском документе да еще и по необходимым полям документа, и TV в том числе. Собственно для этого мною и был написан сниппет.

Сниппет может выводить страницы как на прямую так и через установленые плейсхолдеры [+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

Так как парсер иногда съедает код, выкладываю файл для скачивания даного сниппета. В архиве будет файл сниппета и текстовый документ с чанками.

Скачать / Download [1.74k] Дата: 30-01-2015 Скачали: 35