最近見たリソースのIDを表示するスニペット

プログラム(機能)関連の開発の話題
返信する
アバター
yama
管理人
記事: 3236
登録日時: 2009年7月29日(水) 02:50

最近見たリソースのIDを表示するスニペット

投稿記事 by yama »

コード: 全て選択

<?php
// Config //////////////
if(!isset($output))  $output  = 'list'; // recent_id|list|serialize|json|random
if(!isset($limit))   $limit   = 10;
if(!isset($tpl))     $tpl     = '[+id+],';   // Use Placeholder [+id+] [+pagetitle+] [+alias+] etc...
if(!isset($trim))    $trim    = ',';         // At list
if(!isset($sort))    $sort    = 'DESC';      // ASC|DESC
////////////////////////

$docid = $modx->documentIdentifier;
if(isset($_COOKIE['recent_doc']))
{
	$recent_doc = unserialize($_COOKIE['recent_doc']);
	$key = array_search($docid,$recent_doc);
	if($key)
	{
		unset($recent_doc[$key]);
		$recent_doc[] = $docid;
	}
	else
	{
		$limit--;
		if($limit<count($recent_doc))
			array_shift($recent_doc);
		$recent_doc[] = $docid;
	}
}
else $recent_doc[] = $docid;

$recent_doc = array_unique($recent_doc);
$recent_doc = array_merge($recent_doc,array());

if(!isset($get))
{
	$expire = time()+60*60*24*90;
	setcookie('recent_doc', serialize($recent_doc),$expire,$modx->config['base_url']);
}
if(isset($set)) return;

if(0<count($recent_doc)) array_pop($recent_doc);
if(empty($recent_doc)) return;

switch($output)
{
	case 'list':
		$list = array();
		$where_in = join(',', $recent_doc);
		$rs = $modx->db->select('*','[+prefix+]site_content',"id IN ({$where_in})");
		while($row = $modx->db->getRow($rs))
		{
			$id = $row['id'];
			unset($row['content']);
			$docs[$id] = $row;
		}
		if($sort==='DESC') $recent_doc = array_reverse($recent_doc);
		foreach($recent_doc as $id)
		{
			$ph = $docs[$id];
			$src = $modx->getChunk($tpl);
			if(!empty($src)) $tpl = $src;
			$list[]= $modx->parseText($tpl,$ph);
		}
		$list = join('',$list);
		if(!empty($trim)) $list = trim($list,$trim);
		return $list;
		break;
	case 'serialize':
	case substr($output,0,1)==='s':
		return serialize($recent_doc);
		break;
	case 'json':
	case substr($output,0,1)==='j':
		return json_encode($recent_doc);
		break;
	case 'random':
	case substr($output,0,2)==='ra':
		shuffle($recent_doc);
		return array_pop($recent_doc);
		break;
	default:
		return array_pop($recent_doc);
}
?>
リソースの閲覧履歴をクッキーに保存し、新しいページを表示するたびに、そのユーザが過去に見たリソースのIDを出力します。
うまく使えば、同じページへのリピートを増やすことができます。

[!最近見たリソース!]
直前にアクセスしたリソースのIDを1件表示します。

[!最近見たリソース?output=list!]
最近見たリソースのIDをコンマ区切りで数件表示します。デフォルトでは10件。

[!最近見たリソース?tpl='[+pagetitle+]([+id+])'!]
リソース名を表示します。pagetitle他、longtitle・alias・descriptionなどリソース変数名がひととおり使えます。
Ditto並みのテンプレート出力が可能なので、工夫すれば面白い使い方ができるかも?

[!最近見たリソース?output=list&limit=5&sort=DESC!]
コンマ区切りで5件表示しますが、表示順を古い順とします。

[!最近見たリソース?output=json!]
リソースIDを数件、json形式で出力します。

[!最近見たリソース?output=serialize!]
シリアライズ文字列形式で出力します。
yoshida
メンバー
メンバー
記事: 45
登録日時: 2013年10月01日(火) 20:12

Re: 最近見たリソースのIDを表示するスニペット

投稿記事 by yoshida »

MODXのバージョン:1.0.15J-b3
PHPのバージョン:PHP 5.4.29
MySQLのバージョン:MySQL 5.5
ブラウザ:IE FireFox クローム Opera
さくらサーバー
-----


yama様

いつもお世話になっております
便利なスニペット感謝しております。

このスニペットを使用する際にいくつかエラー(?)がありましたので
ご報告します。
(私の使い方に問題があるのかもしれません)

1.
履歴を5件表示しようと思いますと
&limit=5ではなく
&limit=6にしてちょうど5件表示されました
履歴を10件表示の場合
&limit=11にしてちょうど10件表示でした

2.
[+publishedon:date=`%Y年%m月%d日`+]をテンプレートに指定するとエラーが出て使用できなかったのでご報告します。



1点
履歴を「クリアする」ボタンを付けたい場合
この記事の履歴のみをピンポイントで消す方法があれば
お教えいただけると助かります。
yoshida
メンバー
メンバー
記事: 45
登録日時: 2013年10月01日(火) 20:12

Re: 最近見たリソースのIDを表示するスニペット

投稿記事 by yoshida »

yama様

いつもお世話になっております。

追記で
教えていただきたいのですが

最近見たリソースのIDを取得する際に
取得するIDは、最初にアクセスしたページで使われているテンプレートIDが基準になるのでしょうか?

テンプレート:トップページ(ID:2)
テンプレート:ニュースページ(ID:5)
のページのキャッシュをそれぞれ取ろうと思いますと
最初にアクセスしたページがニュースページの場合
ニュースページの履歴のみが表示されていっているように見えるのですが

これを、Dittoでいうところのfilter機能等で
コントロールできれば有りがたいかと思いました。

たとえば「最近チェックした商品」等のコーナーをこの閲覧履歴スニペットを使用し構築しようと思いますと
テンプレート:商品詳細ページ
の履歴のみが表示される必要が出てきます。

Dittoと連携させて、それをやろうと思いますと
Dittoですと、どうしても記事のcreatedonの日付が基準になってしまうので、閲覧日時を基準に並べることができないので
このスニペットを活かしきることができないようなのです。

要望ばかりで、恐縮なのですが
ご検討いただけると幸いです。

失礼いたします。
yoshida
メンバー
メンバー
記事: 45
登録日時: 2013年10月01日(火) 20:12

Re: 最近見たリソースのIDを表示するスニペット

投稿記事 by yoshida »

yama様

いつもお世話になっております

>テンプレート:トップページ(ID:2)
>テンプレート:ニュースページ(ID:5)
>のページのキャッシュをそれぞれ取ろうと思いますと
>最初にアクセスしたページがニュースページの場合
>ニュースページの履歴のみが表示されていっているように見えるのですが

上記の件
すみません
私の勘違いでした。

よくよく見ますと
スニペットを設置したテンプレートのページのみが
保存されていく仕組みですよね。
申し訳なかったです。

以上
失礼いたします
返信する