Автор Тема: Сниппет для вывода списка посещенных страниц  (Прочитано 6895 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Dolce

  • Создатель
  • ***
  • Сообщений: 130
    • Просмотр профиля
  • Версия modx: EVO | REVO
Здравствуйте, уже много где искал и видел что другие тоже ищут, для ЕВО нашел пару решений, дле РЕВО найти пока не могу, знаний написать самому - нету. Может вы встречали, опишу что нужно.
Выводить список просмотренных страниц продукции, в список попадают только страницы товара(ну или какие кому нужны)
Так же что бы передавались ТВ с выводимых ресурсов - картинки и т.п.
Наверняка очень полезное решение для интернет магазинов, странно что нету готовых решений, в нормальных интернет магазинах часто встречается, для юзабилити хороший плюс

Оффлайн Dolce

  • Создатель
  • ***
  • Сообщений: 130
    • Просмотр профиля
  • Версия modx: EVO | REVO
РЕШЕНО
Огромное спасибо vanchelo
Условие:
Отслеживаемые нами страницы должны быть уникальны по шаблону.
1) Создаем сниппет getViewed(Читаем комментарии кода, прописываем свои значения):
<?php
if (!isset($_SESSION['viewed'])) $_SESSION['viewed'] = array();
// ID текущего ресурса
$id = $modx->resource->id;
// Шаблоны ресуры которых мы отслеживаем
$tpls = array(1,2,3,4);// id Шаблона посещение которого нужно отслеживать
$action = $modx->getOption('action',$scriptProperties, '');
$limit = $modx->getOption('limit',$scriptProperties, 10);
// Чанк для вывода просмотренных ресурсов
$tpl = $modx->getOption('tpl',$scriptProperties, 'chunk.tpl');

// Вносим ID просмотренных ресурсов
if (in_array($modx->resource->template, $tpls)) {
    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]);
        }
        // Храним только 30 последних ресурсов
        if (count($_SESSION['viewed']) > 30) {
            array_shift($_SESSION['viewed']);
        }
        $_SESSION['viewed'][] = $id;
    }
}

// Если указано действие returnViewed - выводим просмотренные товары
if ($action == 'returnViewed') {
    $ids = array_reverse($_SESSION['viewed']);
    $limit = $modx->getOption('limit',$scriptProperties,10);
    $offset = $modx->getOption('offset',$scriptProperties,0);
    $totalVar = $modx->getOption('totalVar', $scriptProperties, 'total');

    if (empty($ids)) return 'Вы еще не просмотрели ни одного ресурса.';

    $c = $modx->newQuery('modResource');
    $c->where(array('id:IN' => $ids, 'deleted' => false, 'published' => true));

    $total = $modx->getCount('modResource',$c);

    $c->limit($limit,$offset);
    $collection = $modx->getCollection('modResource',$c);

    $modx->setPlaceholder($totalVar,$total);

    $output = '';
    foreach ($collection as $с) {
        $с = $с->toArray();
        $output .= $modx->getChunk($tpl,$с);
    }

    return $output;
}
2) Открываем шаблон который отслеживается и всамое начало вставляем [[!getViewed]].
3)На место где нужно выводить список просмотренных товаров вставляем [[!getViewed?action=`returnViewed`&tpl=`chunk`]]
4) Создаме чанк-шаблон chunk и вписываем туда что хотим выводить. Тв параметры таким способом вывести нельзя, выводятся только стандартные поля по типу [[+pagetitle]].

Для моей же задачи нужно выводить Тв позиций, такие как фото и цена. Реализуется это легко и просто
1) В чанке chunk вызывается getPage которому просто передается id сохраненных в сессии ресурсов:
[[getPage? &element=`getResources` &resources=`[[+id]]` &tpl=`lastTpl`]]
2)Создаем шаблон lastTpl и в нем уже можно выводить все что хочется от ресурса. К примеру получение фотографии
<img src="[[+tv.pos-img:phpthumbof=`w=80&h=80&zc=1&zc=1`?]]" alt="[[+pagetitle]]" title="[[+pagetitle]]"/>
Используя getPage приходится создавать лишний шаблон, зато все работает


Оффлайн una

  • Разработчик
  • *****
  • Сообщений: 582
    • Просмотр профиля
  • Версия modx: evo, revo
Круууть! Штука совершенно необходимая в интернет-магазине!
vanchelo, Dolce - спасибо за создание и информацию!!!

