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 = <<
+
+
+ ID | Email | Joined |
+
+
+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 .= "$id | $email | $date |
";
+ }
+ $bot = <<
+
+
+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 = <<
+
+
+ ID | Time | Browser | OS | User | Page |
+
+
+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 .= "$id | $time | $browser | $os | $user | $page |
";
+ }
+ $bot = <<
+
+
+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 = <<
+
+
+ ID | Time | Browser | OS | User | Page |
+
+
+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 .= "$id | $time | $browser | $os | $user | $page |
";
+ }
+ $bot = <<
+
+
+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);
+ }
+
+}
+
+
+?>