]> git.mjollnir.org Git - s9y.git/commitdiff
Better and individual statistical tracking (optional) by Frederik Sandberg.
authorgarvinhicking <garvinhicking>
Sun, 21 Aug 2005 15:54:24 +0000 (15:54 +0000)
committergarvinhicking <garvinhicking>
Sun, 21 Aug 2005 15:54:24 +0000 (15:54 +0000)
Thanks a lot!

docs/NEWS
plugins/serendipity_event_statistics/serendipity_event_statistics.php

index ce6839d6ed0e2e0ceaa828ba513d7f0a0813f1c1..2a40241c45e0e2fd9e962ec23a2e82acf8989409 100644 (file)
--- a/docs/NEWS
+++ b/docs/NEWS
@@ -3,6 +3,9 @@
 Version 0.9 ()
 ------------------------------------------------------------------------
 
+    * Updated statistics plugin to track seperate visitor/referrer statistics.
+      Patch by Fredrik Sandberg, thanks a lot! (garvinhicking)
+
     * Make category selector be nicer to Opera. Load the handling functions
       only after the DOM load is completed. Add new "addLoadEvent"
       functionality for future use to stack onload events. (garvinhicking)
index 52999e91dfc200676536944d1db1adbc5be3ce1b..9d47e7413bcd235d7c1067bc73bf5b3515126eb3 100644 (file)
@@ -7,7 +7,7 @@ if (file_exists($probelang)) {
 }
 
 @define('PLUGIN_EVENT_STATISTICS_NAME', 'Statistics');
-@define('PLUGIN_EVENT_STATISTICS_DESC', 'Adds a link to interesting statistics in your entries panel');
+@define('PLUGIN_EVENT_STATISTICS_DESC', 'Adds a link to interesting statistics in your entries panel, including a visitors counter');
 @define('PLUGIN_EVENT_STATISTICS_OUT_STATISTICS', 'Statistics');
 @define('PLUGIN_EVENT_STATISTICS_OUT_FIRST_ENTRY', 'First entry');
 @define('PLUGIN_EVENT_STATISTICS_OUT_LAST_ENTRY', 'Last entry');
