see also: TRBCounter

Most Visited Pages

version 0.3

This is a script based on MostVisited action by George Petsagourakis. It adds new functionality compared to the original version, but is compatible with it (both versions show exactly the same results).
To use this script you need to install this page hit counter (TRBCounter) add-on first. You could also go with its predecessor, GmBowenCounter, but that is not fully compatible and provides less functions. For more details on the incompatibility see TRBCounter description.

This code is tested on Wikka and unstable

What's new in this version

0.3 (since 0.2)

0.2 (since 0.1)

0.1 (since the original release by George Petsagourakis)



1. How to set this up

All you need to do is create an action file mostvisited.php in a proper place.
For an unstable Wikka this will be actions/mostvisited/mostvisited.php.
For Wikka this will be actions/mostvisited.php.

 * Display a list of most visited pages.
 * @package     Actions
 * @name        MostVisited
 * @license GNU General Public License
 * @filesource
 * @author      {@link George Petsagourakis} (first version)
 * @author      {@link Krzysztof Trybowski} (later changes)
 * @date        06 Feb 2008
 * @description     This file assumes that you are running the counter.php by GmBowen or TRBCounter on your Wakka

// Default translation entries
if (!defined('MOSTVISITED_HEADING'))  define('MOSTVISITED_HEADING', 'Most visited pages');
if (!defined('MV_RANK'))  define('MV_RANK', 'Rank');
if (!defined('MV_PAGENAME'))  define('MV_PAGENAME', 'Page name');
if (!defined('MV_PAGENAME_WITH_OWNER'))  define('MV_PAGENAME_WITH_OWNER', 'Page name (page owner)');
if (!defined('MV_CURRENT_VERSION_HITS'))  define('MV_CURRENT_VERSION_HITS', 'Current<br> version hits');
if (!defined('MV_TOTAL_HITS'))  define('MV_TOTAL_HITS', 'Total hits');
if (!defined('MV_LAST_VISITED'))  define('MV_LAST_VISITED', 'Last visited');
if (!defined('MV_LAST_VISITED_UNKNOWN'))  define('MV_LAST_VISITED_UNKNOWN', '(unknown)');
if (!defined('MV_OWNER'))  define('MV_OWNER', 'Owner');  //not used yet
if (!defined('MV_NOT_OWNED'))  define('MV_NOT_OWNED', 'not owned');
if (!defined('MV_PUBLIC_OWNED'))  define('MV_PUBLIC_OWNED', 'public');

// Defaults for options and some checking
if ($showhits==0) $showhits = 10;
if ($limitdays<1) $limitdays = '';
if (!isset($showrank)) $showrank = true;
if (!isset($showowner)) $showowner = false;
if (!isset($showcurrent)) $showcurrent = false;
if (!isset($showtotal)) $showtotal = true;
if (!isset($showheader)) $showheader = true;
if (!isset($showlastvisited)) $showlastvisited = false;
if (!isset($class)) $class = "mostvisited_container"; else $class = $this->CleanTextNode($class);

// If we should show "last visited" column, then these addictions to a query are necessary
if ($showlastvisited or $limitdays)
    $last_visited = ", MAX(last_visited) AS last_visited ";
    $last_visited2 = ",last_visited";
    $last_visited = ""; $last_visited2 = "";

// Let's prepare a list of PageNames that should have counter disabled and shouldn't be listed
$disable_pages = explode(',',strtr($this->GetConfigValue('page_hit_counter_disable_pages'), array(" " => "", "'" => "")));
// Using a different variable for list in format expected by MySQL
$qr_disable_pages = array();
foreach ($disable_pages as $i => $v) if (!$v == '') array_push($qr_disable_pages, "'".$disable_pages[$i]."'");
if (count($qr_disable_pages) > 0) $qr_disable_pages = " WHERE tag NOT IN (".implode(", ", $qr_disable_pages).") "; else $qr_disable_pages='';

// Let's prepare a query addiction for limitdays
if ($limitdays) $qr_limit_days = " WHERE last_visited > SUBDATE(now(),".$limitdays.") "; else $qr_limit_days = '';

// Database query
$result = $this->Query("SELECT * FROM (SELECT t1.tag,owner,total_hits,current_hits".$last_visited2." FROM (SELECT * FROM (SELECT tag,SUM(hits) AS total_hits ".$last_visited." FROM ".$this->config['table_prefix']."pages ".$qr_disable_pages." GROUP BY tag) AS t0 ".$qr_limit_days." ORDER BY total_hits DESC LIMIT ".$showhits.") AS t1 INNER JOIN (SELECT tag,owner,hits AS current_hits FROM ".$this->config['table_prefix']."pages WHERE latest='Y') AS t2 ON t1.tag=t2.tag ORDER BY total_hits DESC) AS t3 WHERE total_hits > '0'");

