*/ define('GA_TRACKFILES', 'pdf|zip|mp3'); function googleanalytics_help($path, $arg) { switch ($path) { case 'admin/settings/googleanalytics': return t('Google Analytics is a free statistics package based on the excellent Urchin system.'); } } function googleanalytics_menu() { $items['admin/settings/googleanalytics'] = array( 'title' => 'Google Analytics', 'description' => 'Configure the settings used to generate your Google Analytics site map.', 'page callback' => 'drupal_get_form', 'page arguments' => array('googleanalytics_admin_settings'), 'access arguments' => array('administer site configuration'), 'file' => 'googleanalytics.admin.inc', 'type' => MENU_NORMAL_ITEM, ); return $items; } function googleanalytics_init() { // Use the old version of Google Analytics? $legacy_version = variable_get('googleanalytics_legacy_version', FALSE); // Add download tracking. $path = drupal_get_path('module', 'googleanalytics'); if ($trackfiles = variable_get('googleanalytics_trackfiles', GA_TRACKFILES)) { drupal_add_js(array('googleanalytics' => array('trackDownload' => $trackfiles, 'LegacyVersion' => $legacy_version)), 'setting', 'header'); drupal_add_js($path .'/downloadtracker.js', 'module', 'footer'); } } /** * Implementation of hook_footer() to insert Javascript at the end of the page. */ function googleanalytics_footer($main = 0) { global $user; $id = variable_get('googleanalytics_account', ''); // Check if we should track the currently active user's role. $track = _googleanalytics_track($user); // Don't track page views in the admin sections if ($id && (arg(0) != 'admin') && $track == TRUE) { $prefix = '://www'; // Are we on a secure page? if (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && (strtolower($_SERVER['HTTPS']) != 'off')) { $prefix = 's://ssl'; } // Use the old version of Google Analytics? $legacy_version = variable_get('googleanalytics_legacy_version', FALSE); // Add User profile segmentation values. if (is_array($profile_fields = variable_get('googleanalytics_segmentation', '')) && ($user->uid > 0)) { $p = module_invoke('profile', 'load_profile', $user); $fields = array(); foreach ($profile_fields as $field => $title) { $value = $user->$field; if (is_array($value)) { $value = implode(',', $value); } $fields[$field] = $value; } // Only show segmentation variable if there are specified fields. $segmentation = ''; if (count($fields) > 0) { if ($legacy_version) { $segmentation = '__utmSetVar('. drupal_to_js(implode(':', $fields)) .');'; } else { $segmentation = 'pageTracker._setVar('. drupal_to_js(implode(':', $fields)) .');'; } } } // Add any custom code snippets if specified. $codesnippet = variable_get('googleanalytics_codesnippet', ''); // Should a local cached copy of urchin.js or ga.js be used? if (variable_get('googleanalytics_cache', 0) && (variable_get('file_downloads', FILE_DOWNLOADS_PUBLIC) == FILE_DOWNLOADS_PUBLIC)) { if ($legacy_version) { $source = _googleanalytics_cache('http://www.google-analytics.com/urchin.js'); } else { $source = _googleanalytics_cache('http://www.google-analytics.com/ga.js'); } if (!empty($source)) { $source = base_path() . $source; } } if (!isset($source)) { if ($legacy_version) { $source = 'http'. $prefix .'.google-analytics.com/urchin.js'; } else { $source = 'http'. $prefix .'.google-analytics.com/ga.js'; } } // Site search tracking support. $url_custom = ''; if (module_exists('search') && variable_get('googleanalytics_site_search', FALSE) && arg(0) == 'search') { $keys = search_get_keys(); $url_custom = url('search/'. arg(1), array('query' => 'search='. trim($keys))); } // Surround custom urls with single quotes. if (!empty($url_custom)) { $url_custom = drupal_to_js($url_custom); } // Should the legacy code be used? if ($legacy_version) { $script = '\n"; $script .= '\n"; } else { $script = '\n"; $script .= '\n"; } return $script; } } /** * Implementation of hook_requirements(). */ function googleanalytics_requirements($phase) { $requirements = array(); if ($phase == 'runtime') { // Raise warning if Google user account has not been set yet. if (variable_get('googleanalytics_account', 'UA-') == 'UA-') { $requirements['googleanalytics'] = array( 'title' => t('Google Analytics module'), 'description' => t('Google Analytics module has not been configured yet. Please configure its settings from the Google Analytics settings page.', array('@url' => url('admin/settings/googleanalytics'))), 'severity' => REQUIREMENT_ERROR, 'value' => t('Not configured'), ); } } return $requirements; } /** * Implementation of hook_cron(). */ function googleanalytics_cron() { // Regenerate the google analytics urchin.js or ga.js every day. if (time() - variable_get('googleanalytics_last_cache', 0) >= 86400) { // Legacy google analytics version. file_delete(file_directory_path() .'/googleanalytics/urchin.js'); // New google analytics version. file_delete(file_directory_path() .'/googleanalytics/ga.js'); variable_set('googleanalytics_last_cache', time()); } } /** * Download and cache the urchin.js file locally. * @param $location * The full URL to the external javascript file. * @return mixed * The path to the local javascript file on success, boolean FALSE on failure. */ function _googleanalytics_cache($location = 'http://www.google-analytics.com/urchin.js') { $directory = file_directory_path() .'/googleanalytics'; $file_destination = $directory .'/'. basename($location); if (!file_exists($file_destination)) { $result = drupal_http_request($location); if ($result->code == 200) { // Check that the files directory is writable if (file_check_directory($directory, FILE_CREATE_DIRECTORY)) { return file_save_data($result->data, $directory .'/'. basename($location), FILE_EXISTS_REPLACE); } } } else { return $file_destination; } } /** * * @param $account * A user object containing an array of roles to check. * @return boolean * A decision on if the current user is being tracked by GAnalytics. */ function _googleanalytics_track($account) { // By default we don't track users. $track = FALSE; foreach (array_keys($account->roles) as $role) { // Add the tracking code if user is member of one role that should be tracked. if (variable_get('googleanalytics_track_'. $role, FALSE)) { $track = TRUE; } } // Handle behavior for administrative user 1. if ($account->uid == 1 && variable_get('googleanalytics_track__user1', FALSE)) { // Enable tracking of user 1 if tracking for "authenticated user" is disabled. $track = TRUE; } elseif ($account->uid == 1 && !variable_get('googleanalytics_track__user1', FALSE)) { // User 1 is a member of "authenticated user". Disable user tracking // if user 1 shouldn't be tracked, but "authenticated user" should. $track = FALSE; } return $track; }