Решение: История просмотров на MODx Revo
Реализация сниппета, который бы выводил историю просмотренных страниц.
Ранее создавал "Вопрос" История просмотренных страниц на MODx Revo, в ней Василий Наумкин поделился ссылкой, на содержании данной ссылки, спустя время, написал сниппет.
Представляю к вашему вниманию.
Сниппет LastView:
<?php
$id = $modx->resource->id;
if (!isset($limit)) {$limit = 10;}
if (!isset($show)) {$show = 0;}
if (!isset($snippet)) {$snippet = 0;}
if (!isset($parents)) {$parents = 0;}
if (!isset($tpl)) {$tpl = 'tpl.LastView';}
if (!isset($except)) {$except = 0;} else {$except = split(",",$except);}
// Проверяем исключения
if($except != false) {
$add = 1;
foreach ($except as $value) {
if($value == $id) {$add = 0;}
}
}
// Добавляем просмотренную страницу
if ($add != false) {
if (!isset($_SESSION['viewed'])) {
$_SESSION['viewed'] = array($id);
} else {
if (in_array($id, $_SESSION['viewed'])) {
$key = array_search($id, $_SESSION['viewed']);
unset($_SESSION['viewed'][$key]);
}
if (count($_SESSION['viewed']) > $limit) {
array_shift($_SESSION['viewed']);
}
$_SESSION['viewed'][] = $id;
}
}
// Предварительные проверки
if ($show == '1') {
if (!isset($_SESSION['viewed'])) {return;}
$ids = array_reverse($_SESSION['viewed']);
if (empty($ids)) {return;}
}
// Выводим просмотренные страницы без вызова сниппета
if ($show == '1' && $snippet == false) {
$output = '';
foreach ($ids as $tsID) {
if($tsID != $id) {
$page = $modx->getObject('modResource', $tsID)->toArray();
$output .= $modx->getChunk($tpl, $page);
}
}
return $output;
}
// Выводим просмотренные страницы через вызов сниппета
if ($show == '1' && $snippet != false) {
$config = array(
'resources' => '-'.$id.','.implode(',', $ids)
,'parents' => $parents
,'limit' => $limit
,'tpl' => $tpl
);
return $modx->runSnippet($snippet, $config);
}
пример вызова:
[[!LastView? &limit=`10` &show=`1` &snippet=`0` &parents=`0` &tpl=`tpl.LastView` &except=`[[++site_start]],404,502`]]
пример шаблона tpl.LastView:
<a href="[[~[[+id]]]]">[[+pagetitle]]</a>
так же можно использовать вывод любых других данных документа
доступные значения:
-
&limit - лимит отображаемых и записываемых id страниц, по умолчанию 10
-
&show - отображать страницы или нет (0/1), по умолчанию 0 (будет записывать, но не отображать)
-
&snippet - наименование сниппета, с помощью которого будут выводиться данные (pdoResources, getResources и т.п.), по умолчанию 0 (false, то будет выводить данные с помощью modResource)
-
&parents - id родительского документа, по умолчанию 0
-
&tpl - наименования чанка с шаблоном, по умолчанию tpl.LastView.
-
&except - id исключаемых документов через запятую, по умолчанию 0.
Мой пример: Проект про офтальмологию (История просмотров, перед футером страницы)
.
-- Вот и всё, возможно кому нибудь пригодится
0
👍
👎
❤️
🔥
😮
😢
😀
😡
3 506
07.10.2013, 16:09:07
25 комментариев
Александр Котлов
07.10.2013, 22:15:25
Большое спасибо!
Павел Левин
07.10.2013, 22:40:13
Всегда пожалуйста
Александр Наумов
07.10.2013, 23:01:48
Спасибо за сниппет!!
Александр Котлов
07.10.2013, 23:04:40
А если еще в начало вставвить
а в конец
то он будет отлично выводить картинку просмотренного товара минишоп)
Антон Соловьёв
08.10.2013, 15:21:38
прощения за офтоп, но зачем на сайте куркод, что даёт? я не собираюсь холифарить, просто короткий ответ.
Павел Левин
08.10.2013, 16:14:15
В смартфонах есть функция распознания qr-кода, соответственно можно спокойно сфоткать монитор или распечатку с qr-кодом и перейти на страницу, в данном примере, каждая страница имеет свой qr-код, в котором url текущей страницы. Пока мобильной версии нет, но планируется.
Пользователи разные бывают :-)
Антон Соловьёв
08.10.2013, 16:21:19
Но если они уже в интернете на стационарном компе, зачем и с мобилы входить? продолжить чтение в транспорте типа?
Воеводский Михаил
08.10.2013, 16:29:45
Можно в транспорте, а можно на мобильнике оставить открытым окно с контактами, когда собираешься ехать в эту компанию. Ситуации бывают разные :)
Антон Соловьёв
08.10.2013, 16:38:54
Спасибо. Наконец-то дошло )
Павел Левин
08.10.2013, 18:41:40
Поправил код, добавив исключение текущей страницы из вывода.
Mihan
14.11.2013, 01:25:38
Отличное решение, спасибо.
Вывожу перед сниппетом текст "Вы недавно смотрели:". Не подскажете, как скрывать его, если массив пустой?
Павел Левин
14.11.2013, 18:53:30
Можно дописать скрипт:
Александр Москвин
14.11.2013, 16:22:53
Что-то сайт подтормаживает. 3.9 секунды одну страницу открывает, потом 0.69.
Когда я делал сайт http://tokyorope.ru/ - я максимально увеличил скорость генерации, сам можешь заценить.
Павел Левин
14.11.2013, 18:50:18
На сайте громоздкое меню, плюс проверка нового, в отличии от меню, проверка нового не кэшируется. В остальном пока думаю, что делать, много фильтров использовано.
Вадим Еременко
21.04.2014, 15:02:57
Добрый день! Сниппет работает отлично, но один момент никак не пойму - как подключить вывод ТВ параметров? В частности нужно изображение и цена... Просьба сильно ногами не пинать - первый проект на Revo) Спасибо)
Aleksey
04.07.2014, 17:49:05
Добрый день, у вас получилось сделать вывод ТВ?
Aleksey
04.07.2014, 17:48:36
Всем доброго дня, а как сделать чтобы тв параметры из шаблона тоже парсились? Заранее спасибо за ответ
Павел Левин
04.07.2014, 18:02:48
Мне кажется вам сюда. Думаю речь идет о товарах?
Aleksey
04.07.2014, 18:14:10
Да речь о товарах. По ссылке, что вы прислали про тв ничего нет.
Павел Левин
04.07.2014, 19:07:11
Там есть упоминания в коде. --
Template VariablesGetting the processed value of a TV from the current document (or any document you have a reference to) is easy with this method (note that both instances of the letter 'V' in getTVValue() are capitalized):
or
Getting the value of a TV in another document is a little more tricky because the processed value of the TV can be different for each document it's embedded in. As a result, you have to either get the resource object using the method above, or use specific methods of the TV and send along the ID of the document. Assuming that $id is the ID of the document (not the TV):
Aleksey
04.07.2014, 19:20:58
спасибо огромное
Павел Левин
04.07.2014, 19:20:42
По идее. Просто надо дописать необходимые параметры в массив согласно документации сниппета и вызывать через pdoResources или getResources, самый простой вариант:
Саша Иващенко
21.07.2014, 07:52:15
а как не показывать каталоги? а оставить только документы
Павел Левин
21.07.2014, 13:41:07
Думаю если поставить после
эту строку
То каталоги, которые имеют значение "1" не будут выводиться. Не знаю точно, возможно там и "0" в место пустоты, надо пробовать. Можно поиграть с 'true' и 'false'
Павел Левин
21.07.2014, 13:47:14
Хотя ,если получше подумать, стоит прервать добавление в список страниц.
За основу возьмем этот код:
и вставим
внутрь условия
получаем
В результате, каталоги не пройдут в список истории просмотра. Должно работать =)
bezumkin.ru
Личный сайт Василия Наумкина
Прямой эфир
Василий Наумкин
03.12.2024, 13:13:34
Генерация - это создание статичный файлов, для их работы потом pm2 не нужен, только правильная настр...
Василий Наумкин
01.07.2024, 11:56:41
Да, верно, именно так.
А в контроллере, скорее всего, ловить данные методом post.
Василий Наумкин
26.06.2024, 09:38:15
О, точно, вылезает если не залогинен.
Спасибо, исправил!
Василий Наумкин
09.04.2024, 04:45:01
> Ошибка 500
Это не похоже на ошибку Nginx, это скорее всего ошибка PHP - надо смотреть его логи.
...
russel gal
09.03.2024, 20:17:18
> А этот стоило написать хотя бы затем, чтобы получить комментарий от юзера, который ничего не писал...
Александр Наумов
27.01.2024, 03:06:18
Василий, спасибо!
Извини, тупанул.