Comparing revisions for UserAdmin

Additions:
~~-**delete users** (forthcoming: see this [[RemovingUsers discussion]]);
The code below (to be saved as ##actions/useradmin.php## and used as ##""{{useradmin}}""## ) is just a very first draft. Contributions and improvements are welcome (especially to make the code lighter).
-- DarTar
Here's a preview of the interface (email addresses are masked for privacy reasons)
""<h3> User Administration </h3>
<br /> <form action="#" method="post">
Show
<select name="l" onChange="form.submit()">
<option value="10" selected>10</option>
<option value="20" >20</option>
<option value="30" >30</option>
<option value="40" >40</option>
<option value="50" >50</option>
<option value="60" >60</option>
<option value="70" >70</option>
<option value="80" >80</option>
<option value="90" >90</option>
<option value="100" >100</option>
<option value="110" >110</option>
<option value="120" >120</option>
<option value="130" >130</option>
<option value="140" >140</option>
<option value="150" >150</option>
<option value="160" >160</option>
<option value="170" >170</option>
<option value="180" >180</option>
<option value="190" >190</option>
<option value="200" >200</option>
<option value="210" >210</option>
</select> records per page ::
Search user: <input type ="text" name="search" size="20" maxlength="50" value=''/>
</form>
[Records (206): <b>1-10</b> | <a href="http://wikka.jsnx.com/#?l=10&sort=name&d=asc&s=10">11-20</a> (sorted by: <em>name, asc</em> )]<br /><br />
<table width="100%" border="1px">
<th><a href="http://wikka.jsnx.com/#?l=10&sort=name&d=desc">Name</a></th>
<th><a href="http://wikka.jsnx.com/#?l=10&sort=email&d=asc">Email</a></th>
<th><a href="http://wikka.jsnx.com/#?l=10">Signup Date/Time</a></th>
<th>Owned</th>
<th>Modified</th>
<th>Comments</th>
<th>Actions</th>
<td><a href="http://wikka.jsnx.com/AbA" title=''>AbA</a></td>
<td>xxxx@xxx.xx</td>
<td>(2004-10-27 15:39:25)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AbA&action=owned">1</a>)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AbA&action=changes">1</a>)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AbA&action=comments">3</a>)</td>
<td><center />delete :: <a href="http://wikka.jsnx.com/#?user=AbA&action=feedback">feedback</a></td>
<td><a class="missingpage" href="http://wikka.jsnx.com/AdmiN/edit" title="Create this page">AdmiN</a></td>
<td>xxxx@xxx.xx</td>
<td>(2004-12-01 06:45:56)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AdmiN&action=owned">0</a>)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AdmiN&action=changes">0</a>)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AdmiN&action=comments">0</a>)</td>
<td><center />delete :: <a href="http://wikka.jsnx.com/#?user=AdmiN&action=feedback">feedback</a></td>
<td><a href="http://wikka.jsnx.com/AdrianB" title=''>AdrianB</a></td>
<td>xxxx@xxx.xx</td>
<td>(2004-05-19 15:48:37)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AdrianB&action=owned">1</a>)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AdrianB&action=changes">4</a>)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AdrianB&action=comments">0</a>)</td>
<td><center />delete :: <a href="http://wikka.jsnx.com/#?user=AdrianB&action=feedback">feedback</a></td>
<td><a href="http://wikka.jsnx.com/AHerdOfTurtles" title=''>AHerdOfTurtles</a></td>
<td>xxxx@xxx.xx</td>
<td>(2004-09-18 19:42:39)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AHerdOfTurtles&action=owned">1</a>)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AHerdOfTurtles&action=changes">9</a>)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AHerdOfTurtles&action=comments">4</a>)</td>
<td><center />delete :: <a href="http://wikka.jsnx.com/#?user=AHerdOfTurtles&action=feedback">feedback</a></td>
<td><a class="missingpage" href="http://wikka.jsnx.com/AlekAndreev/edit" title="Create this page">AlekAndreev</a></td>
<td>xxxx@xxx.xx</td>
<td>(2004-11-01 20:06:31)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AlekAndreev&action=owned">0</a>)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AlekAndreev&action=changes">0</a>)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AlekAndreev&action=comments">0</a>)</td>
<td><center />delete :: <a href="http://wikka.jsnx.com/#?user=AlekAndreev&action=feedback">feedback</a></td>
<td><a class="missingpage" href="http://wikka.jsnx.com/AlessandroRonchi/edit" title="Create this page">AlessandroRonchi</a></td>
<td>xxxx@xxx.xx</td>
<td>(2004-10-21 13:12:36)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AlessandroRonchi&action=owned">0</a>)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AlessandroRonchi&action=changes">0</a>)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AlessandroRonchi&action=comments">0</a>)</td>
<td><center />delete :: <a href="http://wikka.jsnx.com/#?user=AlessandroRonchi&action=feedback">feedback</a></td>
<td><a class="missingpage" href="http://wikka.jsnx.com/AlexM/edit" title="Create this page">AlexM</a></td>
<td>xxxx@xxx.xx</td>
<td>(2004-11-20 06:02:39)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AlexM&action=owned">0</a>)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AlexM&action=changes">0</a>)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AlexM&action=comments">0</a>)</td>
<td><center />delete :: <a href="http://wikka.jsnx.com/#?user=AlexM&action=feedback">feedback</a></td>
<td><a class="missingpage" href="http://wikka.jsnx.com/AlleyCat/edit" title="Create this page">AlleyCat</a></td>
<td>xxxx@xxx.xx</td>
<td>(2004-11-21 18:23:19)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AlleyCat&action=owned">0</a>)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AlleyCat&action=changes">0</a>)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AlleyCat&action=comments">0</a>)</td>
<td><center />delete :: <a href="http://wikka.jsnx.com/#?user=AlleyCat&action=feedback">feedback</a></td>
<td><a href="http://wikka.jsnx.com/AndreaRossato" title=''>AndreaRossato</a></td>
<td>xxxx@xxx.xx</td>
<td>(2004-07-19 11:03:42)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AndreaRossato&action=owned">4</a>)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AndreaRossato&action=changes">25</a>)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AndreaRossato&action=comments">7</a>)</td>
<td><center />delete :: <a href="http://wikka.jsnx.com/#?user=AndreaRossato&action=feedback">feedback</a></td>
<td><a href="http://wikka.jsnx.com/AndrewEddie" title=''>AndrewEddie</a></td>
<td>xxxx@xxx.xx</td>
<td>(2004-10-12 22:23:32)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AndrewEddie&action=owned">1</a>)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AndrewEddie&action=changes">3</a>)</td>
<td><center />(<a href="http://wikka.jsnx.com/#?user=AndrewEddie&action=comments">0</a>)</td>
<td><center />delete :: <a href="http://wikka.jsnx.com/#?user=AndrewEddie&action=feedback">feedback</a></td>
</table>""
**Current features** (//2004-11-22//):
**Files needed** (//2004-09-16//):
%%(php)
// USER ADMINISTRATION MODULE
// Last Updated: 2004-11-11
// Version 1.0
// Displays to the Wikka admins a list of registered users
// * Users can be sorted by different fields, searched and paged
// * For each user, full statistics are shown with the number of commented, created and modified pages
// * Specific actions (delete/send feedback) can be performed on single users
// * If the current user is not an administrator, then the lastuser action is displayed instead
// admin only code
if ($_GET["action"] == "feedback" || $_REQUEST["mail"]) {
echo $this->Action("userfeedback");
} else if ($_GET["action"] == "owned") {
echo $this->Action("userpages");
} else if ($_GET["action"] == "changes") {
echo $this->Action("userchanges");
} else if ($_GET["action"] == "comments") {
echo $this->Action("usercomments");
// 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"])? "signuptime" : $_GET["sort"];
// sort order
$d = (!$_GET["d"])? "desc" : $_GET["d"];
// start record
$s = (!$_GET["s"])? "0" : $_GET["s"];
// search results
$where = ($_POST["search"])? "WHERE name LIKE \"%".$_POST["search"]."%\"" : "";
echo $this->Format("==== User Administration ==== --- ---");
// 1. Get total number of users
$users = $this->LoadSingle("select count(*) as n FROM ".$this->config["table_prefix"]."users ".$where);
$numusers = $users['n'];
// 2. Display pager form
$form = $this->FormOpen("","","post");
$form .= "Show\n<select name=\"l\" onChange=\"form.submit()\">\n";
for ($rec=10; $rec < ($numusers+10); $rec+=10) {
$selected = ($l == $rec)? "selected" : "";
$form .= "<option value=\"".$rec."\" ".$selected.">".$rec."</option>\n";
$form .= "</select> records per page :: \n".
"Search user: <input type =\"text\" name=\"search\" size=\"20\" maxlength=\"50\" value=\"".$_POST["search"]."\"/>\n".
$this->FormClose();
echo $form;
if($s > 0)
$prev = "<a href=\"" .$this->Href("","","l=".$l."&sort=".$sort."&d=".$d."&s=".($s-$l))."\">".($s-$l+1)."-".$s."</a> | ";
if($numusers > ($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 (".$numusers."): ".$prev."<b>".($s+1)."-".($s+$l)."</b>".$next." (sorted by: <em>".$sort.", ".$d."</em> )]<br /><br />\n";
// get user data
$userdata = $this->LoadAll("SELECT name, email, signuptime FROM ".$this->config["table_prefix"]."users ".
$where." ORDER BY ".$sort." ".$d." limit ".$s.", ".$l);
if ($userdata) {
// print table headers
$htmlout = "<table width=\"100%\" border=\"1px\">\n".
" <tr>\n".
" <th><a href=\"".$this->Href("","", (($sort == "name" && $d == "asc")? "l=".$l."&sort=name&d=desc" :
"l=".$l."&sort=name&d=asc"))."\">Name</a></th>\n".
" <th><a href=\"".$this->Href("","", (($sort == "email" && $d == "asc")? "l=".$l."&sort=email&d=desc" :
"l=".$l."&sort=email&d=asc"))."\">Email</a></th>\n".
" <th><a href=\"".$this->Href("","", (($sort == "signuptime" && $d == "desc")? "l=".$l."&sort=signuptime&d=asc" :
"l=".$l.""))."\">Signup Date/Time</a></th>\n".
" <th>Owned</th>\n".
" <th>Modified</th>\n".
" <th>Comments</th>\n".
" <th>Actions</th>\n".
" </tr>\n";
// print user table
foreach($userdata as $user) {
$htmlout .= " <tr>\n";
$num = $this->LoadSingle("SELECT COUNT(*) AS n FROM ".$this->config["table_prefix"].
"pages WHERE owner='".$user["name"]."' AND latest = 'Y'");
$numchanges = $this->LoadSingle("SELECT COUNT(*) AS m FROM ".$this->config["table_prefix"].
"pages WHERE user='".$user["name"]."'");
$numcomments = $this->LoadSingle("SELECT COUNT(*) AS q FROM ".$this->config["table_prefix"].
"comments WHERE user='".$user["name"]."'");
$htmlout .= " <td>".$this->Link($user["name"])."</td>\n <td>".$user["email"].
"</td>\n<td>(".$user["signuptime"].")</td>\n <td><center />".
"(<a href=\"".$this->Href("","","user=".$user["name"]."&action=owned")."\">".$num["n"]."</a>)"."</td>\n <td><center />".
"(<a href=\"".$this->Href("","","user=".$user["name"]."&action=changes")."\">".$numchanges["m"]."</a>)</td>\n <td><center />".
"(<a href=\"".$this->Href("","","user=".$user["name"]."&action=comments")."\">".$numcomments["q"]."</a>)</td>\n".
"<td><center />delete :: <a href=\"".$this->Href("","","user=".$user["name"]."&action=feedback")."\">feedback</a></td>\n";
$htmlout .= " </tr>\n";
$htmlout .= "</table>\n";
print($htmlout);
} else {
echo "<p><span class=\"error\">Sorry, there are no users matching</span> <strong>\"".$_POST["search"]."\"</strong></p>";
echo $this->Action("lastusers");
CategoryUserContributions
Deletions:
This is the development page for the User Administration module. The User Administration module has been committed to the [[http://wush.net/websvn/wikka/listing.php?repname=wikka&path=%2Fbranches%2F1.1.6.4%2F 1.1.6.4 branch]] and will be available with the [[http://blog.wikkawiki.org/2007/11/23/pre-release-announcement-for-securityantispam-release-1164/ 1.1.6.4 release]].
This action is meant to allow Wikka Administrators to manage users and perform several maintenance operations.
It displays the standard LastUsers list to non-admins.
>>**See also:**
~-AdminModules
~-WikkaBetaFeatures
~-UnderDevelopment
~-Are you an administrator of this site ? --- Give it a [[UserAdminTest try]]
>><<**Table of Contents:**
~-""<a href="UserAdmin#hn_Why">Why?</a>""
~-""<a href="UserAdmin#hn_Current_version">Current version</a>""
~-""<a href="UserAdmin#hn_To_do">To do</a>""
~-""<a href="UserAdmin#hn_The_code">The code</a>""
~-""<a href="UserAdmin#hn_Styling_options">Styling options</a>""<<
::c::
=== Why? ===
~~-**delete users** (forthcoming: see this [[RemovingUsers discussion]]) ''-- done as of 1.1.6.4; however, other core changes must be made to recognize users as being deleted''
~~~~& See DanWestUserReg. Worked for me as intended. I'd say, this function's done --MasinAlDujaili, 2007-05-21
~~-**rename users**
~~~&//If anyone is interested, running through the seven tables and updating every instance of your old wiki name to your new wiki name will effectively change your name throughout the wiki.// copied from comment on the homepage. --NilsLindenberg
The code below must be saved as ##actions/useradmin.php## and can be used by adding ##""{{useradmin}}""## in the body of a page.
Here's a preview of the interface (the email and IP fields are masked for privacy reasons)
==sample output==
""
<h3 id="hn_User_Administration"> User Administration </h3>
<br />
<form action="#" method="post" id="form_user_admin_panel">
<fieldset><legend>Filter view:</legend>
<label for="q">Search user:</label> <input type ="text" id="q" name="q" title="Enter a search string" size="20" maxlength="50" value=" "/> <input type="submit" value="Submit" /><br />
<label for="l">Show</label>
<select name="l" id="l" title="Select records-per-page limit">
<option value="5">5</option>
<option value="10" selected="selected">10</option>
<option value="20">20</option>
<option value="30">30</option>
<option value="40">40</option>
<option value="50">50</option>
<option value="100">100</option>
<option value="200">200</option>
<option value="300">300</option>
<option value="400">400</option>
<option value="500">500</option>
<option value="857">857</option>
</select> <label for="l">records per page</label> <input type="submit" value="Apply" /><br />
Records (857): 1-10 | <a href="http://wikka.jsnx.com/UserAdminTest?l=10&sort=signuptime&d=desc&s=10&q=" title="Show records from 11 to 20">11-20</a>
<br />
(Sorted by:<em>signuptime, desc</em>)
</fieldset></form>
<form action="http://wikka.jsnx.com/UserAdminTest" id="form_b5eda0a745">
<table summary="List of users registered on this server" border="1px" id="admin_table">
<thead>
<th> </th>
<th><a href="http://wikka.jsnx.com/UserAdminTest?l=10&sort=name&d=asc" title="Sort by user name">User Name</a></th>
<th><a href="http://wikka.jsnx.com/UserAdminTest?l=10&sort=email&d=asc" title="Sort by email">Email</a></th>
<th><a href="http://wikka.jsnx.com/UserAdminTest?l=10&sort=signuptime&d=asc" title="Sort by signup time">Signup Time</a></th>
<th><a href="http://wikka.jsnx.com/UserAdminTest?l=10&sort=ipaddress&d=desc" title="Sort by signup IP">Signup IP</a></th>
<th class="number c1" title="Owned Pages"><img src="images/icons/16x16/stock_keyring.png" alt="O"/></th>
<th class="number c2" title="Page Edits"><img src="images/icons/16x16/text-editor.png" alt="E"/></th>
<th class="number c3" title="Comments"><img src="images/icons/16x16/stock_help-agent.png" alt="C"/></th>
<th class="center">Actions</th>
</thead>
<tbody>
<tr >
<td><input type="checkbox" id=" " title="Select HypeXR"/></td>
<td><a href="http://wikka.jsnx.com/HypeXR" title=" ">HypeXR</a></td>
<td>scott@xxxx.xx</td>
<td class="time">2005-08-01 09:01:54</td>
<td>XX.XX.XX.XX</td>
<td class="number c1"><a title="Display pages owned by HypeXR (1)" href="http://wikka.jsnx.com/UserAdminTest?user=HypeXR&action=owned">1</a></td>
<td class="number c2"><a title="Display page edits by HypeXR (2)" href="http://wikka.jsnx.com/UserAdminTest?user=HypeXR&action=changes">2</a></td>
<td class="number c3"><a title="Display comments by HypeXR (1)" href="http://wikka.jsnx.com/UserAdminTest?user=HypeXR&action=comments">1</a></td>
<td class="center"><a title="Remove user HypeXR" href="http://wikka.jsnx.com/UserAdminTest?user=HypeXR&action=delete">delete</a> :: <a title="Send feedback to user HypeXR" href="http://wikka.jsnx.com/UserAdminTest?user=HypeXR&action=feedback">feedback</a></td>
</tbody>
<tbody>
<tr class="alt">
<td><input type="checkbox" id=" " title="Select WiebTest"/></td>
<td>WiebTest</td>
<td>wiebren.w@xxxx.xx</td>
<td class="time">2005-07-31 19:35:26</td>
<td>XX.XX.XX.XX</td>
<td class="number c1">0</td>
<td class="number c2">0</td>
<td class="number c3">0</td>
<td class="center"><a title="Remove user WiebTest" href="http://wikka.jsnx.com/UserAdminTest?user=WiebTest&action=delete">delete</a> :: <a title="Send feedback to user WiebTest" href="http://wikka.jsnx.com/UserAdminTest?user=WiebTest&action=feedback">feedback</a></td>
</tbody>
<tbody>
<tr >
<td><input type="checkbox" id=" " title="Select DennyShimkoski"/></td>
<td><a href="http://wikka.jsnx.com/DennyShimkoski" title=" ">DennyShimkoski</a></td>
<td>denny@xxxx.xx</td>
<td class="time">2005-07-31 00:22:58</td>
<td>XX.XX.XX.XX</td>
<td class="number c1"><a title="Display pages owned by DennyShimkoski (6)" href="http://wikka.jsnx.com/UserAdminTest?user=DennyShimkoski&action=owned">6</a></td>
<td class="number c2"><a title="Display page edits by DennyShimkoski (38)" href="http://wikka.jsnx.com/UserAdminTest?user=DennyShimkoski&action=changes">38</a></td>
<td class="number c3"><a title="Display comments by DennyShimkoski (1)" href="http://wikka.jsnx.com/UserAdminTest?user=DennyShimkoski&action=comments">1</a></td>
<td class="center"><a title="Remove user DennyShimkoski" href="http://wikka.jsnx.com/UserAdminTest?user=DennyShimkoski&action=delete">delete</a> :: <a title="Send feedback to user DennyShimkoski" href="http://wikka.jsnx.com/UserAdminTest?user=DennyShimkoski&action=feedback">feedback</a></td>
</tbody>
<tbody>
<tr class="alt">
<td><input type="checkbox" id=" " title="Select RobinW"/></td>
<td>RobinW</td>
<td>wikka@xxxx.xx</td>
<td class="time">2005-07-30 02:06:20</td>
<td>XX.XX.XX.XX</td>
<td class="number c1">0</td>
<td class="number c2">0</td>
<td class="number c3"><a title="Display comments by RobinW (1)" href="http://wikka.jsnx.com/UserAdminTest?user=RobinW&action=comments">1</a></td>
<td class="center"><a title="Remove user RobinW" href="http://wikka.jsnx.com/UserAdminTest?user=RobinW&action=delete">delete</a> :: <a title="Send feedback to user RobinW" href="http://wikka.jsnx.com/UserAdminTest?user=RobinW&action=feedback">feedback</a></td>
</tbody>
<tbody>
<tr >
<td><input type="checkbox" id=" " title="Select VictorManuelVarela"/></td>
<td><a href="http://wikka.jsnx.com/VictorManuelVarela" title=" ">VictorManuelVarela</a></td>
<td>vmvarela@xxxx.xx</td>
<td class="time">2005-07-30 00:01:13</td>
<td>XX.XX.XX.XX</td>
<td class="number c1"><a title="Display pages owned by VictorManuelVarela (1)" href="http://wikka.jsnx.com/UserAdminTest?user=VictorManuelVarela&action=owned">1</a></td>
<td class="number c2"><a title="Display page edits by VictorManuelVarela (6)" href="http://wikka.jsnx.com/UserAdminTest?user=VictorManuelVarela&action=changes">6</a></td>
<td class="number c3">0</td>
<td class="center"><a title="Remove user VictorManuelVarela" href="http://wikka.jsnx.com/UserAdminTest?user=VictorManuelVarela&action=delete">delete</a> :: <a title="Send feedback to user VictorManuelVarela" href="http://wikka.jsnx.com/UserAdminTest?user=VictorManuelVarela&action=feedback">feedback</a></td>
</tbody>
<tbody>
<tr class="alt">
<td><input type="checkbox" id=" " title="Select EniBevoli"/></td>
<td>EniBevoli</td>
<td>enibevoli@xxxx.xx</td>
<td class="time">2005-07-29 12:13:44</td>
<td>XX.XX.XX.XX</td>
<td class="number c1">0</td>
<td class="number c2"><a title="Display page edits by EniBevoli (4)" href="http://wikka.jsnx.com/UserAdminTest?user=EniBevoli&action=changes">4</a></td>
<td class="number c3"><a title="Display comments by EniBevoli (1)" href="http://wikka.jsnx.com/UserAdminTest?user=EniBevoli&action=comments">1</a></td>
<td class="center"><a title="Remove user EniBevoli" href="http://wikka.jsnx.com/UserAdminTest?user=EniBevoli&action=delete">delete</a> :: <a title="Send feedback to user EniBevoli" href="http://wikka.jsnx.com/UserAdminTest?user=EniBevoli&action=feedback">feedback</a></td>
</tbody>
<tbody>
<tr >
<td><input type="checkbox" id=" " title="Select MyPrivateWiki"/></td>
<td>MyPrivateWiki</td>
<td>serayamaouche@xxxx.xx</td>
<td class="time">2005-07-28 20:30:36</td>
<td>XX.XX.XX.XX</td>
<td class="number c1">0</td>
<td class="number c2">0</td>
<td class="number c3">0</td>
<td class="center"><a title="Remove user MyPrivateWiki" href="http://wikka.jsnx.com/UserAdminTest?user=MyPrivateWiki&action=delete">delete</a> :: <a title="Send feedback to user MyPrivateWiki" href="http://wikka.jsnx.com/UserAdminTest?user=MyPrivateWiki&action=feedback">feedback</a></td>
</tbody>
<tbody>
<tr class="alt">
<td><input type="checkbox" id=" " title="Select DaSt"/></td>
<td>DaSt</td>
<td>dstolars@xxxx.xx</td>
<td class="time">2005-07-27 17:32:06</td>
<td>XX.XX.XX.XX</td>
<td class="number c1">0</td>
<td class="number c2">0</td>
<td class="number c3">0</td>
<td class="center"><a title="Remove user DaSt" href="http://wikka.jsnx.com/UserAdminTest?user=DaSt&action=delete">delete</a> :: <a title="Send feedback to user DaSt" href="http://wikka.jsnx.com/UserAdminTest?user=DaSt&action=feedback">feedback</a></td>
</tbody>
<tbody>
<tr >
<td><input type="checkbox" id=" " title="Select WikiSop"/></td>
<td>WikiSop</td>
<td>mail-to-sophie@xxxx.xx</td>
<td class="time">2005-07-27 14:59:07</td>
<td>XX.XX.XX.XX</td>
<td class="number c1">0</td>
<td class="number c2">0</td>
<td class="number c3">0</td>
<td class="center"><a title="Remove user WikiSop" href="http://wikka.jsnx.com/UserAdminTest?user=WikiSop&action=delete">delete</a> :: <a title="Send feedback to user WikiSop" href="http://wikka.jsnx.com/UserAdminTest?user=WikiSop&action=feedback">feedback</a></td>
</tbody>
<tbody>
<tr class="alt">
<td><input type="checkbox" id=" " title="Select Aragorn2005"/></td>
<td>Aragorn2005</td>
<td>mail.matthias.schulz@xxxx.xx</td>
<td class="time">2005-07-27 08:48:46</td>
<td>XX.XX.XX.XX</td>
<td class="number c1">0</td>
<td class="number c2">0</td>
<td class="number c3">0</td>
<td class="center"><a title="Remove user Aragorn2005" href="http://wikka.jsnx.com/UserAdminTest?user=Aragorn2005&action=delete">delete</a> :: <a title="Send feedback to user Aragorn2005" href="http://wikka.jsnx.com/UserAdminTest?user=Aragorn2005&action=feedback">feedback</a></td>
</tbody>
</table>
<fieldset><legend>Mass-action</legend>[<a href="http://wikka.jsnx.com/UserAdminTest?l=10&sort=signuptime&d=desc&s=0&q=&selectall=1" title="Check all records">Check all</a> | <a href="http://wikka.jsnx.com/UserAdminTest?l=10&sort=signuptime&d=desc&s=0&q=&selectall=0" title="Uncheck all records">Uncheck all</a>]<br /><label for="action" >With selected</label> <select title="Choose action to apply to selected records" id="action" name="action"><option value=" " selected="selected">---</option><option value="massdelete">Remove all</option><option value="massfeedback">Send feedback to all</option></select> <input type="submit" value="Submit" /></fieldset></form>
""
===Current version=== (//2005-08-31//):
##0.5##
~-added extra column for Signup IP ( installed on this server as a beta feature).
~~-TrackIPaddressMod for (possible) install on 'your' server
~-added constants, UI strings and a bunch of configurable options including styling options (see below).
==Files needed== (//2004-09-16//):
===To do ===
~-mass-operations;
~-deleting/banning users;
~-integrate with other admin modules.
====The code====
**Note:** this action uses the ##ipaddress## field that has been added as a beta antispam feature to this server. Lines relative to this field have been commented out in the code to allow installation on a native wikka package
The code has also been adapted to take advantage of the ##[[WikkaCountingRecords getCount()]]## method, which is required for the action to work.
%%(php;1)
/**
* Display a module for user management.
*
* This action allows admins to display information on registered users.
* Users can be searched, paged, filtered. User-related statistics are given,
* showing the number of commented, created and modified pages. A feedback
* handler allows admins to send an email to single users. If the current user
* is not an administrator, then the lastuser action is displayed instead.
*
* @package Actions
* @name Useradmin
*
* @author {@link http://wikka.jsnx.com/DarTar Dario Taraborelli}
* @version 0.5
* @since Wikka 1.1.X.X
*
* @input integer $colcolor optional: enables color for statistics columns
* 1: enables colored columns;
* 0: disables colored columns;
* default: 1;
* @input integer $rowcolor optional: enables alternate row colors
* 1: enables colored rows;
* 0: disables colored rows;
* default: 1;
*
* @output A list of users registered on the current server.
*
* @todo
* - mass-operations;
* - deleting/banning users;
* - integrate with other admin modules.
*/
//utilities
/**
* Build an array of numbers consisting of 'ranges' with increasing step size in each 'range'.
*
* A list of numbers like this is useful for instance for a dropdown to choose
* a period expressed in number of days: a difference between 2 and 5 days may
* be significant while that between 92 and 95 may not be.
*
* @author {@link http://wikka.jsnx.com/JavaWoman JavaWoman}
* @copyright Copyright (c) 2005, Marjolein Katsma
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
* @version 1.0
*
* @param mixed $limits required: single integer or array of integers;
* defines the upper limits of the ranges as well as the next step size
* @param int $max required: upper limit for the whole list
* (will be included if smaller than the largest limit)
* @param int $firstinc optional: increment for the first range; default 1
* @return array resulting list of numbers
*/
// utilities
function optionRanges($limits, $max, $firstinc = 1)
{
// initializations
if (is_int($limits)) $limits = array($limits);
if ($firstinc < 1) $firstinc = 1;
$opts = array();
$inc = $firstinc;
// first element is the first increment
$opts[] = $inc;
// each $limit is the upper limit of a 'range'
foreach ($limits as $limit)
{
for ($i = $inc + $inc; $i <= $limit && $i < $max; $i += $inc)
{
$opts[] = $i;
// we quit at $max, even if there are more $limit elements
if ($limit >= $max)
{
// add $max to the list; then break out of the loop
$opts[] = $max;
break;
// when $limit is reached, it becomes the new start and increment for the next 'range'
$inc = $limit;
return $opts;
// restrict access to admins
// -------------------------------------
// set default values as constants
define('DEFAULT_RECORDS_LIMIT', '10'); # number of records per page
define('DEFAULT_MIN_RECORDS_DISPLAY', '5'); # min number of records
define('DEFAULT_RECORDS_RANGE',serialize(array('10','50','100','500','1000'))); #range array for records pager
define('DEFAULT_SORT_FIELD', 'signuptime'); # sort field
define('DEFAULT_SORT_ORDER', 'desc'); # sort order, ascendant or descendant
define('DEFAULT_START', '0'); # start record
define('DEFAULT_SEARCH', ''); # keyword to restrict search
define('ALTERNATE_ROW_COLOR', '1'); # switch alternate row color
define('STAT_COLUMN_COLOR', '1'); # switch color for statistics columns
// -------------------------------------
// User-interface: icons

define('OWNED_ICON', 'images/icons/16x16/stock_keyring.png');
define('EDITS_ICON', 'images/icons/16x16/text-editor.png');
define('COMMENTS_ICON', 'images/icons/16x16/stock_help-agent.png');
// -------------------------------------
// User-interface: strings
define('PAGE_TITLE','User Administration');
define('FORM_LEGEND','Filter view:');
define('FORM_SEARCH_STRING_LABEL','Search user:');
define('FORM_SEARCH_STRING_TITLE','Enter a search string');
define('FORM_SEARCH_SUBMIT','Submit');
define('FORM_PAGER_LABEL_BEFORE','Show');
define('FORM_PAGER_TITLE','Select records-per-page limit');
define('FORM_PAGER_LABEL_AFTER','records per page');
define('FORM_PAGER_SUBMIT','Apply');
define('FORM_PAGER_LINK','Show records from %d to %d');
define('FORM_RESULT_INFO','Records');
define('FORM_RESULT_SORTED_BY','Sorted by:');
define('TABLE_HEADING_USERNAME','User Name');
define('TABLE_HEADING_USERNAME_TITLE','Sort by user name');
define('TABLE_HEADING_EMAIL','Email');
define('TABLE_HEADING_EMAIL_TITLE','Sort by email');
define('TABLE_HEADING_SIGNUPTIME','Signup Time');
define('TABLE_HEADING_SIGNUPTIME_TITLE','Sort by signup time');
define('TABLE_HEADING_SIGNUPIP','Signup IP');
define('TABLE_HEADING_SIGNUPIP_TITLE','Sort by signup IP');
define('TABLE_SUMMARY','List of users registered on this server');
define('TABLE_HEADING_OWNED_TITLE','Owned Pages');
define('TABLE_HEADING_EDITS_TITLE','Page Edits');
define('TABLE_HEADING_COMMENTS_TITLE','Comments');
define('ACTION_DELETE_LINK_TITLE','Remove user %s');
define('ACTION_FEEDBACK_LINK_TITLE','Send feedback to user %s');
define('ACTION_DELETE_LINK','delete');
define('ACTION_FEEDBACK_LINK','feedback');
define('TABLE_CELL_OWNED_TITLE','Display pages owned by %s (%d)');
define('TABLE_CELL_EDITS_TITLE','Display page edits by %s (%d)');
define('TABLE_CELL_COMMENTS_TITLE','Display comments by %s (%d)');
define('SELECT_RECORD_TITLE','Select %s');
define('CHECK_ALL_TITLE','Check all records');
define('CHECK_ALL','Check all');
define('UNCHECK_ALL_TITLE','Uncheck all records');
define('UNCHECK_ALL','Uncheck all');
define('FORM_MASSACTION_LEGEND','Mass-action');
define('FORM_MASSACTION_LABEL','With selected');
define('FORM_MASSACTION_SELECT_TITLE','Choose action to apply to selected records');
define('FORM_MASSACTION_OPT_DELETE','Remove all');
define('FORM_MASSACTION_OPT_FEEDBACK','Send feedback to all');
define('FORM_MASSACTION_SUBMIT','Submit');
define('ERROR_NO_MATCHES','Sorry, there are no users matching "%s"');

//initialize row & column colors variables
$r = 1; #initialize row counter
$r_color = ALTERNATE_ROW_COLOR; #get alternate row color option
$c_color = STAT_COLUMN_COLOR; #get column color option
// record dropdown
$user_limits = unserialize(DEFAULT_RECORDS_RANGE);
// pager
$prev = '';
$next = '';

//override defaults with action parameters
if (is_array($vars))
{
foreach ($vars as $param => $value)
{
switch ($param)
{
case 'colcolor':
$c_color = (preg_match('/[01]/',$value))? $value : STAT_COLUMN_COLOR;
break;
case 'rowcolor':
$r_color = (preg_match('/[01]/',$value))? $value : ALTERNATE_ROW_COLOR;
break;
}

//perform actions if required
if ($_GET['action'] == 'feedback' || $_REQUEST['mail'])
{
echo $this->Action('userfeedback');
}
elseif ($_GET['action'] == 'owned')
{
echo $this->Action('userpages');
}
elseif ($_GET['action'] == 'changes')
{
echo $this->Action('userchanges');
}
elseif ($_GET['action'] == 'comments')
{
echo $this->Action('usercomments');
}
else
{

// process URL variables
# JW 2005-07-19 some modifications to avoid notices but these are still not actually secure

// number of records per page
if (isset($_POST['l']))
$l = $_POST['l'];
elseif (isset($_GET['l']))
$l = $_GET['l'];
else
$l = DEFAULT_RECORDS_LIMIT;

// sort field
$sort = (isset($_GET['sort'])) ? $_GET['sort'] : DEFAULT_SORT_FIELD;
// sort order
$d = (isset($_GET['d'])) ? $_GET['d'] : DEFAULT_SORT_ORDER;
// start record
$s = (isset($_GET['s'])) ? $_GET['s'] : DEFAULT_START;

// search string
if (isset($_POST['q']))
$q = $_POST['q'];
elseif (isset($_GET['q']))
$q = $_GET['q'];
else
$q = DEFAULT_SEARCH;

// select all
$checked = '';
if (isset($_GET['selectall']))
{
$checked = (1 == $_GET['selectall']) ? ' checked="checked"' : '';

// restrict MySQL query by search string
$where = ('' == $q) ? "1" : "`name` LIKE '%".$q."%'";
// get total number of users
$numusers = $this->getCount('users', $where);

// print page header
echo $this->Format('==== '.PAGE_TITLE.' ==== --- ');

// build pager form
$form = $this->FormOpen('','','post','user_admin_panel');
$form .= '<fieldset><legend>'.FORM_LEGEND.'</legend>'."\n";
$form .= '<label for="q">'.FORM_SEARCH_STRING_LABEL.'</label> <input type ="text" id="q" name="q" title="'.FORM_SEARCH_STRING_TITLE.'" size="20" maxlength="50" value="'.$q.'"/> <input type="submit" value="'.FORM_SEARCH_SUBMIT.'" /><br />'."\n";
// ranged drop-down
$users_opts = optionRanges($user_limits,$numusers,DEFAULT_MIN_RECORDS_DISPLAY);
$form .= '<label for="l">'.FORM_PAGER_LABEL_BEFORE.'</label> '."\n";
$form .= '<select name="l" id="l" title="'.FORM_PAGER_TITLE.'">'."\n";
// build drop-down
foreach ($users_opts as $opt) {
$selected = ($opt == $l) ? ' selected="selected"' : '';
$form .= '<option value="'.$opt.'"'.$selected.'>'.$opt.'</option>'."\n";
$form .= '</select> <label for="l">'.FORM_PAGER_LABEL_AFTER.'</label> <input type="submit" value="'.FORM_PAGER_SUBMIT.'" /><br />'."\n";

// build pager links
if ($s > 0)
$prev = '<a href="' .$this->Href('','','l='.$l.'&sort='.$sort.'&d='.$d.'&s='.($s-$l)).'&q='.$q.'" title="'.sprintf(FORM_PAGER_LINK, ($s-$l+1), $s).'">'.($s-$l+1).'-'.$s.'</a> | '."\n";
if ($numusers > ($s + $l))
$next = ' | <a href="'.$this->Href('','','l='.$l.'&sort='.$sort.'&d='.$d.'&s='.($s+$l)).'&q='.$q.'" title="'.sprintf(FORM_PAGER_LINK, ($s+$l+1), ($s+2*$l)).'">'.($s+$l+1).'-'.($s+2*$l).'</a>'."\n";
$form .= FORM_RESULT_INFO.' ('.$numusers.'): '.$prev.($s+1).'-'.($s+$l).$next.'<br />'."\n";
$form .= '('.FORM_RESULT_SORTED_BY.'<em>'.$sort.', '.$d.'</em>)'."\n";
$form .= '</fieldset>'.$this->FormClose()."\n";
// print form
echo $form;

// get user list
$userdata = $this->LoadAll("SELECT * FROM ".$this->config["table_prefix"]."users WHERE ".
$where." ORDER BY ".$sort." ".$d." limit ".$s.", ".$l);

if ($userdata) {

// build header links
$nameheader = '<a href="'.$this->Href('','', (($sort == 'name' && $d == 'asc')? 'l='.$l.'&sort=name&d=desc' : 'l='.$l.'&sort=name&d=asc')).'" title="'.TABLE_HEADING_USERNAME_TITLE.'">'.TABLE_HEADING_USERNAME.'</a>';
$emailheader = '<a href="'.$this->Href('','', (($sort == 'email' && $d == 'asc')? 'l='.$l.'&sort=email&d=desc' : 'l='.$l.'&sort=email&d=asc')).'" title="'.TABLE_HEADING_EMAIL_TITLE.'">'.TABLE_HEADING_EMAIL.'</a>';
$timeheader = '<a href="'.$this->Href('','', (($sort == 'signuptime' && $d == 'desc')? 'l='.$l.'&sort=signuptime&d=asc' : 'l='.$l.'')).'" title="'.TABLE_HEADING_SIGNUPTIME_TITLE.'">'.TABLE_HEADING_SIGNUPTIME.'</a>';
/*$ipheader = '<a href="'.$this->Href('','', (($sort == 'ipaddress' && $d == 'desc')? 'l='.$l.'&sort=ipaddress&d=asc' : 'l='.$l.'&sort=ipaddress&d=desc')).'" title="'.TABLE_HEADING_SIGNUPIP_TITLE.'">'.TABLE_HEADING_SIGNUPIP.'</a>'; # installed as beta feature at wikka.jsnx.com */

// build table headers
$htmlout = "<table summary=\"".TABLE_SUMMARY."\" border=\"1px\" id=\"admin_table\">\n<thead>\n".
" <tr>\n".
" <th> </th>\n".
" <th>".$nameheader."</th>\n".
" <th>".$emailheader."</th>\n".
" <th>".$timeheader."</th>\n".
/* " <th>".$ipheader."</th>\n". # installed as beta feature at wikka.jsnx.com */
" <th class=\"number ".(($c_color == 1)? ' c1' : '')."\" title=\"".TABLE_HEADING_OWNED_TITLE."\">;<img src=\"".OWNED_ICON."\" alt=\"O\"/></th>\n".
" <th class=\"number ".(($c_color == 1)? ' c2' : '')."\" title=\"".TABLE_HEADING_EDITS_TITLE."\"><img src=\"".EDITS_ICON."\" alt=\"E\"/></th>\n".
" <th class=\"number ".(($c_color == 1)? ' c3' : '')."\" title=\"".TABLE_HEADING_COMMENTS_TITLE."\"><img src=\"".COMMENTS_ICON."\" alt=\"C\"/></th>\n".
" <th class=\"center\">Actions</th>\n".
" </tr>\n</thead>\n";

// print user table
foreach($userdata as $user) {

// get counts
$where_owned = "`owner` = '".$user['name']."' AND latest = 'Y'";
$where_changes = "`user` = '".$user['name']."'";
$where_comments = "`user` = '".$user['name']."'";
$numowned = $this->getCount('pages', $where_owned);
$numchanges = $this->getCount('pages', $where_changes);
$numcomments = $this->getCount('comments', $where_comments);

// build statistics links if needed
$ownedlink = ($numowned > 0)? '<a title="'.sprintf(TABLE_CELL_OWNED_TITLE,$user['name'],$numowned).'" href="'.$this->Href('','','user='.$user['name'].'&action=owned').'">'.$numowned.'</a>' : '0';
$changeslink = ($numchanges > 0)? '<a title="'.sprintf(TABLE_CELL_EDITS_TITLE,$user['name'],$numchanges).'" href="'.$this->Href('','','user='.$user['name'].'&action=changes').'">'.$numchanges.'</a>' : '0';
$commentslink = ($numcomments > 0)? '<a title="'.sprintf(TABLE_CELL_COMMENTS_TITLE,$user['name'],$numcomments).'" href="'.$this->Href('','','user='.$user['name'].'&action=comments').'">'.$numcomments.'</a>' : '0';
// build handler links
$deleteuser = '<a title="'.sprintf(ACTION_DELETE_LINK_TITLE, $user['name']).'" href="'.$this->Href('','','user='.$user['name'].'&action=delete').'">'.ACTION_DELETE_LINK.'</a>';
$feedbackuser = '<a title="'.sprintf(ACTION_FEEDBACK_LINK_TITLE, $user['name']).'" href="'.$this->Href('','','user='.$user['name'].'&action=feedback').'">'.ACTION_FEEDBACK_LINK.'</a>';

// build table body
$htmlout .= "<tbody>\n";
if ($r_color == 1) {
$htmlout .= "<tr ".(($r%2)? '' : 'class="alt"').">\n"; #enable alternate row color
} else {
$htmlout .= "<tr>\n"; #disable alternate row color
}
$htmlout .= " <td><input type=\"checkbox\" id=\"".$user['id']."\"".$checked." title=\"".sprintf(SELECT_RECORD_TITLE,$user['name'])."\"/></td>\n".
" <td>".(($this->ExistsPage($user['name']))? $this->Link($user['name']) : $user['name'])."</td>\n". #check if userpage exists
" <td>".$user['email']."</td>\n".
" <td class=\"time\">".$user['signuptime']."</td>\n".
/* " <td>".$user['ipaddress']."</td>\n". # installed as beta feature at wikka.jsnx.com */
" <td class=\"number".(($c_color == 1)? ' c1' : '')."\">".$ownedlink."</td>\n". #set column color
" <td class=\"number".(($c_color == 1)? ' c2' : '')."\">".$changeslink."</td>\n". #set column color
" <td class=\"number".(($c_color == 1)? ' c3' : '')."\">".$commentslink."</td>\n". #set column color
" <td class=\"center\">".$deleteuser." :: ".$feedbackuser."</td>\n";
$htmlout .= " </tr>\n</tbody>\n";

//increase row counter ----- alternate row colors
if ($r_color == 1) $r++;
}
$htmlout .= "</table>\n";
// print the table
echo $this->FormOpen('','','get');
echo $htmlout;

// multiple-user operations (forthcoming) JW 2005-07-19 accesskey removed (causes more problems than it solves)
echo '<fieldset><legend>'.FORM_MASSACTION_LEGEND.'</legend>';
echo '[<a href="'.$this->Href('','','l='.$l.'&sort='.$sort.'&d='.$d.'&s='.$s.'&q='.$q.'&selectall=1').'" title="'.CHECK_ALL_TITLE.'">'.CHECK_ALL.'</a> | <a href="'.$this->Href('','','l='.$l.'&sort='.$sort.'&d='.$d.'&s='.$s.'&q='.$q.'&selectall=0').'" title="'.UNCHECK_ALL_TITLE.'">'.UNCHECK_ALL.'</a>]<br />';
echo '<label for="action" >'.FORM_MASSACTION_LABEL.'</label> <select title="'.FORM_MASSACTION_SELECT_TITLE.'" id="action" name="action">';
echo '<option value="" selected="selected">---</option>';
echo '<option value="massdelete">'.FORM_MASSACTION_OPT_DELETE.'</option>';
echo '<option value="massfeedback">'.FORM_MASSACTION_OPT_FEEDBACK.'</option>';
echo '</select> <input type="submit" value="'.FORM_MASSACTION_SUBMIT.'" />';
echo '</fieldset>';
echo $this->FormClose();
}
else
{
// no records matching the search string: print error message
echo '<p><span class="error">'.sprintf(ERROR_NO_MATCHES, $q).'</span></p>';
echo $this->Action('lastusers');
===New CSS classes===
The styling of the tables requires a bunch of [[TableStyling new CSS classes]].
==== Styling options ====
The ##useradmin## action accepts two optional styling parameters:
##colcolor##
Enables color for statistics columns
1: enables colored columns (default);
0: disables colored columns;
##rowcolor##
Enables alternate row colors
1: enables colored rows (default);
0: disables colored rows;
The following examples show how the table is rendered using these two parameters:
**No styling:** ##""{{useradmin colcolor="0" rowcolor="0"}}""##
""<table summary="List of users registered on this server" border="1px" id="admin_table">
<thead>
<th> </th>
<th><a href="http://wikka.jsnx.com/UserAdminTest?l=10&sort=name&d=asc" title="Sort by user name">User Name</a></th>
<th><a href="http://wikka.jsnx.com/UserAdminTest?l=10&sort=email&d=asc" title="Sort by email">Email</a></th>
<th><a href="http://wikka.jsnx.com/UserAdminTest?l=10&sort=signuptime&d=asc" title="Sort by signup time">Signup Time</a></th>
<th><a href="http://wikka.jsnx.com/UserAdminTest?l=10&sort=ipaddress&d=desc" title="Sort by signup IP">Signup IP</a></th>
<th class="number" title="Owned Pages"><img src="images/icons/16x16/stock_keyring.png" alt="O"/></th>
<th class="number" title="Page Edits"><img src="images/icons/16x16/text-editor.png" alt="E"/></th>
<th class="number" title="Comments"><img src="images/icons/16x16/stock_help-agent.png" alt="C"/></th>
<th class="center">Actions</th>
</thead>
<tbody>
<tr >
<td><input type="checkbox" id=" " title="Select HypeXR"/></td>
<td><a href="http://wikka.jsnx.com/HypeXR" title=" ">HypeXR</a></td>
<td>scott@xxxx.xx</td>
<td class="time">2005-08-01 09:01:54</td>
<td>XX.XX.XX.XX</td>
<td class="number"><a title="Display pages owned by HypeXR (1)" href="http://wikka.jsnx.com/UserAdminTest?user=HypeXR&action=owned">1</a></td>
<td class="number"><a title="Display page edits by HypeXR (2)" href="http://wikka.jsnx.com/UserAdminTest?user=HypeXR&action=changes">2</a></td>
<td class="number"><a title="Display comments by HypeXR (1)" href="http://wikka.jsnx.com/UserAdminTest?user=HypeXR&action=comments">1</a></td>
<td class="center"><a title="Remove user HypeXR" href="http://wikka.jsnx.com/UserAdminTest?user=HypeXR&action=delete">delete</a> :: <a title="Send feedback to user HypeXR" href="http://wikka.jsnx.com/UserAdminTest?user=HypeXR&action=feedback">feedback</a></td>
</tbody>
<tbody>
<tr>
<td><input type="checkbox" id=" " title="Select WiebTest"/></td>
<td>WiebTest</td>
<td>wiebren.w@xxxx.xx</td>
<td class="time">2005-07-31 19:35:26</td>
<td>XX.XX.XX.XX</td>
<td class="number">0</td>
<td class="number">0</td>
<td class="number">0</td>
<td class="center"><a title="Remove user WiebTest" href="http://wikka.jsnx.com/UserAdminTest?user=WiebTest&action=delete">delete</a> :: <a title="Send feedback to user WiebTest" href="http://wikka.jsnx.com/UserAdminTest?user=WiebTest&action=feedback">feedback</a></td>
</tbody>
<tbody>
<tr>
<td><input type="checkbox" id=" " title="Select DennyShimkoski"/></td>
<td><a href="http://wikka.jsnx.com/DennyShimkoski" title=" ">DennyShimkoski</a></td>
<td>denny@xxxx.xx</td>
<td class="time">2005-07-31 00:22:58</td>
<td>XX.XX.XX.XX</td>
<td class="number"><a title="Display pages owned by DennyShimkoski (6)" href="http://wikka.jsnx.com/UserAdminTest?user=DennyShimkoski&action=owned">6</a></td>
<td class="number"><a title="Display page edits by DennyShimkoski (38)" href="http://wikka.jsnx.com/UserAdminTest?user=DennyShimkoski&action=changes">38</a></td>
<td class="number"><a title="Display comments by DennyShimkoski (1)" href="http://wikka.jsnx.com/UserAdminTest?user=DennyShimkoski&action=comments">1</a></td>
<td class="center"><a title="Remove user DennyShimkoski" href="http://wikka.jsnx.com/UserAdminTest?user=DennyShimkoski&action=delete">delete</a> :: <a title="Send feedback to user DennyShimkoski" href="http://wikka.jsnx.com/UserAdminTest?user=DennyShimkoski&action=feedback">feedback</a></td>
</tbody>
</table>
""
**Alternate rows only:** ##""{{useradmin colcolor="0"}}""##
""<table summary="List of users registered on this server" border="1px" id="admin_table">
<thead>
<th> </th>
<th><a href="http://wikka.jsnx.com/UserAdminTest?l=10&sort=name&d=asc" title="Sort by user name">User Name</a></th>
<th><a href="http://wikka.jsnx.com/UserAdminTest?l=10&sort=email&d=asc" title="Sort by email">Email</a></th>
<th><a href="http://wikka.jsnx.com/UserAdminTest?l=10&sort=signuptime&d=asc" title="Sort by signup time">Signup Time</a></th>
<th><a href="http://wikka.jsnx.com/UserAdminTest?l=10&sort=ipaddress&d=desc" title="Sort by signup IP">Signup IP</a></th>
<th class="number" title="Owned Pages"><img src="images/icons/16x16/stock_keyring.png" alt="O"/></th>
<th class="number" title="Page Edits"><img src="images/icons/16x16/text-editor.png" alt="E"/></th>
<th class="number" title="Comments"><img src="images/icons/16x16/stock_help-agent.png" alt="C"/></th>
<th class="center">Actions</th>
</thead>
<tbody>
<tr >
<td><input type="checkbox" id=" " title="Select HypeXR"/></td>
<td><a href="http://wikka.jsnx.com/HypeXR" title=" ">HypeXR</a></td>
<td>scott@xxxx.xx</td>
<td class="time">2005-08-01 09:01:54</td>
<td>XX.XX.XX.XX</td>
<td class="number"><a title="Display pages owned by HypeXR (1)" href="http://wikka.jsnx.com/UserAdminTest?user=HypeXR&action=owned">1</a></td>
<td class="number"><a title="Display page edits by HypeXR (2)" href="http://wikka.jsnx.com/UserAdminTest?user=HypeXR&action=changes">2</a></td>
<td class="number"><a title="Display comments by HypeXR (1)" href="http://wikka.jsnx.com/UserAdminTest?user=HypeXR&action=comments">1</a></td>
<td class="center"><a title="Remove user HypeXR" href="http://wikka.jsnx.com/UserAdminTest?user=HypeXR&action=delete">delete</a> :: <a title="Send feedback to user HypeXR" href="http://wikka.jsnx.com/UserAdminTest?user=HypeXR&action=feedback">feedback</a></td>
</tbody>
<tbody>
<tr class="alt">
<td><input type="checkbox" id=" " title="Select WiebTest"/></td>
<td>WiebTest</td>
<td>wiebren.w@xxxx.xx</td>
<td class="time">2005-07-31 19:35:26</td>
<td>XX.XX.XX.XX</td>
<td class="number">0</td>
<td class="number">0</td>
<td class="number">0</td>
<td class="center"><a title="Remove user WiebTest" href="http://wikka.jsnx.com/UserAdminTest?user=WiebTest&action=delete">delete</a> :: <a title="Send feedback to user WiebTest" href="http://wikka.jsnx.com/UserAdminTest?user=WiebTest&action=feedback">feedback</a></td>
</tbody>
<tbody>
<tr>
<td><input type="checkbox" id=" " title="Select DennyShimkoski"/></td>
<td><a href="http://wikka.jsnx.com/DennyShimkoski" title=" ">DennyShimkoski</a></td>
<td>denny@xxxx.xx</td>
<td class="time">2005-07-31 00:22:58</td>
<td>XX.XX.XX.XX</td>
<td class="number"><a title="Display pages owned by DennyShimkoski (6)" href="http://wikka.jsnx.com/UserAdminTest?user=DennyShimkoski&action=owned">6</a></td>
<td class="number"><a title="Display page edits by DennyShimkoski (38)" href="http://wikka.jsnx.com/UserAdminTest?user=DennyShimkoski&action=changes">38</a></td>
<td class="number"><a title="Display comments by DennyShimkoski (1)" href="http://wikka.jsnx.com/UserAdminTest?user=DennyShimkoski&action=comments">1</a></td>
<td class="center"><a title="Remove user DennyShimkoski" href="http://wikka.jsnx.com/UserAdminTest?user=DennyShimkoski&action=delete">delete</a> :: <a title="Send feedback to user DennyShimkoski" href="http://wikka.jsnx.com/UserAdminTest?user=DennyShimkoski&action=feedback">feedback</a></td>
</tbody>
</table>
""
**Colored columns only:** ##""{{useradmin rowcolor="0"}}""##
""
<table summary="List of users registered on this server" border="1px" id="admin_table">
<thead>
<th> </th>
<th><a href="http://wikka.jsnx.com/UserAdminTest?l=10&sort=name&d=asc" title="Sort by user name">User Name</a></th>
<th><a href="http://wikka.jsnx.com/UserAdminTest?l=10&sort=email&d=asc" title="Sort by email">Email</a></th>
<th><a href="http://wikka.jsnx.com/UserAdminTest?l=10&sort=signuptime&d=asc" title="Sort by signup time">Signup Time</a></th>
<th><a href="http://wikka.jsnx.com/UserAdminTest?l=10&sort=ipaddress&d=desc" title="Sort by signup IP">Signup IP</a></th>
<th class="number c1" title="Owned Pages"><img src="images/icons/16x16/stock_keyring.png" alt="O"/></th>
<th class="number c2" title="Page Edits"><img src="images/icons/16x16/text-editor.png" alt="E"/></th>
<th class="number c3" title="Comments"><img src="images/icons/16x16/stock_help-agent.png" alt="C"/></th>
<th class="center">Actions</th>
</thead>
<tbody>
<tr >
<td><input type="checkbox" id=" " title="Select HypeXR"/></td>
<td><a href="http://wikka.jsnx.com/HypeXR" title=" ">HypeXR</a></td>
<td>scott@xxxx.xx</td>
<td class="time">2005-08-01 09:01:54</td>
<td>XX.XX.XX.XX</td>
<td class="number c1"><a title="Display pages owned by HypeXR (1)" href="http://wikka.jsnx.com/UserAdminTest?user=HypeXR&action=owned">1</a></td>
<td class="number c2"><a title="Display page edits by HypeXR (2)" href="http://wikka.jsnx.com/UserAdminTest?user=HypeXR&action=changes">2</a></td>
<td class="number c3"><a title="Display comments by HypeXR (1)" href="http://wikka.jsnx.com/UserAdminTest?user=HypeXR&action=comments">1</a></td>
<td class="center"><a title="Remove user HypeXR" href="http://wikka.jsnx.com/UserAdminTest?user=HypeXR&action=delete">delete</a> :: <a title="Send feedback to user HypeXR" href="http://wikka.jsnx.com/UserAdminTest?user=HypeXR&action=feedback">feedback</a></td>
</tbody>
<tbody>
<tr>
<td><input type="checkbox" id=" " title="Select WiebTest"/></td>
<td>WiebTest</td>
<td>wiebren.w@xxxx.xx</td>
<td class="time">2005-07-31 19:35:26</td>
<td>XX.XX.XX.XX</td>
<td class="number c1">0</td>
<td class="number c2">0</td>
<td class="number c3">0</td>
<td class="center"><a title="Remove user WiebTest" href="http://wikka.jsnx.com/UserAdminTest?user=WiebTest&action=delete">delete</a> :: <a title="Send feedback to user WiebTest" href="http://wikka.jsnx.com/UserAdminTest?user=WiebTest&action=feedback">feedback</a></td>
</tbody>
<tbody>
<tr>
<td><input type="checkbox" id=" " title="Select DennyShimkoski"/></td>
<td><a href="http://wikka.jsnx.com/DennyShimkoski" title=" ">DennyShimkoski</a></td>
<td>denny@xxxx.xx</td>
<td class="time">2005-07-31 00:22:58</td>
<td>XX.XX.XX.XX</td>
<td class="number c1"><a title="Display pages owned by DennyShimkoski (6)" href="http://wikka.jsnx.com/UserAdminTest?user=DennyShimkoski&action=owned">6</a></td>
<td class="number c2"><a title="Display page edits by DennyShimkoski (38)" href="http://wikka.jsnx.com/UserAdminTest?user=DennyShimkoski&action=changes">38</a></td>
<td class="number c3"><a title="Display comments by DennyShimkoski (1)" href="http://wikka.jsnx.com/UserAdminTest?user=DennyShimkoski&action=comments">1</a></td>
<td class="center"><a title="Remove user DennyShimkoski" href="http://wikka.jsnx.com/UserAdminTest?user=DennyShimkoski&action=delete">delete</a> :: <a title="Send feedback to user DennyShimkoski" href="http://wikka.jsnx.com/UserAdminTest?user=DennyShimkoski&action=feedback">feedback</a></td>
</tbody>
</table>
""
**Alternate rows and colored columns:** ##""{{useradmin}}""##
""
<table summary="List of users registered on this server" border="1px" id="admin_table">
<thead>
<th> </th>
<th><a href="http://wikka.jsnx.com/UserAdminTest?l=10&sort=name&d=asc" title="Sort by user name">User Name</a></th>
<th><a href="http://wikka.jsnx.com/UserAdminTest?l=10&sort=email&d=asc" title="Sort by email">Email</a></th>
<th><a href="http://wikka.jsnx.com/UserAdminTest?l=10&sort=signuptime&d=asc" title="Sort by signup time">Signup Time</a></th>
<th><a href="http://wikka.jsnx.com/UserAdminTest?l=10&sort=ipaddress&d=desc" title="Sort by signup IP">Signup IP</a></th>
<th class="number c1" title="Owned Pages"><img src="images/icons/16x16/stock_keyring.png" alt="O"/></th>
<th class="number c2" title="Page Edits"><img src="images/icons/16x16/text-editor.png" alt="E"/></th>
<th class="number c3" title="Comments"><img src="images/icons/16x16/stock_help-agent.png" alt="C"/></th>
<th class="center">Actions</th>
</thead>
<tbody>
<tr>
<td><input type="checkbox" id=" " title="Select HypeXR"/></td>
<td><a href="http://wikka.jsnx.com/HypeXR" title=" ">HypeXR</a></td>
<td>scott@xxxx.xx</td>
<td class="time">2005-08-01 09:01:54</td>
<td>XX.XX.XX.XX</td>
<td class="number c1"><a title="Display pages owned by HypeXR (1)" href="http://wikka.jsnx.com/UserAdminTest?user=HypeXR&action=owned">1</a></td>
<td class="number c2"><a title="Display page edits by HypeXR (2)" href="http://wikka.jsnx.com/UserAdminTest?user=HypeXR&action=changes">2</a></td>
<td class="number c3"><a title="Display comments by HypeXR (1)" href="http://wikka.jsnx.com/UserAdminTest?user=HypeXR&action=comments">1</a></td>
<td class="center"><a title="Remove user HypeXR" href="http://wikka.jsnx.com/UserAdminTest?user=HypeXR&action=delete">delete</a> :: <a title="Send feedback to user HypeXR" href="http://wikka.jsnx.com/UserAdminTest?user=HypeXR&action=feedback">feedback</a></td>
</tbody>
<tbody>
<tr class="alt">
<td><input type="checkbox" id=" " title="Select WiebTest"/></td>
<td>WiebTest</td>
<td>wiebren.w@xxxx.xx</td>
<td class="time">2005-07-31 19:35:26</td>
<td>XX.XX.XX.XX</td>
<td class="number c1">0</td>
<td class="number c2">0</td>
<td class="number c3">0</td>
<td class="center"><a title="Remove user WiebTest" href="http://wikka.jsnx.com/UserAdminTest?user=WiebTest&action=delete">delete</a> :: <a title="Send feedback to user WiebTest" href="http://wikka.jsnx.com/UserAdminTest?user=WiebTest&action=feedback">feedback</a></td>
</tbody>
<tbody>
<tr>
<td><input type="checkbox" id=" " title="Select DennyShimkoski"/></td>
<td><a href="http://wikka.jsnx.com/DennyShimkoski" title=" ">DennyShimkoski</a></td>
<td>denny@xxxx.xx</td>
<td class="time">2005-07-31 00:22:58</td>
<td>XX.XX.XX.XX</td>
<td class="number c1"><a title="Display pages owned by DennyShimkoski (6)" href="http://wikka.jsnx.com/UserAdminTest?user=DennyShimkoski&action=owned">6</a></td>
<td class="number c2"><a title="Display page edits by DennyShimkoski (38)" href="http://wikka.jsnx.com/UserAdminTest?user=DennyShimkoski&action=changes">38</a></td>
<td class="number c3"><a title="Display comments by DennyShimkoski (1)" href="http://wikka.jsnx.com/UserAdminTest?user=DennyShimkoski&action=comments">1</a></td>
<td class="center"><a title="Remove user DennyShimkoski" href="http://wikka.jsnx.com/UserAdminTest?user=DennyShimkoski&action=delete">delete</a> :: <a title="Send feedback to user DennyShimkoski" href="http://wikka.jsnx.com/UserAdminTest?user=DennyShimkoski&action=feedback">feedback</a></td>
</tbody>
</table>
""
CategoryDevelopmentActions CategoryDevelopmentAdmin
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki