}
@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');
@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;
$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',
$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)
$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;
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&serendipity[adminAction]=statistics"><?php echo PLUGIN_EVENT_STATISTICS_NAME; ?></a></li>
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);
<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;
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 : */
-?>