コード: 全て選択
<?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を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!]
シリアライズ文字列形式で出力します。