|
<?php |
|
|
|
|
|
// |
|
// Open Web Analytics - An Open Source Web Analytics Framework |
|
// |
|
// Copyright 2006 Peter Adams. All rights reserved. |
|
// |
|
// Licensed under GPL v2.0 http://www.gnu.org/copyleft/gpl.html |
|
// |
|
// Unless required by applicable law or agreed to in writing, software |
|
// distributed under the License is distributed on an "AS IS" BASIS, |
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
// See the License for the specific language governing permissions and |
|
// limitations under the License. |
|
// |
|
// $Id$ |
|
// |
|
|
|
require_once(OWA_BASE_DIR.'/owa_lib.php'); |
|
require_once(OWA_BASE_DIR.'/owa_controller.php'); |
|
require_once(OWA_BASE_DIR.DIRECTORY_SEPARATOR.'ini_db.php'); |
|
|
|
/** |
|
* Generic Event Processor Controller |
|
* |
|
* @author Peter Adams <peter@openwebanalytics.com> |
|
* @copyright Copyright © 2006 Peter Adams <peter@openwebanalytics.com> |
|
* @license http://www.gnu.org/copyleft/gpl.html GPL v2.0 |
|
* @category owa |
|
* @package owa |
|
* @version $Revision$ |
|
* @since owa 1.0.0 |
|
*/ |
|
|
|
class owa_processEventController extends owa_controller { |
|
|
|
var $event; |
|
var $eq; |
|
|
|
function __construct($params) { |
|
|
|
if (array_key_exists('event', $params) && !empty($params['event'])) { |
|
|
|
$this->event = $params['event']; |
|
|
|
} else { |
|
owa_coreAPI::debug("No event object was passed to controller."); |
|
$this->event = owa_coreAPI::supportClassFactory('base', 'event'); |
|
} |
|
|
|
$this->eq = owa_coreAPI::getEventDispatch(); |
|
|
|
return parent::__construct($params); |
|
|
|
} |
|
|
|
/** |
|
* Main Control Logic |
|
* |
|
* @return unknown |
|
*/ |
|
function action() { |
|
|
|
return; |
|
|
|
} |
|
|
|
/** |
|
* Must be called before all other event property setting functions |
|
*/ |
|
function pre() { |
|
|
|
// Set all time related properties |
|
$this->event->setTime(); |
|
|
|
// set repeat visitor type flag visitor is not new. |
|
if ( ! $this->event->get( 'is_new_visitor' ) ) { |
|
$this->event->set( 'is_repeat_visitor', true ); |
|
} else { |
|
// properly cast this to a bool. |
|
$this->event->set( 'is_new_visitor', true ); |
|
} |
|
|
|
//set user agent |
|
if (!$this->event->get('HTTP_USER_AGENT')) { |
|
$this->event->set('HTTP_USER_AGENT', owa_coreAPI::getServerParam('HTTP_USER_AGENT')); |
|
} |
|
|
|
$this->event->set( 'HTTP_USER_AGENT', $this->eq->filter( 'user_agent', $this->event->get( 'HTTP_USER_AGENT' ) ) ); |
|
//set user agent id |
|
$this->event->set( 'ua_id', owa_lib::setStringGuid( $this->event->get( 'HTTP_USER_AGENT' ) ) ); |
|
|
|
// set referer |
|
// needed in case javascript logger sets the referer variable but is blank |
|
if ($this->event->get('referer')) { |
|
//TODO: STANDARDIZE NAME to avoid doing this map |
|
$referer = $this->event->get('referer'); |
|
} else { |
|
owa_coreAPI::debug('ref: '.owa_coreAPI::getServerParam('HTTP_REFERER')); |
|
$referer = owa_coreAPI::getServerParam('HTTP_REFERER'); |
|
} |
|
|
|
$this->event->set('HTTP_REFERER', $this->eq->filter('http_referer', $referer)); |
|
|
|
// set host |
|
if (!$this->event->get('HTTP_HOST')) { |
|
$this->event->set('HTTP_HOST', owa_coreAPI::getServerParam('HTTP_HOST')); |
|
} |
|
|
|
// set language |
|
if (!$this->event->get( 'language' ) ) { |
|
$this->event->set( 'language', $this->eq->filter('language', substr(owa_coreAPI::getServerParam( 'HTTP_ACCEPT_LANGUAGE' ),0,5 ) ) ); |
|
} |
|
|
|
$this->event->set('HTTP_HOST', $this->eq->filter('http_host', $this->event->get('HTTP_HOST'))); |
|
|
|
// set page type to unknown if not already set by caller |
|
if (!$this->event->get('page_type')) { |
|
$this->event->set('page_type', '(not set)'); |
|
} |
|
|
|
$this->event->set('page_type', $this->eq->filter('page_type', $this->event->get('page_type'))); |
|
|
|
// Set the page url or else construct it from environmental vars |
|
if (!$this->event->get('page_url')) { |
|
$this->event->set('page_url', owa_lib::get_current_url()); |
|
} |
|
|
|
$this->event->set( 'page_url', $this->eq->filter( 'page_url', $this->event->get( 'page_url' ), $this->event->get( 'site_id' ) ) ); |
|
// set document/page id |
|
$this->event->set( 'document_id', owa_lib::setStringGuid( $this->event->get( 'page_url' ) ) ); |
|
// needed? |
|
$this->event->set('inbound_page_url', $this->event->get('page_url')); |
|
|
|
// Page title |
|
if ( $this->event->get( 'page_title' ) ) { |
|
$page_title = owa_lib::utf8Encode( trim( $this->event->get( 'page_title' ) ) ); |
|
} else { |
|
$page_title = '(not set)'; |
|
} |
|
|
|
$this->event->set('page_title', $this->eq->filter( 'page_title', $page_title ) ); |
|
|
|
$page_parse = parse_url($this->event->get('page_url')); |
|
|
|
if (!array_key_exists('path', $page_parse) || empty($page_parse['path'])) { |
|
$page_parse['path'] = '/'; |
|
} |
|
|
|
if (!$this->event->get('page_uri')) { |
|
|
|
if (array_key_exists('query', $page_parse) || !empty($page_parse['query'])) { |
|
$this->event->set('page_uri', $this->eq->filter('page_uri', sprintf('%s?%s', $page_parse['path'], $page_parse['query']))); |
|
} else { |
|
$this->event->set('page_uri', $this->eq->filter('page_uri', $page_parse['path'])); |
|
} |
|
|
|
} |
|
|
|
// set internal referer |
|
if ($this->event->get('HTTP_REFERER')) { |
|
|
|
$referer_parse = parse_url($this->event->get('HTTP_REFERER')); |
|
|
|
if ($referer_parse['host'] === $page_parse['host']) { |
|
$this->event->set('prior_page', $this->eq->filter('prior_page', $this->event->get('HTTP_REFERER'), $this->event->get( 'site_id' ) ) ); |
|
} else { |
|
|
|
$this->event->set('external_referer', true); |
|
$this->event->set('referer_id', owa_lib::setStringGuid($this->event->get('HTTP_REFERER' ) ) ); |
|
|
|
if ( ! $this->event->get( 'search_terms' ) ) { |
|
// set query terms |
|
$qt = $this->extractSearchTerms($this->event->get('HTTP_REFERER')); |
|
|
|
if ($qt) { |
|
$this->event->set('search_terms', trim( strtolower( $qt ) ) ); |
|
} |
|
} |
|
} |
|
} |
|
|
|
// set referring search term id |
|
if ($this->event->get( 'search_terms' ) ) { |
|
$this->event->set('referring_search_term_id', owa_lib::setStringGuid( trim( strtolower( $this->event->get('search_terms') ) ) ) ); |
|
} |
|
|
|
// Filter the target url of clicks |
|
if ($this->event->get('target_url')) { |
|
$this->event->set('target_url', $this->eq->filter('target_url', $this->event->get('target_url'), $this->event->get( 'site_id' ) ) ); |
|
} |
|
|
|
// Set Ip Address |
|
if (!$this->event->get('ip_address')) { |
|
$this->event->set('ip_address', owa_coreAPI::getServerParam('REMOTE_ADDR')); |
|
} |
|
|
|
$this->event->set('ip_address', $this->eq->filter('ip_address', $this->event->get('ip_address'))); |
|
|
|
// Set host related properties |
|
if (!$this->event->get('REMOTE_HOST')) { |
|
$this->event->set('REMOTE_HOST', owa_coreAPI::getServerParam('REMOTE_HOST')); |
|
} |
|
// host properties |
|
$this->event->set( 'full_host', $this->eq->filter( 'full_host', |
|
$this->event->get( 'REMOTE_HOST' ), |
|
$this->event->get( 'ip_address' ) ) ); |
|
|
|
$this->event->set( 'host', $this->eq->filter( 'host', $this->event->get( 'full_host' ), $this->event->get( 'ip_address' ) ) ); |
|
// Generate host_id |
|
$this->event->set( 'host_id', owa_lib::setStringGuid( $this->event->get( 'full_host' ) ) ); |
|
|
|
// Browser related properties |
|
$service = owa_coreAPI::serviceSingleton(); |
|
$bcap = $service->getBrowscap(); |
|
|
|
// Assume browser untill told otherwise |
|
$this->event->set('is_browser',true); |
|
|
|
$this->event->set('browser_type', $this->eq->filter('browser_type', $bcap->get('Browser'))); |
|
|
|
if ($bcap->get('Version')) { |
|
$this->event->set('browser', $this->eq->filter('browser', $bcap->get('Browser') . ' ' . $bcap->get('Version'))); |
|
} else { |
|
$this->event->set('browser', $this->eq->filter('browser', $bcap->get('Browser'))); |
|
} |
|
|
|
// Set Operating System |
|
$this->event->set( 'os', $this->eq->filter( 'operating_system', $bcap->get( 'Platform' ), $this->event->get( 'HTTP_USER_AGENT' ) ) ); |
|
$this->event->set( 'os_id', owa_lib::setStringGuid( $this->event->get( 'os' ) ) ); |
|
|
|
//Check for what kind of page request this is |
|
if ($bcap->get('Crawler')) { |
|
$this->event->set('is_robot', true); |
|
$this->event->set('is_browser', false); |
|
} |
|
|
|
// feed request properties |
|
$et = $this->event->getEventType(); |
|
if ($et === 'base.feed_request') { |
|
|
|
// Feed subscription tracking code |
|
if (!$this->event->get('feed_subscription_id')) { |
|
$this->event->set('feed_subscription_id', $this->getParam(owa_coreAPI::getSetting('base', 'feed_subscription_param'))); |
|
} |
|
|
|
// needed?? |
|
$this->event->set('feed_reader_guid', $this->event->setEnvGUID()); |
|
// set feedreader flag to true, browser flag to false |
|
$this->event->set('is_feedreader', true); |
|
$this->event->set('is_browser', false); |
|
} |
|
|
|
// record and filter visitor personally identifiable info (PII) |
|
if (owa_coreAPI::getSetting('base', 'log_visitor_pii')) { |
|
|
|
$cu = owa_coreAPI::getCurrentUser(); |
|
|
|
// set user name |
|
$this->event->set('user_name', $this->eq->filter('user_name', $cu->user->get('user_id'))); |
|
|
|
// set email_address |
|
if ($this->event->get('email_address')) { |
|
$email_adress = $this->event->get('email_address'); |
|
} else { |
|
$email_address = $cu->user->get('email_address'); |
|
} |
|
|
|
$this->event->set('user_email', $this->eq->filter('user_email', $email_address)); |
|
} else { |
|
// remove ip address from event |
|
$this->event->set('ip_address', '(not set)'); |
|
} |
|
|
|
// calc days since first session |
|
$this->setDaysSinceFirstSession(); |
|
|
|
if ( $this->event->get('is_new_session') ) { |
|
//mark entry page flag on current request |
|
$this->event->set( 'is_entry_page', true ); |
|
|
|
// mark event type as first_page_request. Necessary????? |
|
//$this->event->setEventType('base.first_page_request'); |
|
|
|
// if this is not the first sessio nthen calc days sisne last session |
|
if ($this->event->get('last_req')) { |
|
$this->event->set('days_since_prior_session', round(($this->event->get('timestamp') - $this->event->get('last_req'))/(3600*24))); |
|
} |
|
|
|
if ( ! $this->event->get('medium') ) { |
|
$this->setMedium(); |
|
} |
|
|
|
if ( ! $this->event->get('source') ) { |
|
$this->setSource(); |
|
} |
|
|
|
} |
|
|
|
if ( $this->event->get( 'source' ) ) { |
|
$this->event->set( 'source_id', owa_lib::setStringGuid( trim( strtolower( $this->event->get( 'source' ) ) ) ) ); |
|
} |
|
|
|
if ( $this->event->get( 'campaign' ) ) { |
|
$this->event->set( 'campaign_id', owa_lib::setStringGuid( trim( strtolower( $this->event->get( 'campaign' ) ) ) ) ); |
|
} |
|
|
|
if ( $this->event->get( 'ad' ) ) { |
|
$this->event->set( 'ad_id', owa_lib::setStringGuid( trim( strtolower( $this->event->get( 'ad' ) ) ) ) ); |
|
} |
|
} |
|
|
|
function post() { |
|
|
|
return $this->addToEventQueue(); |
|
|
|
} |
|
|
|
/** |
|
* Log request properties of the first hit from a new visitor to a special cookie. |
|
* |
|
* This is used to determine if the request is made by an actual browser instead |
|
* of a robot with spoofed or unknown user agent. |
|
* |
|
* @access public |
|
*/ |
|
function log_first_hit() { |
|
|
|
$state_name = owa_coreAPI::getSetting('base', 'first_hit_param'); |
|
$this->event->set('event_type', 'base.first_page_request'); |
|
return owa_coreAPI::setState($state_name, '', $this->event->getProperties(), 'cookie', true); |
|
} |
|
|
|
function addToEventQueue() { |
|
|
|
if (!$this->event->get('do_not_log')) { |
|
// pass event to handlers but filter it first |
|
$this->eq->asyncNotify($this->eq->filter('post_processed_tracking_event', $this->event)); |
|
return owa_coreAPI::debug('Logged '.$this->event->getEventType().' to event queue with properties: '.print_r($this->event->getProperties(), true)); |
|
} else { |
|
owa_coreAPI::debug("Not logging event due to 'do not log' flag being set."); |
|
} |
|
|
|
} |
|
|
|
/** |
|
* Parses query terms from referer |
|
* |
|
* @param string $referer |
|
* @return string |
|
* @access private |
|
*/ |
|
function extractSearchTerms($referer) { |
|
|
|
/* Look for query_terms */ |
|
$db = new ini_db(owa_coreAPI::getSetting('base', 'query_strings.ini')); |
|
|
|
$match = $db->match($referer); |
|
|
|