Revision [5390]
This is an old revision of PageAdminAction made by DarTar on 2005-01-31 10:17:00.
Page Administration Action
See also:
Documentation: PageAdminActionInfo.Are you a site administrator? Give it a PageAdminTest try
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
Current Version
Last available version is 0.2.
Features:
- pageable, sortable and searchable list of pages;
- links to different handlers with titles;
- shortens long pagename and hostnames;
- shows plain-text usernames if user has no homepage
Bugfixes and modifications:
- added constant section;
- added configurable hostname and pagename length limit;
- fixed problem with search keyword not read by pager;
To Do
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
- Mike, as you can see this interface does not add any specific handler or page feature which is not already supported by Wikka: it is just a hub for existing handlers (the multiple-page operations will require new handlers, though). So if you want to propose something like a 'hide/unhide' handler, I suggest you open a dedicated page. -- DarTar
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.2
* @since Wikka 1.1.X.X
*
* @output list of pages available on the current server
*
* @todo - mass-operations
* - rename handler
* - full-text search
* - i18n support
* - JW-compliant defaults
* - CSS-driven layout
*/
// set default values as constants
define('DEFAULT_RECORDS_LIMIT', '10'); # number of records per page
define('DEFAULT_SORT_FIELD', 'time'); # sort field
define('DEFAULT_SORT_ORDER', 'desc'); # sort order, ascendant or descendant
define('DEFAULT_START', '0'); # start record
define('DEFAULT_SEARCH', ''); # keyword to restrict page search
define('DEFAULT_TAG_LENGTH', '15'); # max. length of displayed pagename
define('DEFAULT_URL_LENGTH', '18'); # max. length of displayed user host
// 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 {
// URL variables
// limit records per page
$l = (!$_POST['l'])? $_GET['l'] : $_POST['l'];
if (!$_POST['l'] && !$_GET['l']) $l = DEFAULT_RECORDS_LIMIT;
// sort field
$sort = ($_GET['sort'])? $_GET['sort'] : DEFAULT_SORT_FIELD;
// sort order
$d = ($_GET['d'])? $_GET['d'] : DEFAULT_SORT_ORDER;
// start record
$s = ($_GET['s'])? $_GET['s'] : DEFAULT_START;
// search results
$q = (!$_POST['q'])? $_GET['q'] : $_POST['q'];
if (!$_POST['q'] && !$_GET['q']) $q = DEFAULT_SEARCH;
$where = 'WHERE tag LIKE "%'.$q.'%"and 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 .= 'Search page by name: <input type ="text" name="q" size="20" maxlength="50" value="'.$q.'"/><input type="submit" value="Submit" accesskey="a" /><br /><br />';
$form .= 'Show <select name="l">';
for ($rec=10; $rec < ($numpages+10); $rec+=10) {
$selected = ($l == $rec)? 'selected' : '';
$form .= '<option value="'.$rec.'" '.$selected.'>'.$rec.'</option>';
}
$form .= '</select> records per page <input type="submit" value="Apply" accesskey="a" /><br /><br />';
$this->FormClose();
echo $form;
// build pager links
if($s > 0)
$prev = '<a href="' .$this->Href('','','l='.$l.'&sort='.$sort.'&d='.$d.'&s='.($s-$l)).'&q='.$q.'">'.($s-$l+1).'-'.$s.'</a> | ';
if($numpages > ($s + $l))
$next = ' | <a href="'.$this->Href('','','l='.$l.'&sort='.$sort.'&d='.$d.'&s='.($s+$l)).'&q='.$q.'">'.($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&q='.$q : 'l='.$l.'&sort=tag&d=asc&q='.$q)).'" title="Sort by page name">Page Name</a>';
$ownerheader = '<a href="'.$this->Href('','', (($sort == 'owner' && $d == 'asc')? 'l='.$l.'&sort=owner&d=desc&q='.$q : 'l='.$l.'&sort=owner&d=asc&q='.$q)).'" title="Sort by page owner">Owner</a>';
$userheader = '<a href="'.$this->Href('','', (($sort == 'user' && $d == 'asc')? 'l='.$l.'&sort=user&d=desc&q='.$q : 'l='.$l.'&sort=user&d=asc&q='.$q)).'" title="Sort by author name">Last Author</a>';
$lasteditheader = '<a href="'.$this->Href('','', (($sort == 'time' && $d == 'desc')? 'l='.$l.'&sort=time&d=asc&q='.$q : 'l='.$l.'&sort=time&d=desc&q='.$q)).'" title="Sort by edit time">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) {
// avoid long page names
$pagename = (strlen($page['tag']) > DEFAULT_TAG_LENGTH)? substr($page['tag'], 0, DEFAULT_TAG_LENGTH).'~' : $page['tag'];
// 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>)';
$showpage = '<a href="'.$this->Href('',$page['tag'], '').'" title="Go to '.$page['tag'].'">'.$pagename.'</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 = '(Nobody)';
}
// check last author
if ($page['user']) {
// is the author a registered user?
if ($this->LoadUser($page['user'])) {
// does user's homepage exist?
if ($this->ExistsPage($page['user'])) {
$user = $this->Link($page['user'],'','','','','Go to '.$page['user'].'\'s homepage');
} else {
$user = $page['user'];
}
} else {
// avoid long host names
$user = (strlen($page['user']) > DEFAULT_URL_LENGTH)? substr($page['user'], 0, DEFAULT_URL_LENGTH).'~' : $page['user'];
}
} else {
// page has empty user field
$user = '(Nobody)';
}
$htmlout .= ' <tr>';
$htmlout .= ' <td><input type="checkbox" id="'.$page['id'].'" '.(($_GET['selectall'] == 1)? 'checked="checked"' : '').' /></td>';
$htmlout .= ' <td>'.$showpage.'</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="'.$this->Href('','','l='.$l.'&sort='.$sort.'&d='.$d.'&s='.$s.'&q='.$q.'&selectall=1').'" title="Check all results">Check all</a> | <a href="'.$this->Href('','','l='.$l.'&sort='.$sort.'&d='.$d.'&s='.$s.'&q='.$q.'&selectall=0').'" title="Uncheck all results">Uncheck all</a>]';
echo ' With selected: <select name="action">';
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> <input type="submit" value="Submit" accesskey="s" />';
echo $this->FormClose();
} else {
// print error message
echo '<p><span class="error">Sorry, there are no pages matching</span> <strong>"'.$q.'"</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.2
* @since Wikka 1.1.X.X
*
* @output list of pages available on the current server
*
* @todo - mass-operations
* - rename handler
* - full-text search
* - i18n support
* - JW-compliant defaults
* - CSS-driven layout
*/
// set default values as constants
define('DEFAULT_RECORDS_LIMIT', '10'); # number of records per page
define('DEFAULT_SORT_FIELD', 'time'); # sort field
define('DEFAULT_SORT_ORDER', 'desc'); # sort order, ascendant or descendant
define('DEFAULT_START', '0'); # start record
define('DEFAULT_SEARCH', ''); # keyword to restrict page search
define('DEFAULT_TAG_LENGTH', '15'); # max. length of displayed pagename
define('DEFAULT_URL_LENGTH', '18'); # max. length of displayed user host
// 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 {
// URL variables
// limit records per page
$l = (!$_POST['l'])? $_GET['l'] : $_POST['l'];
if (!$_POST['l'] && !$_GET['l']) $l = DEFAULT_RECORDS_LIMIT;
// sort field
$sort = ($_GET['sort'])? $_GET['sort'] : DEFAULT_SORT_FIELD;
// sort order
$d = ($_GET['d'])? $_GET['d'] : DEFAULT_SORT_ORDER;
// start record
$s = ($_GET['s'])? $_GET['s'] : DEFAULT_START;
// search results
$q = (!$_POST['q'])? $_GET['q'] : $_POST['q'];
if (!$_POST['q'] && !$_GET['q']) $q = DEFAULT_SEARCH;
$where = 'WHERE tag LIKE "%'.$q.'%"and 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 .= 'Search page by name: <input type ="text" name="q" size="20" maxlength="50" value="'.$q.'"/><input type="submit" value="Submit" accesskey="a" /><br /><br />';
$form .= 'Show <select name="l">';
for ($rec=10; $rec < ($numpages+10); $rec+=10) {
$selected = ($l == $rec)? 'selected' : '';
$form .= '<option value="'.$rec.'" '.$selected.'>'.$rec.'</option>';
}
$form .= '</select> records per page <input type="submit" value="Apply" accesskey="a" /><br /><br />';
$this->FormClose();
echo $form;
// build pager links
if($s > 0)
$prev = '<a href="' .$this->Href('','','l='.$l.'&sort='.$sort.'&d='.$d.'&s='.($s-$l)).'&q='.$q.'">'.($s-$l+1).'-'.$s.'</a> | ';
if($numpages > ($s + $l))
$next = ' | <a href="'.$this->Href('','','l='.$l.'&sort='.$sort.'&d='.$d.'&s='.($s+$l)).'&q='.$q.'">'.($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&q='.$q : 'l='.$l.'&sort=tag&d=asc&q='.$q)).'" title="Sort by page name">Page Name</a>';
$ownerheader = '<a href="'.$this->Href('','', (($sort == 'owner' && $d == 'asc')? 'l='.$l.'&sort=owner&d=desc&q='.$q : 'l='.$l.'&sort=owner&d=asc&q='.$q)).'" title="Sort by page owner">Owner</a>';
$userheader = '<a href="'.$this->Href('','', (($sort == 'user' && $d == 'asc')? 'l='.$l.'&sort=user&d=desc&q='.$q : 'l='.$l.'&sort=user&d=asc&q='.$q)).'" title="Sort by author name">Last Author</a>';
$lasteditheader = '<a href="'.$this->Href('','', (($sort == 'time' && $d == 'desc')? 'l='.$l.'&sort=time&d=asc&q='.$q : 'l='.$l.'&sort=time&d=desc&q='.$q)).'" title="Sort by edit time">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) {
// avoid long page names
$pagename = (strlen($page['tag']) > DEFAULT_TAG_LENGTH)? substr($page['tag'], 0, DEFAULT_TAG_LENGTH).'~' : $page['tag'];
// 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>)';
$showpage = '<a href="'.$this->Href('',$page['tag'], '').'" title="Go to '.$page['tag'].'">'.$pagename.'</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 = '(Nobody)';
}
// check last author
if ($page['user']) {
// is the author a registered user?
if ($this->LoadUser($page['user'])) {
// does user's homepage exist?
if ($this->ExistsPage($page['user'])) {
$user = $this->Link($page['user'],'','','','','Go to '.$page['user'].'\'s homepage');
} else {
$user = $page['user'];
}
} else {
// avoid long host names
$user = (strlen($page['user']) > DEFAULT_URL_LENGTH)? substr($page['user'], 0, DEFAULT_URL_LENGTH).'~' : $page['user'];
}
} else {
// page has empty user field
$user = '(Nobody)';
}
$htmlout .= ' <tr>';
$htmlout .= ' <td><input type="checkbox" id="'.$page['id'].'" '.(($_GET['selectall'] == 1)? 'checked="checked"' : '').' /></td>';
$htmlout .= ' <td>'.$showpage.'</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="'.$this->Href('','','l='.$l.'&sort='.$sort.'&d='.$d.'&s='.$s.'&q='.$q.'&selectall=1').'" title="Check all results">Check all</a> | <a href="'.$this->Href('','','l='.$l.'&sort='.$sort.'&d='.$d.'&s='.$s.'&q='.$q.'&selectall=0').'" title="Uncheck all results">Uncheck all</a>]';
echo ' With selected: <select name="action">';
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> <input type="submit" value="Submit" accesskey="s" />';
echo $this->FormClose();
} else {
// print error message
echo '<p><span class="error">Sorry, there are no pages matching</span> <strong>"'.$q.'"</strong></p>';
}
}
} else {
// current user is not admin
echo $this->Action('pageindex');
}
?>
CategoryDevelopment