From ea406542538d2dc7923b301f3fc12fc20f35fd76 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Sun, 16 Sep 2007 15:37:33 +0000 Subject: [PATCH] qhoxie: Statistics controller added for global reporting functions, pageview datatype for recording hit data (merged from branches/gsoc) git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@42097 467b73ca-7a2a-4603-9d3b-597d59a354a9 --- core/control/ContentController.php | 5 +- core/control/Statistics.php | 332 +++++++++++++++++++++++++++++ core/model/PageView.php | 93 ++++++++ 3 files changed, 429 insertions(+), 1 deletion(-) create mode 100644 core/control/Statistics.php create mode 100644 core/model/PageView.php diff --git a/core/control/ContentController.php b/core/control/ContentController.php index 62a4c7bfe..586e10fdc 100644 --- a/core/control/ContentController.php +++ b/core/control/ContentController.php @@ -71,6 +71,9 @@ class ContentController extends Controller { public function init() { parent::init(); + //Log page views + Statistics::Collect(); + // If we've accessed the homepage as /home/, then we should redirect to /. if($this->dataRecord && RootURLController::should_be_on_root($this->dataRecord) && !$this->urlParams['Action'] && !$_POST && !$_FILES) { $getVars = $_GET; @@ -411,4 +414,4 @@ HTML } -?> \ No newline at end of file +?> diff --git a/core/control/Statistics.php b/core/control/Statistics.php new file mode 100644 index 000000000..2d74d9789 --- /dev/null +++ b/core/control/Statistics.php @@ -0,0 +1,332 @@ + + +END; + + $ds = "var tchartdata = { \n"; + + foreach($table as $class) { + $record = DataObject::get($class, "", "Created DESC"); + $total = $record->TotalItems(); + + $props = $record->toArray(); + $props = $props[0]->toMap(); + $startyear = new DateTime($props['Created']); + $startyear = $startyear->Format('Y'); + $startmonth = new DateTime($props['Created']); + $startmonth = $startmonth->Format('m'); + + if($filter == "day") { + $days = new DateTime($props['Created']); + $days = $days->Format('t'); + + $sum = 0; + + $ds .= "{$class}Set: ["; + + for($i = 1; $i <= $days; $i++) { + + foreach($record as $v) { + $props = $v->toMap(); + $currdate = new DateTime($props['Created']); + $curryear = $currdate->Format('Y'); + $currmonth = $currdate->Format('m'); + $currday = $currdate->Format('j'); + if($curryear == $startyear && $currmonth == $startmonth && $currday == $i) { + $sum++; + } + } + + $ds .= "[".($i-1).", {$sum}], "; + + } + $ds .= "[]],\n"; + + + } else if($filter == "month") { + + $sum = 0; + + $ds .= "{$class}Set: ["; + + for($i = 0; $i <= 11; $i++) { + $imonth = date('F', mktime(0,0,0,$i+1,1,1)); + + foreach($record as $v) { + $props = $v->toMap(); + $currdate = new DateTime($props['Created']); + $curryear = $currdate->Format('Y'); + $currmonth = $currdate->Format('m'); + $currday = $currdate->Format('j'); + if($curryear == $startyear && $currmonth == $i) { + $sum++; + } + } + + $ds .= "[{$i}, {$sum}], "; + + } + + $ds .= "[]],\n"; + + + + } + } + + $xt = "xTicks: ["; + if($filter == "month") { + for($i = 0; $i <= 11; $i++) { + $imonth = date('F', mktime(0,0,0,$i+1,1,1)); + $xt .= "{v:{$i}, label:'{$imonth}'}, "; + } + } else if($filter == "day") { + for($i = 1; $i <= $days; $i++) { + $xt .= "{v:".($i-1).", label:'{$i}'}, "; + } + + } + + $opts = << + + + + + +END; + $bod = ""; + foreach($records as $x) { + $r = $x->toMap(); + $id = $r['ID']; + $email = $r['Email']; + $date = date("F j, Y G:i:s", strtotime($r['Created'])); + $bod .= ""; + } + $bot = << +
IDEmailJoined
$id$email$date
+ +END; + //$js = "\n\n\n"; + return $top . $bod . $bot; + } + + static function Collect() { + $hit = new PageView(); + $hit->record(); + return; + } + + static function getRecentViews($limit = 15) { + $records = DataObject::get('PageView', null, 'Created DESC', null, $limit); + $top = << + + + + + +END; + $bod = ""; + foreach($records as $x) { + $r = $x->toMap(); + $id = $r['ID']; + $time = $r['Created']; + $browser = $r['Browser'] . " " . $r['BrowserVersion']; + $os = $r['OS']; + $user = $r['UserID']; + $page = $r['PageID']; + $bod .= ""; + } + $bot = << +
IDTimeBrowserOSUserPage
$id$time$browser$os$user$page
+ +END; + return $top . $bod . $bot; + } + + static function getViews($time = 'all') { + switch($time) { + case 'all': + $records = DataObject::get('PageView'); + break; + case 'year': + $pt = time() - 31556926; + $pt = date("Y-m-d H:i:s", $pt); + $ct = time() + 10; + $ct = date("Y-m-d H:i:s", $ct); + $records = DataObject::get('PageView', "Created >= '$pt' AND Created <= '$ct'"); + break; + case 'month': + $pt = time() - 2629744; + $pt = date("Y-m-d H:i:s", $pt); + $ct = time() + 10; + $ct = date("Y-m-d H:i:s", $ct); + $records = DataObject::get('PageView', "Created >= '$pt' AND Created <= '$ct'"); + break; + case 'week': + $pt = time() - 604800; + $pt = date("Y-m-d H:i:s", $pt); + $ct = time() + 10; + $ct = date("Y-m-d H:i:s", $ct); + $records = DataObject::get('PageView', "Created >= '$pt' AND Created <= '$ct'"); + break; + case 'day': + $pt = time() - 86400; + $pt = date("Y-m-d H:i:s", $pt); + $ct = time() + 10; + $ct = date("Y-m-d H:i:s", $ct); + $records = DataObject::get('PageView', "Created >= '$pt' AND Created <= '$ct'"); + break; + case 'hour': + $pt = time() - 3600; + $pt = date("Y-m-d H:i:s", $pt); + $ct = time() + 10; + $ct = date("Y-m-d H:i:s", $ct); + $records = DataObject::get('PageView', "Created >= '$pt' AND Created <= '$ct'"); + break; + case 'minute': + $pt = time() - 60; + $pt = date("Y-m-d H:i:s", $pt); + $ct = time() + 10; + $ct = date("Y-m-d H:i:s", $ct); + $records = DataObject::get('PageView', "Created >= '$pt' AND Created <= '$ct'"); + break; + default: + $records = DataObject::get('PageView'); + } + $top = << + + + + + +END; + $bod = ""; + foreach($records as $x) { + $r = $x->toMap(); + $id = $r['ID']; + $time = $r['Created']; + $browser = $r['Browser'] . " " . $r['BrowserVersion']; + $os = $r['OS']; + $user = $r['UserID']; + $page = $r['PageID']; + $bod .= ""; + } + $bot = << +
IDTimeBrowserOSUserPage
$id$time$browser$os$user$page
+ +END; + return $top . $bod . $bot; + } + + static function BrowserChart($type = "Pie", $color = "blue") { + $top = << + + +END; + + $ds = "var bchartdata = { \n'Set': ["; + + $records = DataObject::get('PageView'); + $browsers = array(); + foreach($records as $r) { + $ra = $r->toMap(); + $cb = $ra['Browser'] . " " . $ra['BrowserVersion']; + if($browsers[$cb] >= 1) { + $browsers[$cb]++; + } else { + $browsers[$cb] = 1; + } + } + + $xt = "xTicks: ["; + $i = 0; + foreach($browsers as $bn => $bc) { + $ds .= "[{$i}, {$bc}], "; + $xt .= "{v:" . $i . ", label:'" . $bn . "'}, "; + $i++; + } + $ds .= "]\n"; + + $opts = << diff --git a/core/model/PageView.php b/core/model/PageView.php new file mode 100644 index 000000000..11f0d6830 --- /dev/null +++ b/core/model/PageView.php @@ -0,0 +1,93 @@ + "Varchar(255)", + "Browser" => "Varchar(255)", + "BrowserVersion" => "Decimal", + "FromExternal" => "Boolean", + "Referrer" => "Varchar(255)", + "SearchEngine" => "Boolean", + "Keywords" => "Varchar(255)", + "OS" => "Varchar(255)" + ); + + static $has_one = array( + "Page" => "SiteTree", + "User" => "Member" + ); + + static $has_many = array(); + + static $many_many = array(); + + static $belongs_many_many = array(); + + static $defaults = array(); + + protected $hitdata; + + function init() { + $this->hitdata = get_browser(null, true); + } + + function record() { + $this->init(); + $this->setBrowser(); + $this->setOS(); + $this->setUserID(); + $this->setPageID(); + $this->setIP(); + $this->write(true); + } + + function sanitize($str) { + //TODO + return $str; + } + + function setBrowser() { + $this->setField('Browser', $this->hitdata['browser']); + $this->setField('BrowserVersion', $this->hitdata['version']); + } + + function setOS() { + $this->setField('OS', $this->hitdata['platform']); + } + + function setUserID() { + $isLogged = Session::get('loggedInAs'); + if($isLogged) { + $id = $isLogged; + } else { + $id = -1; + } + $this->setField('UserID', $id); + } + + function setPageID() { + $currentPage = Director::currentPage(); + $this->setField('PageID', $currentPage->ID); + } + + function setIP() { + if ($_SERVER['HTTP_X_FORWARDED_FOR']){ + $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; + } else { + $ip = $_SERVER['REMOTE_ADDR']; + } + $this->setField('IP', $ip); + } + +} + + +?>