В интернет-магазине на базе shopkeeper необходимо было сделать список просмотренных товаров. Так же, решение можно использовать для вывода любых просмотренных документов.

Для хранения массива просмотренных товаров будем использовать cookie. Создаем сниппет viewedDocuments:

<?php
$docid = $modx->documentIdentifier;
$site_url = $modx->config['site_url'];
$site_url = substr($site_url,7,-1);
if (!isset($_COOKIE['viewedDocuments'])) {
	setCookie('viewedDocuments', $docid, 0, '/', $site_url);
}
else {
	$docs = explode(",",$_COOKIE['viewedDocuments']);
	if (!in_array($docid,$docs)) $docs[] = $docid;
	$docs = implode(",",$docs);
	setCookie('viewedDocuments', $docs, 0, '/', $site_url);
}
return;
?>

Этот сниппет необходимо вызывать некэшируемым в нужном шаблоне. В моем случае, это шаблон товара. Добавляем вызов:

[!viewedDocuments!]

Теперь необходимо вывести документы, которые уже есть в куках. В случае, если товар (документ) еще не просмотрен, блок выводить не будем.
Создаем сниппет cookieDocuments:

<?php
if (!isset($_COOKIE['viewedDocuments'])) return;
$docs = explode(",",$_COOKIE['viewedDocuments']);
$doclist = array();
foreach ($docs as $doc) {
	if (intval($doc) != 0) $doclist[] = intval($doc);
}
if (count($doclist) == 0) return;
$doclist = array_reverse($doclist);
$doclist = implode(",",$doclist);
$output = $modx->runSnippet('Ditto',array(
	'documents' => $doclist,
	'tpl' => $tpl,
	'outerTpl' => $wrapper,
	'display' => '30',
	'extenders' => 'customsort'
));
return $output;
?>

Вызываем сниппет в том месте, где необходимо вывести список:

[!cookieDocuments? &tpl=`vdoc_tpl` &wrapper=`vdoc_wrapper`!]

В параметре display установите максимальное число выводимых документов. Чанк для вывода документа vdoc_tpl создается по логике Ditto &tpl. Чанк vdoc_wrapper — обертка для результатов, если они есть. У меня он имеет следующий вид:

<div class="viewDocs">
	<div class="vcaption">Просмотренные товары:</div>
		<div class="vcarousel">
			<ul>
				[+ditto+]
			</ul>
		</div>
	</div>
</div>

Код далеко не идеальный, например, можно установить лимит количества документов в куках или куки ставить через javascript, чтоб не вызывать сниппет. Но в условиях поставленной задачи этот вариант полностью устраивает клиента (просмотренные товары выводятся каруселью).