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

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

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

投稿記事by yama » 2014年7月01日(火) 10:59

コード: 全て選択

<?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 » 2015年10月07日(水) 13:58

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 » 2015年10月08日(木) 09:14

yama様

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

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

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

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

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

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

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

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

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

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

投稿記事by yoshida » 2015年10月09日(金) 10:08

yama様

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

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

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

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

以上
失礼いたします