// Creating the output
$str = "\n\n<div class=\"".$class."\">\n<h2>".MOSTVISITED_HEADING."</h2>\n";
$str .= "<table class=\"mostvisited\">\n";
if ($showheader) {
    $str .= "\t<tr>\n";
    if ($showrank) $str .= "\t\t<th class=\"rank\">".MV_RANK."</th>\n";
    if ($showowner) $str .= "\t\t<th class=\"tag\">".MV_PAGENAME_WITH_OWNER."</th>\n"; else $str .= "\t\t<th>".MV_PAGENAME."</th>\n";
    if ($showcurrent) $str .= "\t\t<th class=\"current_hits\">".MV_CURRENT_VERSION_HITS."</th>\n";
    if ($showtotal) $str .= "\t\t<th class=\"total_hits\">".MV_TOTAL_HITS."</th>\n";
    if ($showlastvisited) $str .= "\t\t<th class=\"last_visited\">".MV_LAST_VISITED."</th>\n";
    $str .= "\t</tr>\n";
$i = 1;
while($row = mysql_fetch_array($result))
    if ($i%2) $str .= "\t<tr>\n"; else $str .= "\t<tr class=\"even\">\n";
    if ($showrank) $str .= "\t\t<td class=\"rank\">".$i.". </td>\n";
    $i+=1;$str .= "\t\t<td class=\"tag\">".$this->Format("[[".$row['tag']."]]")." ";
    if ($showowner)
        if ($row['owner'] == "") $row['owner'] = "(".MV_NOT_OWNED.")"; else if ($row['owner'] == "(Public)") $row['owner'] = "(".MV_PUBLIC_OWNED.")"; else $row['owner'] = $this->Format("([[".$row['owner']."]])");
        $str .= "<span class=\"user\">".$row['owner']."</span>";
    $str .= "</td>\n";
    if ($showcurrent) $str .= "\t\t<td class=\"current_hits\">".$row['current_hits']."</td>\n";
    if ($showtotal) $str .= "\t\t<td class=\"total_hits\">".$row['total_hits']."</td>\n";
    if ($showlastvisited)
        $str .= "\t\t<td class=\"last_visited\">";
        if ($row['last_visited'] == '0000-00-00 00:00:00') $str .= MV_LAST_VISITED_UNKNOWN; else $str .= $row['last_visited'];
        $str .= "</td>\n";
    $str .= "\t</tr>\n";

$str .= "</table>\n</div>\n";

// Displaying the output
print $this->ReturnSafeHTML($str);

2. How to translate it

Add the following lines to your lang/xx/ (substitute xx for a code of your language):

 * Language constant used by the {@link mostvisited.php mostvisited} action

// mostvisited
define('MOSTVISITED_HEADING', 'Most visited pages');
define('MV_RANK', 'Rank');
define('MV_PAGENAME', 'Page name');
define('MV_PAGENAME_WITH_OWNER', 'Page name (page owner)');
define('MV_CURRENT_VERSION_HITS', 'Current<br> version hits');
define('MV_TOTAL_HITS', 'Total hits');
define('MV_OWNER', 'Owner');  //not used yet
define('MV_NOT_OWNED', 'not owned');
define('MV_PUBLIC_OWNED', 'public');
define('MV_LAST_VISITED', 'Last visited');
define('MV_LAST_VISITED_UNKNOWN', '(unknown)');

...replacing English texts with your translations.

3. How to format/skin the output

The whole output of the action is included in a div with mostvisited_containter class. It contains page title within <h2> tag and a table with mostvisited class. The while output contains classes, so it's easy to be skinned -- for details see the source.

My proposed formatting for the action (place it in yoour css/wikka.css file):

.mostvisited { margin-top: 1em; border-collapse: collapse}
.mostvisited th { background: #e3e3e3; padding: 0 0.5em; border: 1px solid #cccccc;}
.mostvisited td { background: #fafafa; padding: 0 1em; border: 1px solid #e3e3e3;}
.mostvisited .even td { background: #f0f0f0; }
.mostvisited td.rank, .mostvisited td.current_hits, .mostvisited td.total_hits  { text-align: right; }
.mostvisited .user { font-size: smaller; }

That's all folks. Best regards -- KrzysztofTrybowski

There are 2 comments on this page. [Show comments]
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki