DLLastViews: последние просмотренные документы

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


<?php
/**
 * DLLastViews
 *
 * Conclusion viewed products with DocLister.
 *
 * @category    snippet
 * @version     1.1
 * @internal    @properties &expired=Время хранения cookie;text;2592000;2592000;по умолчанию: 30 дней &maxDocs=Сколько документов запоминать;text;5;5
 * @internal    @modx_category Content
 * @internal    @installset base
 * @author      Created By mkot, optimization Pathologic
 * 
 * @lastupdate  04/09/2017
 */

if (!isset($params['mode'])) $params['mode'] = 'register';
if (!isset($params['tpl'])) $params['tpl'] = '@CODE: <a href="[+url+]">[+title+]</a>';
$maxDocs = isset($maxDocs) ? $maxDocs : 5;
$expired = isset($expired) ? $expired  : 2592000;
$params['idType'] = 'documents';
$item = array();

if (isset($_COOKIE['last_view']) and $_COOKIE['last_view'] != '') {
    $params['documents'] = $_COOKIE['last_view'];   
	$item = explode(',', $_COOKIE['last_view']);   
}

switch ($params['mode']) {
    case 'register':
        if (!in_array($modx->documentIdentifier, $item)) {
            array_unshift($item, $modx->documentIdentifier);
            array_slice($item, 0, $maxDocs - 1);
            setcookie('last_view', implode(',', $item), time()+$expired, '/');
        }
    break;
    
    case 'show':      
        if (!empty($item)) {
			return $modx->runSnippet('DocLister',$params);
		}
    break;
	default:
	break;
}



Установка:
  1. Создать новый сниппет и вставить туда код
  2. Поставить галочку «Анализировать DocBlock» и сохранить

Использование:
На страницах, которые нужно запоминать написать не кэшируемый вызов без параметров:
[!DLLastViews!]

Там где нужно выводить список просмотренных документов написать некэшируемы вызов с параметрами. Все параметры, как у DocLister'а (кроме idType, он жестко задан в сниппете) и добавить параметр '&mode=`show`'

Пример:

[!DLLastViews? 
    &mode=`show`
    &ownerTPL=`@CODE:<ul>[+dl.wrap+]</ul>`
    &tpl=`@CODE: <li><a href="[+url+]">[+title+]</a></li>`
!]

Выведет список документов.

В свойствах сниппета есть два параметра:
  1. Время хранения cookie. Задается в секундах, по умолчанию 30 дней
  2. Сколько документов запоминать? По умолчанию: 5

За основу брал вот этот сниппет

Спасибо за внимание.

7 комментариев

avatar
Не совсем понял: а в чем принципиальная разница то от оригинала? То что для вывода используется DL и есть пара настроек?
avatar
Вместо

if (count($item) >= $maxDocs) {
    array_pop($item);
    array_unshift($item, ($modx->documentIdentifier + ""));
} else {
    array_unshift($item, $modx->documentIdentifier);
}

можно сделать так:

array_unshift($item, $modx->documentIdentifier);
array_slice($item, 0, $maxDocs - 1);
avatar
Спасибо!
avatar
ошибка в описание
Использование:
На страницах, которые нужно запоминать написать не кэшируемый вызов без параметров:
[!DLLastViews!}

[!DLLastViews!]
avatar
Спасибо, поправил.
avatar
и тут с кавычками:
[!DLLastViews? 
    &mode=`show`
    &ownerTPL=`<ul>[+dl.wrap+]</ul>`
    &tpl=`@CODE: <li><a href="[+url+]>[+title+]</a></li>"`
!]
на
Пример:

[!DLLastViews? 
    &mode=`show`
    &ownerTPL=`<ul>[+dl.wrap+]</ul>`
    &tpl=`@CODE: <li><a href="[+url+]">[+title+]</a></li>` 
!]
avatar
еще @CODE: в ownerTPL
&ownerTPL=`@CODE:<ul>[+dl.wrap+]</ul>`
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.