@@ -55,6 +55,24 @@ if (file_exists($probelang)) {
 @define('PLUGIN_EVENT_STATISTICS_MAX_ITEMS', 'Maximum items');
 @define('PLUGIN_EVENT_STATISTICS_MAX_ITEMS_DESC', 'How many items to display per statistical value? (Default: 20)');
 
+//Language constants for the Extended Visitors feature
+@define('PLUGIN_EVENT_STATISTICS_EXT_ADD', 'Extended Visitors Statistics');
+@define('PLUGIN_EVENT_STATISTICS_EXT_ADD_DESC', 'Add Extended Visitors Statistics feature? (default: no)');
+@define('PLUGIN_EVENT_STATISTICS_EXT_OPT1', 'No!');
+@define('PLUGIN_EVENT_STATISTICS_EXT_OPT2', 'Yes, at the bottom of the page');
+@define('PLUGIN_EVENT_STATISTICS_EXT_OPT3', 'Yes, at the top of the page');
+@define('PLUGIN_EVENT_STATISTICS_EXT_VISITORS', 'Nr of vistors');
+@define('PLUGIN_EVENT_STATISTICS_EXT_VISTODAY', 'Nr of vistors today');
+@define('PLUGIN_EVENT_STATISTICS_EXT_VISTOTAL', 'Total nr of vistors');
+@define('PLUGIN_EVENT_STATISTICS_EXT_VISSINCE', 'The extended visitorĀ“s statistic feature has collected data since');
+@define('PLUGIN_EVENT_STATISTICS_EXT_VISLATEST', 'Latest Visitors');
+@define('PLUGIN_EVENT_STATISTICS_EXT_TOPREFS', 'Top Referrers');
+@define('PLUGIN_EVENT_STATISTICS_EXT_TOPREFS_NONE', 'No referrers has yet been registered.');
+@define('PLUGIN_EVENT_STATISTICS_OUT_EXT_STATISTICS', 'Extended Visitor Statistics');
+@define('PLUGIN_EVENT_STATISTICS_BANNED_HOSTS', 'Ban browsers from beeing counted');
+@define('PLUGIN_EVENT_STATISTICS_BANNED_HOSTS_DESC', 'Insert browsers that should be excluded from counting, separated by "|"');
+
+        
 class serendipity_event_statistics extends serendipity_event
 {
     var $title = PLUGIN_EVENT_STATISTICS_NAME;
@@ -66,8 +84,8 @@ class serendipity_event_statistics extends serendipity_event
         $propbag->add('name',          PLUGIN_EVENT_STATISTICS_NAME);
         $propbag->add('description',   PLUGIN_EVENT_STATISTICS_DESC);
         $propbag->add('stackable',     false);
-        $propbag->add('author',        'Garvin Hicking');
-        $propbag->add('version',       '1.1');
+        $propbag->add('author',        'Garvin Hicking, Fredrik Sandberg');
+        $propbag->add('version',       '1.21');
         $propbag->add('requirements',  array(
             'serendipity' => '0.8',
             'smarty'      => '2.6.7',
@@ -76,10 +94,11 @@ class serendipity_event_statistics extends serendipity_event
         $propbag->add('groups', array('STATISTICS'));
         $propbag->add('event_hooks',    array(
             'backend_sidebar_entries' => true,
-            'backend_sidebar_entries_event_display_statistics' => true
+            'backend_sidebar_entries_event_display_statistics' => true,
+            'frontend_configure' => true
         ));
 
-        $propbag->add('configuration', array('max_items'));
+        $propbag->add('configuration', array('max_items', 'ext_vis_stat','banned_bots'));
     }
 
     function introspect_config_item($name, &$propbag)
@@ -91,6 +110,24 @@ class serendipity_event_statistics extends serendipity_event
                 $propbag->add('description', PLUGIN_EVENT_STATISTICS_MAX_ITEMS_DESC);
                 $propbag->add('default', 20);
                 break;
+                
+             
+            case 'ext_vis_stat':
+                $select = array('no' => PLUGIN_EVENT_STATISTICS_EXT_OPT1, 'yesBot' => PLUGIN_EVENT_STATISTICS_EXT_OPT2, 'yesTop' => PLUGIN_EVENT_STATISTICS_EXT_OPT3);
+                $propbag->add('type',        'select');
+                $propbag->add('name',        PLUGIN_EVENT_STATISTICS_EXT_ADD);
+                $propbag->add('description', PLUGIN_EVENT_STATISTICS_EXT_ADD_DESC);
+                $propbag->add('select_values', $select);
+                $propbag->add('default', 'no');
+
+                break;
+                
+           case 'banned_bots':
+                $propbag->add('type', 'string');
+                $propbag->add('name', PLUGIN_EVENT_STATISTICS_BANNED_HOSTS);
+                $propbag->add('description', PLUGIN_EVENT_STATISTICS_BANNED_HOSTS_DESC);
+                $propbag->add('default', 'msnbot.msn.com');
+                break;
         }
 
         return true;
@@ -107,6 +144,37 @@ class serendipity_event_statistics extends serendipity_event
 
         if (isset($hooks[$event])) {
             switch($event) {
+            
+                case 'frontend_configure':
+                    if ($this->get_config('ext_vis_stat') == 'no') {
+                        return;
+                    }
+
+                    //checking if db tables exists, otherwise install them
+                    $tableChecker = serendipity_db_query("SELECT counter_id FROM {$serendipity['dbPrefix']}visitors LIMIT 1", true);
+                    if (!is_array($tableChecker)){
+                        $this->createTables();
+                    }
+                    
+                    //Unique visitors are beeing registered and counted here. Calling function below.
+                    $sessionChecker = serendipity_db_query("SELECT count(sessID) FROM {$serendipity['dbPrefix']}visitors WHERE '".session_id()."' = sessID GROUP BY sessID", true);
+                    if ((is_array($sessionChecker)) && ($sessionChecker[0] == 0)) {
+                        
+                        // avoiding banned browsers
+                        $banned_bots = $this->get_config('banned_bots');
+                        $tmp_array = explode('|', $banned_bots);
+                        $found = 'no';
+                        for ($i=0; $i<count($tmp_array); $i++) {
+                            if (trim($tmp_array[$i]) == trim($_SERVER['HTTP_USER_AGENT'])){
+                                $found = 'yes';
+                            }
+                        } 
+                        if ($found=='no'){ 
+                            $this->countVisitor();
+                        }
+                    }
+                    
+                break;
                 case 'backend_sidebar_entries':
 ?>
                         <li><a href="?serendipity[adminModule]=event_display&amp;serendipity[adminAction]=statistics"><?php echo PLUGIN_EVENT_STATISTICS_NAME; ?></a></li>
@@ -116,11 +184,17 @@ class serendipity_event_statistics extends serendipity_event
 
                 case 'backend_sidebar_entries_event_display_statistics':
                     $max_items = $this->get_config('max_items');
+                    $ext_vis_stat = $this->get_config('ext_vis_stat');
 
                     if (!$max_items || !is_numeric($max_items) || $max_items < 1) {
                         $max_items = 20;
                     }
+                    
+                    if ($ext_vis_stat == 'yesTop') {
+                        $this->extendedVisitorStatistics($max_items);
+                    }
 
+                    
                     $first_entry    = serendipity_db_query("SELECT timestamp FROM {$serendipity['dbPrefix']}entries ORDER BY timestamp ASC limit 1", true);
                     $last_entry     = serendipity_db_query("SELECT timestamp FROM {$serendipity['dbPrefix']}entries ORDER BY timestamp DESC limit 1", true);
                     $total_count    = serendipity_db_query("SELECT count(id) FROM {$serendipity['dbPrefix']}entries", true);
@@ -421,7 +495,13 @@ class serendipity_event_statistics extends serendipity_event
     <hr />
     <?php serendipity_plugin_api::hook_event('event_additional_statistics', $eventData, array('maxitems' => $max_items)); ?>
     </div>
-<?php
+    
+    <?php
+
+                    if ($ext_vis_stat == 'yesBot') {
+                        $this->extendedVisitorStatistics($max_items);
+                    }
+
                     return true;
                     break;
 
@@ -433,7 +513,197 @@ class serendipity_event_statistics extends serendipity_event
             return false;
         }
     }
+    
+    function countVisitor(){
+        
+        global $serendipity;
+
+        $referer = $_SERVER['HTTP_REFERER'];
+        $values = array(
+            'sessID' => session_id(),
+            'day'    => date('Y-m-d'),
+            'time'   => date('H:i'),
+            'ref'    => strip_tags($referer),
+            'browser'=> strip_tags($_SERVER['HTTP_USER_AGENT']),
+            'ip'     => strip_tags($_SERVER['REMOTE_ADDR'])
+        );
+                
+        serendipity_db_insert('visitors', $values);
+                   
+        // updating the referrer-table
+        if (strlen($referer) >= 1) {
+
+            //retrieving the referrer base URL
+            $temp_array = explode('?', $referer); 
+            $urlA = $temp_array[0]; 
+    
+            //removing "http://" & trailing subdirectories
+            $temp_array3 = explode('//', $urlA);
+            $urlB = $temp_array3[1];
+            $temp_array4 = explode('/', $urlB);
+            $urlB = $temp_array4[0];
+    
+            //removing www
+            $urlC = serendipity_db_escape_string(str_replace('www.', '', $urlB));
+            
+            //updating db
+            $q = serendipity_db_query("SELECT count(refs) FROM {$serendipity['dbPrefix']}refs WHERE refs = '$urlC' GROUP BY refs", true);
+            if (!is_array($q) || $q[0] >= 1){
+                serendipity_db_query("UPDATE {$serendipity['dbPrefix']}refs SET count=count+1 WHERE (refs = '$urlC')");
+            } else {
+                serendipity_db_query("INSERT INTO {$serendipity['dbPrefix']}refs (refs, count) VALUES ('$urlC', 1)");
+            }
+        }
+            
+    } //end of function countVisitor
+    
+    
+    function extendedVisitorStatistics($max_items){
+        
+        global $serendipity;
+        
+        // ---------------QUERIES for Viewing statistics ----------------------------------------------
+        $day = date('Y-m-d');
+        $visitors_count_today = serendipity_db_query("SELECT count(counter_id) FROM {$serendipity['dbPrefix']}visitors WHERE day = '".$day."'", true);
+        $visitors_count_firstday = serendipity_db_query("SELECT day FROM {$serendipity['dbPrefix']}visitors ORDER BY counter_id ASC LIMIT 1", true);
+        $visitors_count = serendipity_db_query("SELECT count(counter_id) FROM {$serendipity['dbPrefix']}visitors", true);
+        $visitors_latest = serendipity_db_query("SELECT counter_id, day, time, ref, browser, ip FROM {$serendipity['dbPrefix']}visitors ORDER BY counter_id DESC LIMIT ".$max_items."");
+        $top_refs = serendipity_db_query("SELECT refs, count FROM {$serendipity['dbPrefix']}refs ORDER BY count DESC LIMIT ".$max_items."");
+                            
+        // ---------------STYLES for Viewing statistics ----------------------------------------------
+        echo "<style type='text/css'>";
+        echo ".colVis {text-align: center; width:600px; font-size: 10px; background-color:#dddddd;} ";
+        echo ".col1 {text-align: center; width:150px; font-size: 10px; background-color:#dddddd;} ";
+        echo ".col2 {text-align: center; width:150px; font-size: 10px;} ";
+        echo ".col4 {text-align: center; width:600px; font-size: 10px; background-color:#dddddd;} ";
+        echo ".col5 {text-align: center; width:600px; font-size: 10px;} ";
+        echo "</style>";
+
+        ?>
+        <h3><?php echo PLUGIN_EVENT_STATISTICS_OUT_EXT_STATISTICS; ?></h3>
+        <div style="margin: 5px; padding: 5px">
+        <dl>
+            <dt><?php echo PLUGIN_EVENT_STATISTICS_EXT_VISSINCE." ".$visitors_count_firstday[0].".<br /><br /><br />\n"?></dt>
+        
+            <dt><strong><?php echo PLUGIN_EVENT_STATISTICS_EXT_VISITORS; ?></strong></dt>
+                <dd>
+                    <div class="colVis">
+                    <?php 
+                    echo PLUGIN_EVENT_STATISTICS_EXT_VISTODAY.": <strong>".$visitors_count_today[0]."</strong><br />\n";
+                    echo PLUGIN_EVENT_STATISTICS_EXT_VISTOTAL.": <strong>".$visitors_count[0]."</strong><br />\n";
+                    ?>
+                    </div>
+                </dd>
+        </dl>
+                    
+        <dl>
+        
+        <dt><strong><?php echo PLUGIN_EVENT_STATISTICS_EXT_VISLATEST;?></strong></dt>
+            <dd>
+                <table>
+                    <?php
+                    $i=1;
+                    $color = "col2";
+                    if (is_array($visitors_latest)) {
+                        foreach($visitors_latest AS $key => $row) {
+                            if ($color == "col1"){$color ="col2";}else{$color ="col1";}
+                                echo "<tr>";
+                                echo "<td class = \"".$color."\">".$row['day']." ".$row['time']."</td>\n";
+                                echo "<td class = \"".$color."\">".wordwrap($row['ref'], 25, "\n", 1)."</td>\n";
+                                echo "<td class = \"".$color."\">".wordwrap($row['browser'], 25, "\n", 1)."</td>\n";
+                                echo "<td class = \"".$color."\">";
+                                if ($row['ip']){
+                                    echo wordwrap(gethostbyaddr($row['ip']), 25, "\n", 1);
+                                } else {
+                                    echo "--";
+                                }
+                                echo "</td>\n";
+                                echo "</tr>\n";
+                            }
+                        }
+                        ?>
+                </table><br />
+            </dd>
+        </dl>
+                        
+        <dl>
+        <dt><strong>
+        <?php 
+        echo PLUGIN_EVENT_STATISTICS_EXT_TOPREFS;
+        ?>
+        </strong></dt>
+            <dd>
+                <table>
+                    <?php
+                        $i=1;
+                        if (is_array($top_refs)) {
+                            foreach($top_refs AS $key => $row) {
+                                if ($color == "col4"){$color ="col5";}else{$color ="col4";}
+                                    echo "<tr><td class=\"".$color."\">".$i++.".  ".$row['refs']." (<strong>".$row['count']."</strong>)</td></tr>";
+                            }
+                        } else {
+                            echo PLUGIN_EVENT_STATISTICS_EXT_TOPREFS_NONE;
+                        }
+                        ?>
+                </table>
+            </dd>
+        </dl>
+        <hr />
+    <?php
+    } //end of function extendedVisitorStatistics()
+    
+    
+    function createTables() {
+        global $serendipity;
+        
+        //create table xxxx_visitors
+        $q   = "CREATE TABLE {$serendipity['dbPrefix']}visitors (
+            counter_id {AUTOINCREMENT} {PRIMARY},
+            sessID varchar(35) not null default '',
+            day varchar(10) not null default '',
+            time varchar(5) not null default '',
+            ref varchar(255) default null,
+            browser varchar(255) default null,
+            ip varchar(15) default null
+        )";
+
+       serendipity_db_schema_import($q);
+
+        //create table xxxx_refs
+        $q   = "CREATE TABLE {$serendipity['dbPrefix']}refs (
+            id {AUTOINCREMENT} {PRIMARY},
+            refs varchar(255) not null default '',
+            count int(11) not null default '0'
+        )";
+        serendipity_db_schema_import($q);
+        
+    } //end of function createTables()
+
+
+    function dropTables() {
+        
+        global $serendipity;
+        
+        // Drop tables
+        $q   = "DROP TABLE ".$serendipity['dbPrefix']."visitors";
+        $sql = serendipity_db_schema_import($q);
+        $q   = "DROP TABLE ".$serendipity['dbPrefix']."refs";
+        $sql = serendipity_db_schema_import($q);
+        
+    } //end of function dropTables
+    
+    function install(){
+        
+        $this->createTables();
+        
+    }
+    
+    function uninstall(){
+        
+        $this->dropTables();
+        
+    }
+    
 }
 
 /* vim: set sts=4 ts=4 expandtab : */
-?>