Revision [19519]

This is an old revision of TRBCounter made by KrzysztofTrybowski on 2008-02-03 22:17:01.

 

Page Hit Counter

version 0.2

The idea

Let's count how many users read each page, so that we know what we should focus on!

The details

This code is based on GmBowenCounter and is compatible with it in terms of database structure and counter action syntax. Therefore you should be fine to update from GmBowenCounter to this one. Also MostVisited add-on should be working fine. Since the time when original version was made, many things in Wikka code changed, hence I made this description so that those who don't feel strong enough in PHP can still benefit from a counter. :)

It has been tested with Wikka 1.1.7.0 but should work with 1.1.6.3.

The basics are more or less as in original version:

What's new in this version


since TRBCounter 0.1

since the original release by GmBowen

TODO

Instructions -- how to set up a counter in your Wikka-powered site


1. Update your database schema

The xx_pages table has to have the following field added (note that xx_ should be substituted with your prefix):

`hits` int(50) NOT NULL default '0'


2. Create a file counter.lib.php

Create a file libs/counter.lib.php (feel free to choose a different location and update the file footer.php accordingly -- see point 6. below).

<?php
// Let's grab the setting
$show = strtolower($this->GetConfigValue('show_page_hit_counter'));
// Let's default to 'disabled'
if ($show == '') $show = 'disabled';
   
// If the counter isn't off and we are allowed to read the page, proceed...
if (($show != 'disabled') && ($this->HasAccess('read')))
{
    $pagetag=$this->GetPageTag();
   
    // Get hit count
    $result = mysql_query( "SELECT hits FROM ".$this->config["table_prefix"]."pages WHERE tag='$pagetag' AND latest='Y'");
    $row = mysql_fetch_array($result);
    $hit_count = $row['hits'];

    // Count is incremented if not your own page
    //  NOTE:   we are checking if handler == show: this way we prevent counter from being updated while viewing page's history.
    //      we only want to count latest versions of the page being displayed, since older versions are probably being viewed by
    //      users working on them. Hence, no point counting them. This also fixes a problem of a counter being incremented upon page editing.
    if (($this->GetHandler() == 'show') && ($this->page['latest'] == 'Y') && ($this->GetUserName() != $this->GetPageOwner($tag)))
    {
        $hit_count+=1;
        mysql_query("UPDATE `".$this->config["table_prefix"]."pages` SET `hits` = `hits` + 1 WHERE tag='$pagetag' AND latest='Y'") or die("Unable to process query: " . mysql_error());
    }

    // Should we display the counter?
    if (($show !='off' && $show !='owner') or ($show =='owner' && $this->GetUserName() == $this->GetPageOwner($tag)))
    {
        // Yes, let's see if the translation is available
        if (!defined('PAGE_HIT_COUNTER')) define('PAGE_HIT_COUNTER','Total hits:');
        // Start output of counter
        echo (":: <span class=\"counter\">"); echo PAGE_HIT_COUNTER; echo (" <span class=\"hits\">".$hit_count."</span></span>");
    }
}?>


3. Create an action file counter.php in a proper place

For an unstable Wikka 1.1.7.0 this will be actions/counter/counter.php.
For Wikka 1.1.6.3 this will be actions/counter.php.

<?php
switch(strtolower($show)) {
    case 'disabled':
    case 'disable':
        $this->SetConfigValue('show_page_hit_counter','disabled');
        break;
    case 'off':
    case 'no':
        $this->SetConfigValue('show_page_hit_counter','off');
        break;
    case 'owner':
        $this->SetConfigValue('show_page_hit_counter','owner');
        break;
    default:
        $this->SetConfigValue('show_page_hit_counter','on');
        break;
}
?>


4. Create an action file nocounter.php in a proper place (optional)

If you wish to have the possibility to easily disable counter for a given page, while counter is globally enabled, create an action file nocounter.php.
For an unstable Wikka 1.1.7.0 this will be actions/nocounter/counter.php.
For Wikka 1.1.6.3 this will be actions/nocounter.php.

<?php
$this->SetConfigValue('show_page_hit_counter','disabled');
?>


5. Preventing the reset of the counter

If you only use the above code the counter will reset to zero every time you edit a page. The following changes fix that.

5a. Editing edit.php handler
In an unstable Wikka 1.1.7.0 open a file handlers/edit/edit.php. In Wikka 1.1.6.3 open a file handlers/page/edit.php. Search for a line:
$this->SavePage($this->tag, $body, $note);

and change it to:
$this->SavePage($this->tag, $body, $note, $this->page['hits']);

It should be in line number 130 (1.1.7.0) or line number 133 (1.1.6.3).

5b. Editing the Wakka class
Open a file libs/Wakka.class.php and search for function SavePage. In my unstable Wikka 1.1.7.0 it is around line 1867. In official 1.1.6.3 it is in line 608.
Change
function SavePage($tag, $body, $note)

to
function SavePage($tag, $body, $note, $pagehits)


Just a few lines below note the line:
user    = '".mysql_real_escape_string($username)."',

and add a following line after it:
hits    = '".mysql_real_escape_string($pagehits)."',


6. Add the code to your footer.php

For an unstable Wikka 1.1.7.0 this will be templates/footer.php.
For Wikka 1.1.6.3 this will be actions/footer.php.
Search for:
<?php echo $this->FormClose(); ?>

and above it add:
<?php require_once($_SERVER["DOCUMENT_ROOT"].'libs/counter.lib.php'); ?>


7. Add translation for the 'Total hits' text (Wikka >= 1.1.7.0 only) (optional)

Open lang/xx/xx.inc.php (substitute xx for a code of your language). Search for a line beginning with define('SEARCH_LABEL', and add the following line below it:
define('PAGE_HIT_COUNTER', 'Total hits:');

...of course replacing Total hits with your translated text.

8. Add a global counter setting (optional)

Open wikka.config.php and add a line:
'show_page_hit_counter' => 'on',

Instead of 'on' you can use 'off' or 'owner'. The default is 'disabled'.

9. Edit your wikka.css file (optional)

You may change the way a counter is displayed on page, by adding lines to css/wikka.css, for example like this:
.counter {font-size: smaller;} /* influences whole counter text */
.counter .hits {font-weight: bolder;} /* influences just the number */



Please test and give feedback. Regards, --KrzysztofTrybowski

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