Павел Левин

Павел Левин

Был в сети 23 августа 2022, 00:55
Заказы не принимаю
Код который использую на своем сайте:
<?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>
У меня все стабильно работает, никаких ошибок не возникало.
Видел в email рассылке от магазина, думал взять, но потом увидел некую простоту, т.е. сортировка идет чисто по переходам.
Будет ли усовершенствование процесса сортировки/рейтинга, по мимо ручного указания явной связи. М.б. учет ключевых слов?

Причина такого мышления:
Если сайт состоит из статей и любая статья из любой категории корневого ресурса может быть неким образом связана с текущей, то вероятность рандомного попадания в выдачу довольно ничтожна, а пользователи за неимением лучшего, будет заходить в первые статьи, а если их всего 3-6 в выдаче?

Вот решил подождать следующего обновления, вдруг что-то с этим решат.
Еще есть вариант сделать расширение для платного дополнения msearch2 по сути, выдавая первые варианты результатов поиска и как-то туда пропихивать приоритеты, но тут не знаю. М.б. все тяжело работать будет.
Резонный вопрос =)
Это было бы зверски удобно. Помню на некоторых форумах, бот сразу отвечает ссылками с заголовками тем форума.
На самом деле подобное расширение достойно быть платным — яб купил.