История просмотренных страниц на MODx Revo

Здравствуйте, возможно кто-то сталкивался с такой задачей, реализация истории просмотренных страниц, поделитесь опытом реализации или возможно существует некое готовое решение?

Если делать самому, то получается придется привязываться к сессии и уже туда записывать id'ишники текущих документов?
Павел Левин
24 сентября 2013, 10:40
modx.pro
3 370
0

Комментарии: 11

    Павел Левин
    24 сентября 2013, 19:30
    0
    Василий, всю голову сломал, никак не могу понять почему он не выводит документы с помощью pdoResources.

    Я уже всё проверил, все параметры верны, но возвращает string(0) ""

    Помогите понять в чем заключается ошибка.

    Код: (правленый ваш, я не использую минишоп т.к. он ненужен)
    <?php
    $id = $modx->resource->id;
    //echo $modx->resource->get('class_key');
    if (!isset($limit)) {$limit = 10;}
    // Добавляем просмотренный товар MS2 в сессию
    if ($modx->resource->get('class_key') == 'modDocument') {
        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 ($action == 'returnViewed') {
    
    	if (!isset($_SESSION['viewed'])) {
    		return;
    	}
    	
    	$ids = array_reverse($_SESSION['viewed']);
        //print_r($ids);
        $scriptProperties = array();
    	$config = array(
    		 'resources' => '"-'.$modx->resource->id.','.implode(',', $ids).'"'
    		,'parents' => 0
    		,'limit' => $limit
    		,'tpl' => 'tpl.pdoResources'
    	);
    	$config = array_merge($config, $scriptProperties);
    	//print_r($config);
    	return $modx->runSnippet('pdoResources', $config);
        //var_dump($a); die();
    }
    вызов:
    [[!LastView? &limit=`10` &action=`returnViewed`]]
      Павел Левин
      04 октября 2013, 18:35
      0
      и так так же не работает, выводит только массив
      <?php
      $id = $modx->resource->id;
      
      if (!isset($limit)) {$limit = 10;}
      // Добавляем просмотренную страницу
      if ($modx->resource->get('class_key') == 'modDocument') {
          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 ($returnViewed == '1') {
      	if (!isset($_SESSION['viewed'])) {return;}
      	$ids = array_reverse($_SESSION['viewed']);
          if (empty($ids)) {return;}
          
      	$config = array(
      		 'resources' => '-'.$modx->resource->id.','.implode(',', $ids)
      		,'parents' => 0
      		,'limit' => $limit
      		,'tpl' => 'tpl.pdoResources'
      	);
      
      	echo '<!-- Массив: '.implode(',', $ids).' -->';
      	$rows = $modx->runSnippet('pdoResources', $config);
          echo '<!-- '.$rows.' -->';
          
          if (!empty($rows)) {
          	return $modx->getChunk('tpl.pdoResources', array('rows' => $rows));
      	}
      }
        Роман
        19 августа 2016, 21:45
        0
        Привет, Паша посмотри свой сниппет на этой странице bezumkin.ru/sections/tips_and_tricks/1917/ с ним что то не так, когда вывожу на странице, то сайт падает с 500 ошибкой! Пишу тут, т.к. в той теме комментарии отключены, надеюсь тут видишь. Буду очень благодарен, спасибо!
          Андрей
          19 августа 2016, 23:24
          +1
          А вот этот сниппет — Looked не подойдёт?
            Роман
            20 августа 2016, 08:12
            0
            То что доктор прописал!
            Павел Левин
            19 августа 2016, 23:48
            +1
            Код который использую на своем сайте:
            <?php
            /*
            &limit — лимит отображаемых и записываемых id страниц, по умолчанию 10
            &show — отображать страницы или нет (0/1), по умолчанию 0 (будет записывать, но не отображать)
            &snippet — наименование сниппета, с помощью которого будут выводиться данные (pdoResources, getResources и т.п.), по умолчанию 0 (false, то будет выводить данные с помощью modResource)
            &parents — id родительского документа, по умолчанию 0
            &tpl — наименования чанка с шаблоном, по умолчанию tpl.LastView.
            &except — id исключаемых документов через запятую, по умолчанию 0.
            &message — вывод сообщения, когда истории нет.
            
            Пример:
            // [[!LastView? &limit=`10` &show=`1` &snippet=`0` &parents=`0` &tpl=`tpl.LastView` &except=`[[++site_start]],404,502`]]
            */
            $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 (!isset($message)) {$message = '';}
            
            // Проверяем исключения
            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 $message;}
            	$ids = array_reverse($_SESSION['viewed']);
                if (empty($ids)) {return $message;}
            }
            
            // Выводим просмотренные страницы без вызова сниппета
            if ($show == '1' && $snippet == false) {
                $output = '';
                foreach ($ids as $tsID) {
                    if($tsID != $id) {
                        $page = $modx->getObject('modResource', $tsID)->toArray();
                        $output .= $modx->getChunk($tpl, $page);
                    }
                }
                // Вывод результат в плейсхолдер или в результат работы
                if (isset($toPlaceholder)) {
                    $modx->toPlaceholder(($toPlaceholder!=false?$toPlaceholder:'view'),$output,'last');
                } else {
                    return ($output?$output:$message);
                }
            }
            
            // Выводим просмотренные страницы через вызов сниппета
            if ($show == '1'  && $snippet != false) {
            	$config = array(
            		 'resources' => '-'.$id.','.implode(',', $ids)
            		,'parents' => $parents
            		,'limit' => $limit
            		,'tpl' => $tpl
            	);
                // Вывод результат в плейсхолдер или в результат работы
                if (isset($toPlaceholder)) {
                    $modx->toPlaceholder(($toPlaceholder!=false?$toPlaceholder:'view'),$modx->runSnippet($snippet, $config),'last');
                } else {
                    $output = $modx->runSnippet($snippet, $config);
                    return ($output?$output:$message);
                }
            }
            Чанк:
            <a href="[[~[[+id]]]]" data="[[+id]]">[[+pagetitle]]</a>
            У меня все стабильно работает, никаких ошибок не возникало.
              Роман
              20 августа 2016, 07:19
              0
              К сожалению нет, проверил на своем и другом сайте, тоже самое, падает с 500 ошибкой. Или ты чего не дописал или, возможно сниппет использует другой сниппет, который нужно установить с репозитария?

              п.с. у меня сайты крутятся на php 7.0
                Павел Левин
                20 августа 2016, 15:21
                0
                Здесь мои знания ограничиваются, возможно кто-то сможет помочь, но как было написано выше, есть альтернатива (их множество).
                  Роман
                  20 августа 2016, 15:38
                  0
                  Уже, взял Looked и использую его
        Александр Иванов
        26 декабря 2016, 17:23
        0
        Ребята не знаю поможет кому или, но у меня заработал этот вариант
        <?php
        /*
        &limit — лимит отображаемых и записываемых id страниц, по умолчанию 10
        &show — отображать страницы или нет (0/1), по умолчанию 0 (будет записывать, но не отображать)
        &snippet — наименование сниппета, с помощью которого будут выводиться данные (pdoResources, getResources и т.п.), по умолчанию 0 (false, то будет выводить данные с помощью modResource)
        &parents — id родительского документа, по умолчанию 0
        &tpl — наименования чанка с шаблоном, по умолчанию tpl.LastView.
        &except — id исключаемых документов через запятую, по умолчанию 0.
        &message — вывод сообщения, когда истории нет.
        
        Пример:
        // [[!LastView? &limit=`10` &show=`1` &snippet=`0` &parents=`0` &tpl=`tpl.LastView` &except=`[[++site_start]],404,502`]]
        */
        $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 (!isset($message)) {$message = '';}
        
        // Проверяем исключения
        if ($except != false) {
            $add = 1;
            foreach ($except as $value) {
                if($value == $id) {$add = 0;}
            }
        }
        
        if ($modx->resource->get('class_key') == 'modDocument') {
            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 $message;}
        	$ids = array_reverse($_SESSION['viewed']);
            if (empty($ids)) {return $message;}
        }
        
        // Выводим просмотренные страницы без вызова сниппета
        if ($show == '1' && $snippet == false) {
            $output = '';
            foreach ($ids as $tsID) {
                if($tsID != $id) {
                    $page = $modx->getObject('modResource', $tsID)->toArray();
                    $output .= $modx->getChunk($tpl, $page);
                }
            }
            // Вывод результат в плейсхолдер или в результат работы
            if (isset($toPlaceholder)) {
                $modx->toPlaceholder(($toPlaceholder!=false?$toPlaceholder:'view'),$output,'last');
            } else {
                return ($output?$output:$message);
            }
        }
        
        // Выводим просмотренные страницы через вызов сниппета
        if ($show == '1'  && $snippet != false) {
        	$config = array(
        		 'resources' => '-'.$id.','.implode(',', $ids)
        		,'parents' => $parents
        		,'limit' => $limit
        		,'tpl' => $tpl
        	);
            // Вывод результат в плейсхолдер или в результат работы
            if (isset($toPlaceholder)) {
                $modx->toPlaceholder(($toPlaceholder!=false?$toPlaceholder:'view'),$modx->runSnippet($snippet, $config),'last');
            } else {
                $output = $modx->runSnippet($snippet, $config);
                return ($output?$output:$message);
            }
        }
        а не bezumkin.ru/sections/tips_and_tricks/1917/
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          11