Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/Live/API.php')
-rw-r--r--plugins/Live/API.php254
1 files changed, 198 insertions, 56 deletions
diff --git a/plugins/Live/API.php b/plugins/Live/API.php
index 8f688ff23b..b6439a143f 100644
--- a/plugins/Live/API.php
+++ b/plugins/Live/API.php
@@ -11,136 +11,277 @@
*/
/**
- *
+ * @see plugins/Referers/functions.php
+ */
+require_once PIWIK_INCLUDE_PATH . '/plugins/Live/Visitor.php';
+
+/**
* @package Piwik_Live
*/
-class Piwik_Live_API
+class Piwik_Live_API
{
static private $instance = null;
-
/*
* @return Piwik_Live_API
*/
static public function getInstance()
{
if (self::$instance == null)
- {
+ {
$c = __CLASS__;
self::$instance = new $c();
}
return self::$instance;
}
+
+ const TYPE_FETCH_VISITS = 1;
+ const TYPE_FETCH_PAGEVIEWS = 2;
/*
* @return Piwik_DataTable
*/
- public function getLastVisitForVisitor( $visitorId, $idSite = null )
+ public function getLastVisitForVisitor( $visitorId, $idSite )
{
- return $this->getLastVisitsForVisitor($visitorId, $idSite, 1);
+ return $this->getLastVisitsForVisitor($visitorId, $idSite, $limit = 1);
}
-
+
/*
* @return Piwik_DataTable
*/
public function getLastVisitsForVisitor( $visitorId, $idSite, $limit = 10 )
{
- if(is_null($idSite))
- {
- Piwik::checkUserIsSuperUser();
- }
- else
- {
- Piwik::checkUserHasViewAccess($idSite);
- }
- $visitorDetails = self::loadLastVisitorDetailsFromDatabase($visitorId, $idSite, $limit);
- $table = self::getCleanedVisitorsFromDetails($visitorDetails);
+ Piwik::checkUserHasViewAccess($idSite);
+ $visitorDetails = $this->loadLastVisitorDetailsFromDatabase($idSite, $visitorId, $limit);
+ $table = $this->getCleanedVisitorsFromDetails($visitorDetails, $idSite);
return $table;
}
/*
* @return Piwik_DataTable
*/
- public function getLastVisits( $idSite = false, $limit = 10, $minIdVisit = false )
+ public function getLastVisits( $idSite, $limit = 10, $minIdVisit = false )
{
- if(is_null($idSite))
- {
- Piwik::checkUserIsSuperUser();
- }
- else
- {
- Piwik::checkUserHasViewAccess($idSite);
- }
- $visitorDetails = self::loadLastVisitorDetailsFromDatabase(null, $idSite, $limit, $minIdVisit);
- $table = self::getCleanedVisitorsFromDetails($visitorDetails);
+ Piwik::checkUserHasViewAccess($idSite);
+ $visitorDetails = $this->loadLastVisitorDetailsFromDatabase($idSite, $visitorId = null, $limit, $minIdVisit);
+ $table = $this->getCleanedVisitorsFromDetails($visitorDetails, $idSite);
return $table;
}
+
+ /*
+ * @return Piwik_DataTable
+ */
+ public function getLastVisitsDetails( $idSite, $limit = 1000, $minIdVisit = false )
+ {
+ Piwik::checkUserHasViewAccess($idSite);
+ $visitorDetails = $this->loadLastVisitorDetailsFromDatabase($idSite, $visitorId = null, $limit, $minIdVisit);
+ $dataTable = $this->getCleanedVisitorsFromDetails($visitorDetails, $idSite);
+ return $dataTable;
+ }
+
+
+ /*
+ * @return Piwik_DataTable
+ */
+ public function getUsersInLastXMin( $idSite, $minutes = 30 )
+ {
+ Piwik::checkUserHasViewAccess($idSite);
+ $visitorData = $this->loadLastVisitorInLastXTimeFromDatabase($idSite, $minutes, $days = 0, self::TYPE_FETCH_VISITS);
+ return $visitorData;
+ }
+
+ /*
+ * @return Piwik_DataTable
+ */
+ public function getUsersInLastXDays( $idSite, $days = 10 )
+ {
+ Piwik::checkUserHasViewAccess($idSite);
+ $visitorData = $this->loadLastVisitorInLastXTimeFromDatabase($idSite, $minutes = 0, $days, self::TYPE_FETCH_VISITS);
+ return $visitorData;
+ }
+
+ /*
+ * @return array
+ */
+ public function getPageImpressionsInLastXDays($idSite, $days = 10)
+ {
+ Piwik::checkUserHasViewAccess($idSite);
+ $visitorData = $this->loadLastVisitorInLastXTimeFromDatabase($idSite, $minutes = 0, $days, self::TYPE_FETCH_PAGEVIEWS);
+ return $visitorData;
+ }
+
+ /*
+ * @return array
+ */
+ public function getPageImpressionsInLastXMin($idSite, $minutes = 30)
+ {
+ Piwik::checkUserHasViewAccess($idSite);
+ $visitorData = $this->loadLastVisitorInLastXTimeFromDatabase($idSite, $minutes, $days = 0, self::TYPE_FETCH_PAGEVIEWS);
+ return $visitorData;
+ }
/*
* @return Piwik_DataTable
*/
- static private function getCleanedVisitorsFromDetails($visitorDetails)
+ private function getCleanedVisitorsFromDetails($visitorDetails, $idSite)
{
$table = new Piwik_DataTable();
+
foreach($visitorDetails as $visitorDetail)
{
- self::cleanVisitorDetails($visitorDetail);
+ $this->cleanVisitorDetails($visitorDetail);
$visitor = new Piwik_Live_Visitor($visitorDetail);
$visitorDetailsArray = $visitor->getAllVisitorDetails();
- $dateTimeVisit = Piwik_Date::factory($visitorDetailsArray['firstActionTimestamp']);
- //TODO TO FIX
+
+ $site = new Piwik_Site($idSite);
+ $timezone = $site->getTimezone();
+ $dateTimeVisit = Piwik_Date::factory($visitorDetailsArray['firstActionTimestamp'], $timezone);
$visitorDetailsArray['serverDatePretty'] = $dateTimeVisit->getLocalized('%shortDay% %day% %shortMonth%');
$visitorDetailsArray['serverTimePretty'] = $dateTimeVisit->getLocalized('%time%');
+
+ // get Detail - 100 single SQL Statements - Performance Issue
+ $idvisit = $visitorDetailsArray['idVisit'];
+
+ $sql = "
+ SELECT DISTINCT " .Piwik_Common::prefixTable('log_action').".name AS pageUrl
+ FROM " .Piwik_Common::prefixTable('log_link_visit_action')."
+ INNER JOIN " .Piwik_Common::prefixTable('log_action')."
+ ON " .Piwik_Common::prefixTable('log_link_visit_action').".idaction_url = " .Piwik_Common::prefixTable('log_action').".idaction
+ WHERE " .Piwik_Common::prefixTable('log_link_visit_action').".idvisit = $idvisit;
+ ";
+
+ $visitorDetailsArray['actionDetails'] = Piwik_FetchAll($sql);
+
+ $sql = "
+ SELECT DISTINCT " .Piwik_Common::prefixTable('log_action').".name AS pageUrl
+ FROM " .Piwik_Common::prefixTable('log_link_visit_action')."
+ INNER JOIN " .Piwik_Common::prefixTable('log_action')."
+ ON " .Piwik_Common::prefixTable('log_link_visit_action').".idaction_name = " .Piwik_Common::prefixTable('log_action').".idaction
+ WHERE " .Piwik_Common::prefixTable('log_link_visit_action').".idvisit = $idvisit;
+ ";
+
+ $visitorDetailsArray['actionDetailsTitle'] = Piwik_FetchAll($sql);
$table->addRowFromArray( array(Piwik_DataTable_Row::COLUMNS => $visitorDetailsArray));
}
+
return $table;
}
-
+
/*
* @return array
*/
- private function loadLastVisitorDetailsFromDatabase($visitorId = null, $idSite = null, $limit = null, $minIdVisit = false )
+ private function loadLastVisitorDetailsFromDatabase($idSite, $visitorId = null, $limit = null, $minIdVisit = false )
{
$where = $whereBind = array();
-
- if(!is_null($idSite))
- {
- $where[] = " idsite = ? ";
- $whereBind[] = $idSite;
- }
-
- if(!is_null($visitorId))
+
+ $where[] = Piwik_Common::prefixTable('log_visit') . ".idsite = ? ";
+ $whereBind[] = $idSite;
+
+ if(!empty($visitorId))
{
- $where[] = " visitor_idcookie = ? ";
+ $where[] = Piwik_Common::prefixTable('log_visit') . ".visitor_idcookie = ? ";
$whereBind[] = $visitorId;
}
-
- if(!is_null($minIdVisit))
+
+ if(!empty($minIdVisit))
{
- $where[] = " idvisit > ? ";
+ $where[] = Piwik_Common::prefixTable('log_visit') . ".idvisit > ? ";
$whereBind[] = $minIdVisit;
}
-
+
$sqlWhere = "";
if(count($where) > 0)
{
$sqlWhere = " WHERE " . join(' AND ', $where);
}
-
- $sql = "SELECT *
- FROM " . Piwik::prefixTable('log_visit') . "
- $sqlWhere
- ORDER BY idvisit DESC
+
+ $sql = "SELECT " . Piwik_Common::prefixTable('log_visit') . ".* ,
+ " . Piwik_Common::prefixTable ( 'goal' ) . ".match_attribute
+ FROM " . Piwik_Common::prefixTable('log_visit') . "
+ LEFT JOIN ".Piwik_Common::prefixTable('log_conversion')."
+ ON " . Piwik_Common::prefixTable('log_visit') . ".idvisit = " . Piwik_Common::prefixTable('log_conversion') . ".idvisit
+ LEFT JOIN ".Piwik_Common::prefixTable('goal')."
+ ON (" . Piwik_Common::prefixTable('goal') . ".idsite = " . Piwik_Common::prefixTable('log_visit') . ".idsite
+ AND " . Piwik_Common::prefixTable('goal') . ".idgoal = " . Piwik_Common::prefixTable('log_conversion') . ".idgoal)
+ AND " . Piwik_Common::prefixTable('goal') . ".deleted = 0
+ $sqlWhere
+ ORDER BY idsite,idvisit DESC
LIMIT $limit";
-
+
return Piwik_FetchAll($sql, $whereBind);
}
- /*
+ /**
+ * Load last Visitors PAGES or DETAILS in MINUTES or DAYS from database
*
+ * @param int $idSite
+ * @param int $minutes
+ * @param int $days
+ * @param int $type self::TYPE_FETCH_VISITS or self::TYPE_FETCH_PAGEVIEWS
+ *
+ * @return mixed
+ */
+ private function loadLastVisitorInLastXTimeFromDatabase($idSite, $minutes = 0, $days = 0, $type = false )
+ {
+ $where = $whereBind = array();
+
+ $where[] = " " . Piwik_Common::prefixTable('log_visit') . ".idsite = ? ";
+ $whereBind[] = $idSite;
+
+ if($minutes != 0)
+ {
+ $timeLimit = mktime(date("H"), date("i") - $minutes, 0, date("m"), date("d"), date("Y"));
+ $where[] = " visit_last_action_time > '".date('Y-m-d H:i:s',$timeLimit)."'";
+ }
+
+ if($days != 0)
+ {
+ $timeLimit = mktime(0, 0, 0, date("m"), date("d") - $days + 1, date("Y"));
+ $where[] = " visit_last_action_time > '".date('Y-m-d H:i:s', $timeLimit)."'";
+ }
+
+ $sqlWhere = "";
+ if(count($where) > 0)
+ {
+ $sqlWhere = " WHERE " . join(' AND ', $where);
+ }
+
+ // Details
+ if($type == self::TYPE_FETCH_VISITS)
+ {
+ $sql = "SELECT " . Piwik_Common::prefixTable('log_visit') . ".idvisit
+ FROM " . Piwik_Common::prefixTable('log_visit') . "
+ $sqlWhere
+ ORDER BY idsite,idvisit DESC";
+ }
+ // Pages
+ elseif($type == self::TYPE_FETCH_PAGEVIEWS)
+ {
+ $sql = "SELECT " . Piwik_Common::prefixTable('log_link_visit_action') . ".idaction_url
+ FROM " . Piwik_Common::prefixTable('log_link_visit_action') . "
+ INNER JOIN " . Piwik_Common::prefixTable('log_visit') . "
+ ON " . Piwik_Common::prefixTable('log_visit') . ".idvisit = " . Piwik_Common::prefixTable('log_link_visit_action') . ".idvisit
+ $sqlWhere";
+ }
+ else
+ {
+ // no $type is set --> ERROR
+ throw new Exception("type parameter is not properly set.");
+ }
+
+ // return $sql by fetching
+ return Piwik_FetchAll($sql, $whereBind);
+ }
+
+
+ /**
+ * Removes fields that are not meant to be displayed (md5 config hash)
+ * Or that the user should only access if he is super user (cookie, IP)
+ *
+ * @return void
*/
- static private function cleanVisitorDetails( &$visitorDetails )
+ private function cleanVisitorDetails( &$visitorDetails )
{
- $toUnset = array('config_md5config');
+ $toUnset = array('config_md5config');
if(!Piwik::isUserIsSuperUser())
{
$toUnset[] = 'visitor_idcookie';
@@ -154,4 +295,5 @@ class Piwik_Live_API
}
}
}
+
}