Пользователь
0,0
рейтинг
2 апреля 2012 в 18:42

Разработка → Вывод соседних документов в MODX Evolution из песочницы

MODX*
На многих сайтах после текста статьи часто можно встретить блок ссылок на другие материалы сайта. Например, ссылки «Следующая статья», «Предыдущая статья». Также на странице товара, помимо самого товара, можно увидеть ссылки на соседние товары из той же категории.

Однажды передо мной встала задача вывести на каждой странице товара ссылки на другие товары в той же категории, причем соседние.

У 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;
		?>
		
Павел Якимов @yakimoff
карма
7,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (5)

  • +3
    Написали бы, что это для Evo :) Кстати, для Revo есть сниппет — selfLink.

    Но за то, что написали — молодец, плюсую!
    • 0
      Спасибо, поправил!
  • 0
    Америку не открыли
    DocLink 1.0.1
    Released Jun 09, 2009
    • 0
      Показанный Вами сниппет (кстати, большое спасибо! добавил в закладки) выводит только по 1 соседнему документу с каждой стороны. В моем случае нужно было выводить по 3 соседних документа с обеих сторон, так что DocLink меня бы не выручил.
  • 0
    Я тоже в свое время писал такой, людям нравиццо!

    prevnextPage

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.