Revision [5375]
This is an old revision of PageAdminAction made by GmBowen on 2005-01-30 14:42:55.
Page Administration Action
See also:
Documentation: PageAdminActionInfo.This action, inspired by the UserAdmin action, is meant to allow Wikka Administrators to manage pages and perform several maintenance operations.
It displays the standard PageIndex to non-admins.
Sample output
[Records (468): 1-10 | 11-20 (sorted by: time, desc )]
Page Name | Owner | Last Author | Last Edit | Handle | |
---|---|---|---|---|---|
PageAdminTest | |||||
PageAdminAction | |||||
WikkaOptimization | |||||
WikkaBugs | |||||
SuggestionBox | |||||
TheLounge | |||||
KarmaTester | |||||
WikkaDocumentation | |||||
SandBox | |||||
DewJoy |
To Do
This is a preliminary draft.
To do:
- Code optimization;
- Mass-operations (mass-page deletion, mass-page rename, mass-page ACLs etc.);
- Rename handler;
- CSS-driven layout;
- Can I advocate for a "Page Hide/Unhide" option here?....H instead of Y or N for most recent works well. In some communities, particularly where there might be legal/administrative follow-ups to what was posted, it is quite useful to be able to "keep" the contents of the page in the database, but make them inaccessible to the wiki users. --GmBowen
The code
Save the code below as actions/pageadmin.php and use it as {{pageadmin}}.
<?php
/**
* Display an interface allowing Wikka administrators to perform multiple operations on Wikka pages.
*
* @package Actions
* @name PageAdmin
*
* @author {@link http://wikka.jsnx.com/DarTar Dario Taraborelli}
* @version 0.1
* @since Wikka 1.1.X.X
*
* @output list of pages available on the current server
*
* @todo - mass-operations
* - rename handler
* - CSS-driven layout
*/
// this is admin-only functionality
if ($this->IsAdmin($this->GetUser())) {
// perform mass-operations if required (forthcoming)
if ($_GET["action"] == "massdelete") {
echo $this->Action("massdelete");
} else if ($_GET["action"] == "massrename"){
echo $this->Action("massrename");
} else if ($_GET["action"] == "massacls"){
echo $this->Action("massacls");
} else {
// pager defaults
// limit records per page
$l = (!$_POST['l'])? $_GET['l'] : $_POST['l'];
if (!$_POST['l'] && !$_GET['l']) $l = 10;
// sort field
$sort = (!$_GET['sort'])? 'time' : $_GET['sort'];
// sort order
$d = (!$_GET['d'])? 'desc' : $_GET['d'];
// start record
$s = (!$_GET['s'])? '0' : $_GET['s'];
// search results
$where = ($_POST['search'])? 'WHERE tag LIKE "%'.$_POST['search'].'%"and latest = "Y"' : 'WHERE latest = "Y"';
echo $this->Format('===== Page Administration ===== --- --- ');
// 1. Get total number of pages
$pages = $this->LoadSingle('SELECT count(*) as n FROM '.$this->config['table_prefix'].'pages '.$where);
$numpages = $pages['n'];
// 2. Display pager form
$form = $this->FormOpen('','','post');
$form .= 'Show <select name="l" onChange="form.submit()">';
for ($rec=10; $rec < ($numpages+10); $rec+=10) {
$selected = ($l == $rec)? 'selected' : '';
$form .= '<option value="'.$rec.'" '.$selected.'>'.$rec.'</option>';
}
$form .= '</select> records per page :: '.
'Search page name: <input type ="text" name="search" size="20" maxlength="50" value="'.$_POST['search'].'"/>'.
$this->FormClose();
echo $form;
// build pager links
if($s > 0)
$prev = '<a href="' .$this->Href('','','l='.$l.'&sort='.$sort.'&d='.$d.'&s='.($s-$l)).'">'.($s-$l+1).'-'.$s.'</a> | ';
if($numpages > ($s + $l))
$next = ' | <a href="'.$this->Href('','','l='.$l.'&sort='.$sort.'&d='.$d.'&s='.($s+$l)).'">'.($s+$l+1).'-'.($s+2*$l).'</a>';
echo '[Records ('.$numpages.'): '.$prev.'<strong>'.($s+1).'-'.($s+$l).'</strong>'.$next.' (sorted by: <em>'.$sort.', '.$d.'</em> )]<br /><br />';
// get page data
$pagedata = $this->LoadAll("SELECT * FROM ".$this->config["table_prefix"]."pages ".
$where." ORDER BY ".$sort." ".$d." limit ".$s.", ".$l);
if ($pagedata) {
// build table headers
$tagheader = '<a href="'.$this->Href('','', (($sort == 'tag' && $d == 'asc')? 'l='.$l.'&sort=tag&d=desc' : 'l='.$l.'&sort=tag&d=asc')).'" title="Reverse sorting order">Page Name</a>';
$ownerheader = '<a href="'.$this->Href('','', (($sort == 'owner' && $d == 'asc')? 'l='.$l.'&sort=owner&d=desc' : 'l='.$l.'&sort=owner&d=asc')).'" title="Reverse sorting order">Owner</a>';
$userheader = '<a href="'.$this->Href('','', (($sort == 'user' && $d == 'asc')? 'l='.$l.'&sort=user&d=desc' : 'l='.$l.'&sort=user&d=asc')).'" title="Reverse sorting order">Last Author</a>';
$lasteditheader = '<a href="'.$this->Href('','', (($sort == 'time' && $d == 'desc')? 'l='.$l.'&sort=time&d=asc' : 'l='.$l.'&sort=time&d=desc')).'" title="Reverse sorting order">Last Edit</a>';
$htmlout = '<table width="100%" border="1px">'.
' <tr>'.
' <th> </th>'.
' <th>'.$tagheader.'</th>'.
' <th>'.$ownerheader.'</th>'.
' <th>'.$userheader.'</th>'.
' <th>'.$lasteditheader.'</th>'.
' <th>Handle</th>'.
' </tr>';
// feed table
foreach($pagedata as $page) {
// build links
$lastedit = $page['time'];
$lastedit .= ($page['note'])? ' (<a href="'.$this->Href('history', $page['tag'], '').'" title="Last edit: '.$page['note'].'">*</a>)' : ' (<a href="'.$this->Href('history', $page['tag'], '').'" title="Display '.$page['tag'].'\'s history">-</a>)';
$editpage = '<a href="'.$this->Href('edit',$page['tag'], '').'" title="Edit '.$page['tag'].'">edit</a>';
$deletepage = '<a href="'.$this->Href('delete',$page['tag'], '').'" title="Delete '.$page['tag'].'">delete</a>';
$clonepage = '<a href="'.$this->Href('clone',$page['tag'], '').'" title="Clone '.$page['tag'].'">clone</a>';
$aclpage = '<a href="'.$this->Href('acls',$page['tag'], '').'" title="Change ACLs for '.$page['tag'].'">acl</a>';
$revpage = '<a href="'.$this->Href('revisions',$page['tag'], '').'" title="Compare previous versions of '.$page['tag'].'">rev</a>';
// check owner
if ($page['owner']) {
// is the owner a registered user?
$owner = ($this->LoadUser($page['owner']) && $this->ExistsPage($page['owner']))? $this->Link($page['owner'],'','','','','Go to '.$page['owner'].'\'s homepage') : $page['owner'];
} else {
// page has empty owner field
$owner = '/';
}
// check last author
if ($page['user']) {
// is the author a registered user?
$user = ($this->LoadUser($page['user']) && $this->ExistsPage($page['owner']))? $this->Link($page['user'],'','','','','Go to '.$page['user'].'\'s homepage') : $page['user'];
} else {
// page has empty user field
$user = '/';
}
$htmlout .= ' <tr>';
$htmlout .= ' <td><input type="checkbox" id="'.$page['id'].'" /></td>';
$htmlout .= ' <td>'.$this->Link($page['tag']).'</td> <td><center>'.$owner.
'</center></td><td><center>'.$user.'</center></td><td><center>'.$lastedit.
'</center></td> <td><center> '.$editpage.' :: '.$deletepage.' :: '.$clonepage.' :: rename :: '.$aclpage.' :: '.$revpage.'</center></td>';
$htmlout .= ' </tr>';
}
$htmlout .= '</table>';
// print the table
echo $htmlout;
// multiple-page operations (forthcoming)
echo '<br />'.$this->FormOpen('','','get');
echo '[<a href="#">Check all</a> | <a href="#">Uncheck all</a>]';
echo ' With selected: <select name="action" onChange="form.submit()">';
echo '<option value="" selected="selected">---</option>';
echo '<option value="massdelete">Delete</option>';
echo '<option value="massrename">Rename</option>';
echo '<option value="massacls">Change ACLs</option>';
echo '</select>';
echo $this->FormClose();
} else {
// print error message
echo '<p><span class="error">Sorry, there are no pages matching</span> <strong>"'.$_POST['search'].'"</strong></p>';
}
}
} else {
// current user is not admin
echo $this->Action('pageindex');
}
?>
/**
* Display an interface allowing Wikka administrators to perform multiple operations on Wikka pages.
*
* @package Actions
* @name PageAdmin
*
* @author {@link http://wikka.jsnx.com/DarTar Dario Taraborelli}
* @version 0.1
* @since Wikka 1.1.X.X
*
* @output list of pages available on the current server
*
* @todo - mass-operations
* - rename handler
* - CSS-driven layout
*/
// this is admin-only functionality
if ($this->IsAdmin($this->GetUser())) {
// perform mass-operations if required (forthcoming)
if ($_GET["action"] == "massdelete") {
echo $this->Action("massdelete");
} else if ($_GET["action"] == "massrename"){
echo $this->Action("massrename");
} else if ($_GET["action"] == "massacls"){
echo $this->Action("massacls");
} else {
// pager defaults
// limit records per page
$l = (!$_POST['l'])? $_GET['l'] : $_POST['l'];
if (!$_POST['l'] && !$_GET['l']) $l = 10;
// sort field
$sort = (!$_GET['sort'])? 'time' : $_GET['sort'];
// sort order
$d = (!$_GET['d'])? 'desc' : $_GET['d'];
// start record
$s = (!$_GET['s'])? '0' : $_GET['s'];
// search results
$where = ($_POST['search'])? 'WHERE tag LIKE "%'.$_POST['search'].'%"and latest = "Y"' : 'WHERE latest = "Y"';
echo $this->Format('===== Page Administration ===== --- --- ');
// 1. Get total number of pages
$pages = $this->LoadSingle('SELECT count(*) as n FROM '.$this->config['table_prefix'].'pages '.$where);
$numpages = $pages['n'];
// 2. Display pager form
$form = $this->FormOpen('','','post');
$form .= 'Show <select name="l" onChange="form.submit()">';
for ($rec=10; $rec < ($numpages+10); $rec+=10) {
$selected = ($l == $rec)? 'selected' : '';
$form .= '<option value="'.$rec.'" '.$selected.'>'.$rec.'</option>';
}
$form .= '</select> records per page :: '.
'Search page name: <input type ="text" name="search" size="20" maxlength="50" value="'.$_POST['search'].'"/>'.
$this->FormClose();
echo $form;
// build pager links
if($s > 0)
$prev = '<a href="' .$this->Href('','','l='.$l.'&sort='.$sort.'&d='.$d.'&s='.($s-$l)).'">'.($s-$l+1).'-'.$s.'</a> | ';
if($numpages > ($s + $l))
$next = ' | <a href="'.$this->Href('','','l='.$l.'&sort='.$sort.'&d='.$d.'&s='.($s+$l)).'">'.($s+$l+1).'-'.($s+2*$l).'</a>';
echo '[Records ('.$numpages.'): '.$prev.'<strong>'.($s+1).'-'.($s+$l).'</strong>'.$next.' (sorted by: <em>'.$sort.', '.$d.'</em> )]<br /><br />';
// get page data
$pagedata = $this->LoadAll("SELECT * FROM ".$this->config["table_prefix"]."pages ".
$where." ORDER BY ".$sort." ".$d." limit ".$s.", ".$l);
if ($pagedata) {
// build table headers
$tagheader = '<a href="'.$this->Href('','', (($sort == 'tag' && $d == 'asc')? 'l='.$l.'&sort=tag&d=desc' : 'l='.$l.'&sort=tag&d=asc')).'" title="Reverse sorting order">Page Name</a>';
$ownerheader = '<a href="'.$this->Href('','', (($sort == 'owner' && $d == 'asc')? 'l='.$l.'&sort=owner&d=desc' : 'l='.$l.'&sort=owner&d=asc')).'" title="Reverse sorting order">Owner</a>';
$userheader = '<a href="'.$this->Href('','', (($sort == 'user' && $d == 'asc')? 'l='.$l.'&sort=user&d=desc' : 'l='.$l.'&sort=user&d=asc')).'" title="Reverse sorting order">Last Author</a>';
$lasteditheader = '<a href="'.$this->Href('','', (($sort == 'time' && $d == 'desc')? 'l='.$l.'&sort=time&d=asc' : 'l='.$l.'&sort=time&d=desc')).'" title="Reverse sorting order">Last Edit</a>';
$htmlout = '<table width="100%" border="1px">'.
' <tr>'.
' <th> </th>'.
' <th>'.$tagheader.'</th>'.
' <th>'.$ownerheader.'</th>'.
' <th>'.$userheader.'</th>'.
' <th>'.$lasteditheader.'</th>'.
' <th>Handle</th>'.
' </tr>';
// feed table
foreach($pagedata as $page) {
// build links
$lastedit = $page['time'];
$lastedit .= ($page['note'])? ' (<a href="'.$this->Href('history', $page['tag'], '').'" title="Last edit: '.$page['note'].'">*</a>)' : ' (<a href="'.$this->Href('history', $page['tag'], '').'" title="Display '.$page['tag'].'\'s history">-</a>)';
$editpage = '<a href="'.$this->Href('edit',$page['tag'], '').'" title="Edit '.$page['tag'].'">edit</a>';
$deletepage = '<a href="'.$this->Href('delete',$page['tag'], '').'" title="Delete '.$page['tag'].'">delete</a>';
$clonepage = '<a href="'.$this->Href('clone',$page['tag'], '').'" title="Clone '.$page['tag'].'">clone</a>';
$aclpage = '<a href="'.$this->Href('acls',$page['tag'], '').'" title="Change ACLs for '.$page['tag'].'">acl</a>';
$revpage = '<a href="'.$this->Href('revisions',$page['tag'], '').'" title="Compare previous versions of '.$page['tag'].'">rev</a>';
// check owner
if ($page['owner']) {
// is the owner a registered user?
$owner = ($this->LoadUser($page['owner']) && $this->ExistsPage($page['owner']))? $this->Link($page['owner'],'','','','','Go to '.$page['owner'].'\'s homepage') : $page['owner'];
} else {
// page has empty owner field
$owner = '/';
}
// check last author
if ($page['user']) {
// is the author a registered user?
$user = ($this->LoadUser($page['user']) && $this->ExistsPage($page['owner']))? $this->Link($page['user'],'','','','','Go to '.$page['user'].'\'s homepage') : $page['user'];
} else {
// page has empty user field
$user = '/';
}
$htmlout .= ' <tr>';
$htmlout .= ' <td><input type="checkbox" id="'.$page['id'].'" /></td>';
$htmlout .= ' <td>'.$this->Link($page['tag']).'</td> <td><center>'.$owner.
'</center></td><td><center>'.$user.'</center></td><td><center>'.$lastedit.
'</center></td> <td><center> '.$editpage.' :: '.$deletepage.' :: '.$clonepage.' :: rename :: '.$aclpage.' :: '.$revpage.'</center></td>';
$htmlout .= ' </tr>';
}
$htmlout .= '</table>';
// print the table
echo $htmlout;
// multiple-page operations (forthcoming)
echo '<br />'.$this->FormOpen('','','get');
echo '[<a href="#">Check all</a> | <a href="#">Uncheck all</a>]';
echo ' With selected: <select name="action" onChange="form.submit()">';
echo '<option value="" selected="selected">---</option>';
echo '<option value="massdelete">Delete</option>';
echo '<option value="massrename">Rename</option>';
echo '<option value="massacls">Change ACLs</option>';
echo '</select>';
echo $this->FormClose();
} else {
// print error message
echo '<p><span class="error">Sorry, there are no pages matching</span> <strong>"'.$_POST['search'].'"</strong></p>';
}
}
} else {
// current user is not admin
echo $this->Action('pageindex');
}
?>
CategoryDevelopment