diff options
Diffstat (limited to 'plugins/Live/API.php')
-rw-r--r-- | plugins/Live/API.php | 254 |
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 } } } + } |