|
Cookbook /
AutoCreatePagesSummary:Automatically create pages based on the name of the current page.
Version: 2008-08-24
Prerequisites:
Status: Alpha
Maintainer: Peter Bowers
Categories: Administration
Questions answered by this recipe
DescriptionAutomatically create pages when the pagename of the page being posted matches certain patterns. NotesProbably basing this just on patterns on the pagename being posted is insufficient... Not quite sure what other conditions would be good... Maybe "newpage" or "newgroup" or stuff like that...? This is only for CREATING pages. If the page already exists there will be no modification of any attributes. (Ultimately I can see where some kind of "create", "append", etc as an action might be a good idea -- i.e., updating a wikitrail for the group, etc.) InstallationPut this in your config.php, editing the $AutoCreatePages as needed:
$EditFunctions[] = 'AutoCreatePages';
$AutoCreatePages =
array(
# Create GROUP.GroupConfig for all pages if not exist
array( '/.*/i',
'{$Group}.GroupConfig',
array('ctime' => $Now, 'passwdedit' => '@admins')),
# Create Group.NAME-Sub for any newly created pages in Test.* group
array( '/^Test\./i',
'{$FullName}-Sub',
array('ctime' => $Now, 'text'=>'Test of SUB page')),
# Create GROUP.Foo-Sub for any newly created page named *.Foo
array( '/\.Foo$/i',
'{$Group}.Foo-Sub',
array('ctime' => $Now))
);
# AutoCreatePages()
# Should be placed after PostPage() in $EditFunctions (at the end usually)
# $AutoCreatePages is an array of n elements, each consisting of a page which
# might need to be created automatically.
# The value of each element is a 3-element array:
# 1st element: The pattern which the page being posted must match
# 2nd element: The pagename format for the page which will be created
# 3rd element: An array of page attributes
# In code it looks like this:
# $AutoCreatePages =
# array( array( '/.*/i',
# '{$Group}.GroupConfig',
# array('ctime' => $Now, 'passwdedit' => '@admins')),
# array( '/\.Foo$/i',
# '{$Group}.Foo-Sub',
# array('ctime' => $Now)));
function AutoCreatePages($pagename, &$page, &$new) {
global $IsPagePosted, $AutoCreatePages;
if (!$IsPagePosted) return;
foreach((array)@$AutoCreatePages as $x) {
list($pat, $pnfmt, $init) = $x;
if (preg_match($pat, $pagename)) {
if (is_null($init) || !$pnfmt) continue;
$pn = MakePageName($pagename, FmtPagename($pnfmt, $pagename));
if (!$pn || PageExists($pn)) continue;
if (!CondAuth($pn, 'edit')) continue;
WritePage($pn, $init);
}
}
}
Release Notes
See AlsoContributorsFunction based on AutoCreateTargets() in pmwiki.php, so credit to PM. CommentsA start down the road of a more fully implemented solution with some of the thoughts above... BUT DEFINITELY NOT YET WORKING...
$EditFunctions[] = 'AutoCreatePages';
$AutoCreatePages =
array( array( 'pat' => '/.*/i',
'name' => '{$Group}.GroupConfig',
'page' => array('ctime' => $Now, 'passwdedit' => '@admins')),
array( 'pat' => '/^Test\./i',
'name' => '{$FullName}-Sub',
'page' => array('ctime' => $Now, 'text'=>'Test of SUB page')),
array( 'pat' => '/\.Foo$/i',
'name' => '{$Group}.Foo-Sub',
'page' => array('ctime' => $Now))
);
# AutoCreatePages()
# Should be placed after PostPage() in $EditFunctions (at the end usually)
# $AutoCreatePages is an array of n elements, each consisting of a page which
# might need to be created automatically.
# The value of each element is a 3-element array:
# 1st element: The pattern which the page being posted must match
# 2nd element: The pagename format for the page which will be created
# 3rd element: An array of page attributes
# In code it looks like this:
# $AutoCreatePages =
# array( array( 'pat' => '/.*/i',
# 'name' => '{$Group}.GroupConfig',
# 'init' => array('ctime' => $Now, 'passwdedit' => '@admins')),
# array( 'pat' => '/\.Foo$/i',
# 'name' => '{$Group}.Foo-Sub',
# 'init' => array('ctime' => $Now)));
function AutoCreatePages($pagename, &$page, &$new) {
global $IsPagePosted, $AutoCreatePages;
if (!$IsPagePosted) return;
foreach((array)@$AutoCreatePages as $x) {
$pat = @$x['pat']; // match anything if not specified
$cond = @$x['cond']; $pnfmt = $x['name']; $init = $x['init'];
$cmd = (@$x['cmd'] ? $x['cmd'] : 'create');
if ($pat && !preg_match($pat, $pagename)) continue;
if ($cond == 'newpage') {
if ($new['ctime'] != $Now) continue;
} elseif ($cond == 'newgroup') {
if ($new['ctime'] != $Now) continue;
$gn = FmtPagename("{$Group}.RecentChanges", $pagename);
if (PageExists($gn)) continue;
}
if (!$init || !$pnfmt) continue;
if (!($pn = MakePageName($pagename, FmtPagename($pnfmt, $pagename))) return;
if (!CondAuth($pn, 'edit')) continue;
if ($cmd == 'create') {
if (!$pn || PageExists($pn)) continue;
$npage = $init;
} else {
if (PageExists($pn))
$npage = ReadPage($pn, READCURRENT); //abc
else
$npage = array('text'=>'');
$tmp = $init; unset($tmp['text']);
$npage = $npage + $tmp;
if ($cmd == 'append') {
$npage['text'] .= "\n" . $init['text'];
} elseif ($cmd == 'prepend') {
$npage['text'] = $init['text'] . "\n" . $npage['text'];
}
}
WritePage($pn, $init);
}
}
|