© Сделано на LiveStreet
Дизайн - ©2009 MODx RED Group

<?php
/**
* @name prevnextPage
* @author Gorbarov Iliya at gorbarov.ru
* @version 1.1
* @desc Создает ссылки на предыдущую и следующую страницы
*
* Сниппет устанавливает плейсхолдеры [+pnp_prev+] [+pnp_next+]
*
* В плейсхолдерах находятся ссылки на предыдущую и следующую страницы, в зависимости от настроек сниппета
* Плейсхолдеры устанавливаются только для документов в папке c &folderId
*
* &folderId - id папки
* &sortBy - поле в базе данных для сортировки, например pub_date
* &sortDir - Порядок сортировки ASC или DESC
* &showHidden - Показывать скрытые пункты в меню, по умолчанию - 0
* &letsCycle - Зациклить ссылки, по умолчанию - нет.
* &prevTpl - Чанк для предыдущей ссылки
* &nextTpl - Чанк для следующей ссылки
* &id - Префикс плейсхолдеров для мультивызовов. По умолчанию 'pnp_'
* &nextClass - CSS класс
* &prevClass - CSS класс
* &directOutput - Выводить результат напрямую, по умолчанию - использовать плейсхолдеры
* &directOutputTpl - Шаблоны прямого вывода, строка, по умолчанию, [+prev+] | [+next+]
*
* Пример самого "обычного вызова": [[prevnextPage? &directOutput=`1`]]
*
*/
if (!isset($folderId)) $folderId = 'parent';
if (!isset($sortBy)) $sortBy = 'menuindex';
if (!isset($sortDir)) $sortDir = 'ASC';
if (!isset($showHidden)) $showHidden = 0;
if (!isset($letsCycle)) $letsCycle = 0;
if (!isset($nextTpl) || !isset($prevTpl)) $useBuildInTpl = true;
if (!isset($nextClass)) $nextClass = '';
if (!isset($prevClass)) $prevClass = '';
if (!isset($directOutput)) $directOutput = 0;
if (!isset($directOutputTpl)) $directOutputTpl = '[+prev+] | [+next+]';
if (!isset($prevTpl)) $prevTpl = '<a href="[~[+id+]~]" class="'.$prevClass.'" title="[+pagetitle+]">[+pagetitle+]</a>';
if (!isset($nextTpl)) $nextTpl = '<a href="[~[+id+]~]" class="'.$nextClass.'" title="[+pagetitle+]">[+pagetitle+]</a>';
if (!isset($id)) $id = 'pnp_';
if (!function_exists('parseString')) {
function parseString($tpl,$data,$prefix = '[+',$suffix = '+]') {
foreach($data as $k => $v) {
$tpl = str_replace($prefix.(string)$k.$suffix, (string)$v, $tpl);
}
return $tpl;
};
}
$curId = $modx->documentIdentifier;
if ($folderId == 'parent') $folderId = array_pop($modx->getParentIds($curId,1));
$docs = $modx->getDocumentChildren ($folderId, 1, 0, 'id, pagetitle, parent', 'hidemenu = '.$showHidden, $sortBy, $sortDir, '');
foreach ($docs as $key=>$doc) {
if ($doc['id'] == $curId) $curKey = $key;
}
$curDoc = $docs[$curKey];
$next = $docs[$curKey + 1];
$prev = $docs[$curKey - 1];
if (!isset($next) && $letsCycle) {
$next = $docs[0];
}
if (!isset($prev) && $letsCycle) {
$prev = $docs[count($docs) - 1];
}
if ($useBuildInTpl) {
$rNext = parseString($nextTpl,array('id'=>$next['id'],'pagetitle'=>$next['pagetitle']));
$rPrev = parseString($prevTpl,array('id'=>$prev['id'],'pagetitle'=>$prev['pagetitle']));
} else {
$rNext = $modx->parseChunk($nextTpl,array('id'=>$next['id'],'pagetitle'=>$next['pagetitle']),'[+','+]');
$rPrev = $modx->parseChunk($prevTpl,array('id'=>$prev['id'],'pagetitle'=>$prev['pagetitle']),'[+','+]');
}
if ($curDoc['parent'] == $folderId) {
if ($directOutput) {
echo parseString($directOutputTpl,array('next' => $rNext, 'prev' => $rPrev));
} else {
if (isset($next)) $modx->setPlaceholder($id.'next',$rNext);
if (isset($prev)) $modx->setPlaceholder($id.'prev',$rPrev);
}
}
?>
[[prevnextPage?directOutput=`1`]]
Комментарии (40)
RSS свернуть / развернутьstyle-nes
ведь это наверное 99% случаев применения?
antonkuzmin
pitbull
а сниппет нужный :)
antonkuzmin
pitbull
antonkuzmin
Вон Breadcrumbs вообще шаблон в сниппете и без вариантов =)
Кстати, обновил код, чтобы по умолчанию был parent.
pitbull
Посему, добавились два параметра ;)
pitbull
Andchir
К тому же изобретение велосипедов развивает скилл разработчика =)
pitbull
Andchir
pitbull +1 безусловно… при любом раскладе :)
skmskm
Я свое использовал, мне было достаточно ;)
pitbull
pitbull
z211
Поставил, все работает.
Спасибо за сниппет.
sdp
pitbull
И ещё хорошо зациклить это дело, чтобы последний документ в папке ссылался на первый, можно тоже как параметр сделать да / нет.
P.S. Вначале поставил его, но пришлось отказаться к сожалению из-за того что показывает скрытые для других доки, которые не видны в меню. Но автору респект, просто и со вкусом…
SDee
А может есть в каком-нить из подобных?
Akool
pitbull
SDee
Pahom-ka
pitbull
SDee
pitbull
SDee
SDee
pitbull
— Учитывать или не учитывать скрытые в меню пункты
— Теперь можно «зацикливать» ссылки
— Использовать или не использовать плейсхолдеры
— Ну и упростил код, чтобы его было удобней модифицировать под свои нужды
pitbull
SDee
SDee
pitbull
SDee
SDee
SDee
Возникла необходимость прицепить тв-параметр документа к ссылкам вперед-назад, как это можно реализовать? Просто есть необходимость подцеплять к конопочкам маленькие превьюшки в статьях.
Спасибо!
SDee
Особенно порадовала гибкость настроек
Anysidor
SDee
«Only variables should be passed by reference»
В чем может быть дело, что не так?
Evo 1.0.5
w3d
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.