[pmwiki-users] automatic Trail with random back & next
Hans
design5 at softflow.co.uk
Mon Jul 21 15:54:08 CDT 2008
Here is an extended version:
## {(rndpage label trailpagename group=GroupName exclude=PageA,PageB)}
$MarkupExpr['rndpage'] = 'MakeRandomNext($pagename, $args[0], $args[1], $argp)';
function MakeRandomNext($pagename, $label, $trailname='', $args) {
global $RandomPageNamesUsed;
$trail = array();
//if no trailname make trail from all group pages
if ($trailname=='') {
if (isset($args['group'])) $group = $args['group'];
else $group = PageVar($pagename, '$Group');
$gplist = ListPages("/^$group\\..+/");
$exclude = array(
$pagename,
$group.'.RecentChanges',
$group.'.RecentUploads',
$group.'.GroupHeader',
$group.'.GroupFooter',
$group.'.GroupAttributes',
);
if (isset($args['exclude'])) {
$excl = explode(',',$args['exclude']);
foreach($excl as $i => $p)
$excl[$i] = MakePageName($group.'.HomePage',$p);
$exclude = array_merge($exclude, $excl);
}
foreach($gplist as $i => $p)
if (in_array($p,$exclude) || in_array($p,(array)$RandomPageNamesUsed))
unset($gplist[$i]);
sort($gplist);
foreach($gplist as $i => $p)
$trail[$i]['pagename'] = $p;
}
else $trail = ReadTrail($pagename, $trailname);
//pick random pagename from trail
$max = count($trail)-1;
$i = rand(0,$max);
$pn = $trail[$i]['pagename'];
$RandomPageNamesUsed[] = $pn;
if ($label=='title') $label = '+';
if ($label=='') $label = 'next';
if ($label=='name') $label = PageVar($pn, '$Name');
return "[[$pn|$label]]";
}
This function will exclude some "system" pages by default. Other
pages can be added to b excluded using parameter
exclude=PageName1,PageName2,Pageame3 etc CSV list of pagenames.
The function also keeps track of pages already used, so you won't
see doubles.
As a consequence it got rather elaborate...
Please test!
~Hans
More information about the pmwiki-users
mailing list