Оффлайн Dolce

  • Создатель
  • ***
  • Сообщений: 130
    • Просмотр профиля
  • Версия modx: EVO | REVO
Не совсем правильно работал vanchelo переделал и теперь getPage не нужно использовать. Сейчас исправлю описание

Оффлайн Dolce

  • Создатель
  • ***
  • Сообщений: 130
    • Просмотр профиля
  • Версия modx: EVO | REVO
код сниппета getViewed:
if (!isset($_SESSION['viewed'])) $_SESSION['viewed'] = array();
// ID текущего ресурса
$id = $modx->resource->id;
// Шаблоны ресуры которых мы отслеживаем
$tpls = array(5);//id Шаблона для отслеживания
$action = $modx->getOption('action',$scriptProperties, '');
$limit = $modx->getOption('limit',$scriptProperties, 10);
// Чанк для вывода просмотренных ресурсов
$tpl = $modx->getOption('tpl',$scriptProperties, 'chunk.tpl');

// Вносим ID просмотренных ресурсов
if (in_array($modx->resource->template, $tpls)) {
    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]);
        }
        // Храним только 30 последних ресурсов
        if (count($_SESSION['viewed']) > 30) {
            array_shift($_SESSION['viewed']);
        }
        $_SESSION['viewed'][] = $id;
    }
}

// Если указано действие returnViewed - выводим просмотренные товары
if ($action == 'returnViewed') {
    $ids = array_reverse($_SESSION['viewed']);
    $limit = $modx->getOption('limit',$scriptProperties,10);
    $offset = $modx->getOption('offset',$scriptProperties,0);
    $totalVar = $modx->getOption('totalVar', $scriptProperties, 'total');

    if (empty($ids)) return 'Вы еще не просмотрели ни одного ресурса.';

    $c = $modx->newQuery('modResource');
    $c->where(array('id:IN' => $ids, 'deleted' => false, 'published' => true));

    $total = $modx->getCount('modResource',$c);

    $c->limit($limit,$offset);
    $collection = $modx->getCollection('modResource',$c);

    $modx->setPlaceholder($totalVar,$total);

    $output = '';
    foreach ($collection as $resource) {
        $tvs = $resource->getMany('TemplateVars');
    $tvsArr = array();
        foreach($tvs as $tv) {
        $tvsArr[$tv->get('name')] = $tv->renderOutput($resource->get('id'));   
    }
        $tmp = array_merge($resource->toArray(),$tvsArr);
        $output .= $modx->getChunk($tpl,$tmp);
    }

    return $output;
}
В шаблоне который отслеживаем вставляем в самый верх [[!getViewed]]
Там где нужно выводить вставляем [[!getViewed?action=`returnViewed`&tpl=`chunk`]]
В чанке chunk пишем что хотим выводить, например
<img src="[[+pos-img:phpthumbof=`w=80&h=80&zc=1&zc=1`?]]" alt="[[+pagetitle]]" title="[[+pagetitle]]"/>

Оффлайн alex

  • Разбирающий
  • **
  • Сообщений: 63
    • Просмотр профиля
  • Версия modx: revo
 :06: просмотрел 38 страниц: "Вы еще не просмотрели ни одного ресурса. "

Оффлайн pirrratka

  • Новичок
  • *
  • Сообщений: 1
    • Просмотр профиля
  • Версия modx: 2.2.5
Спасибо vanchelo за замечательный сниппет, а Dolce за то, что разжевал все пошагово для чайников.
Все работает на УРА!  :09: ura

Оффлайн alex

  • Разбирающий
  • **
  • Сообщений: 63
    • Просмотр профиля
  • Версия modx: revo
 :) разобрался тоже.
 :01: хорошии сниппет.
Цитировать (выделенное)
В шаблоне который отслеживаем вставляем в самый верх [[!getViewed]]
у меня работает и без этого.
Возник вот вопрос такои: как вывод страниц упорядочить? сеичас выводит по id в системе, как можно задвать свои значения? :12:

Оффлайн alex

  • Разбирающий
  • **
  • Сообщений: 63
    • Просмотр профиля
  • Версия modx: revo
 :12: повторю вопрос:
как сделать вывод ресурсов в порядке просмотра? сеичас выводит по id в системе. как изменить? подскажите хоть где смотреть, искать и разбираться  :)