add ('name', PLUGIN_EVENT_GOOGLE_ANALYTICS_NAME); $propbag->add ('description', PLUGIN_EVENT_GOOGLE_ANALYTICS_DESC); $propbag->add ('stackable', false); $propbag->add ('author', 'kleinerChemiker'); $propbag->add ('version', '1.4.4'); $propbag->add ('requirements', array ('serendipity' => '0.8', 'smarty' => '2.6.7', 'php' => '4.1.0' )); $propbag->add ('groups', array ('STATISTICS' )); $propbag->add ('cachable_events', array ('frontend_display' => true )); $propbag->add ('event_hooks', array ('frontend_header' => true, 'frontend_display' => true )); $this->markup_elements = array (array ('name' => 'ENTRY_BODY', 'element' => 'body' ), array ('name' => 'EXTENDED_BODY', 'element' => 'extended' ), array ('name' => 'COMMENT', 'element' => 'comment' ), array ('name' => 'HTML_NUGGET', 'element' => 'html_nugget' ) ); $conf_array = array (); $conf_array[] = 'analytics_account_number'; $conf_array[] = 'analytics_track_adsense'; $conf_array[] = 'analytics_anonymizeIp'; $conf_array[] = 'analytics_track_external'; $conf_array[] = 'analytics_track_downloads'; $conf_array[] = 'analytics_download_extensions'; $conf_array[] = 'analytics_internal_hosts'; $conf_array[] = 'analytics_exclude_groups'; $conf_array[] = 'analytics_enh_link_attr'; foreach ( $this->markup_elements as $element ) { $conf_array[] = $element['name']; } $propbag->add ('configuration', $conf_array); } function introspect_config_item($name, &$propbag) { switch ($name) { case 'analytics_account_number' : $propbag->add ('type', 'string'); $propbag->add ('name', PLUGIN_EVENT_GOOGLE_ANALYTICS_ACCOUNT_NUMBER); $propbag->add ('description', PLUGIN_EVENT_GOOGLE_ANALYTICS_ACCOUNT_NUMBER_DESC); $propbag->add ('validate', '/^[0-9]+-[0-9]+$/'); $propbag->add ('default', ''); break; case 'analytics_track_adsense' : $propbag->add ('type', 'boolean'); $propbag->add ('name', PLUGIN_EVENT_GOOGLE_ANALYTICS_TRACK_ADSENSE); $propbag->add ('description', PLUGIN_EVENT_GOOGLE_ANALYTICS_TRACK_ADSENSE_DESC); $propbag->add ('default', 'false'); break; case 'analytics_anonymizeIp' : $propbag->add ('type', 'boolean'); $propbag->add ('name', PLUGIN_EVENT_GOOGLE_ANALYTICS_ANONYMIZEIP); $propbag->add ('description', PLUGIN_EVENT_GOOGLE_ANALYTICS_ANONYMIZEIP_DESC); $propbag->add ('default', 'false'); break; case 'analytics_track_external' : $propbag->add ('type', 'boolean'); $propbag->add ('name', PLUGIN_EVENT_GOOGLE_ANALYTICS_TRACK_EXTERNAL); $propbag->add ('description', PLUGIN_EVENT_GOOGLE_ANALYTICS_TRACK_EXTERNAL_DESC); $propbag->add ('default', 'true'); break; case 'analytics_internal_hosts' : $propbag->add ('type', 'text'); $propbag->add ('name', PLUGIN_EVENT_GOOGLE_ANALYTICS_INTERNAL_HOSTS); $propbag->add ('description', PLUGIN_EVENT_GOOGLE_ANALYTICS_INTERNAL_HOSTS_DESC); $propbag->add ('default', $_SERVER['HTTP_HOST']); break; case 'analytics_track_downloads' : $propbag->add ('type', 'boolean'); $propbag->add ('name', PLUGIN_EVENT_GOOGLE_ANALYTICS_TRACK_DOWNLOADS); $propbag->add ('description', PLUGIN_EVENT_GOOGLE_ANALYTICS_TRACK_DOWNLOADS_DESC); $propbag->add ('default', 'true'); break; case 'analytics_download_extensions' : $propbag->add ('type', 'string'); $propbag->add ('name', PLUGIN_EVENT_GOOGLE_ANALYTICS_DOWNLOAD_EXTENSIONS); $propbag->add ('description', PLUGIN_EVENT_GOOGLE_ANALYTICS_DOWNLOAD_EXTENSIONS_DESC); $propbag->add ('default', 'zip,rar'); break; case 'analytics_enh_link_attr' : $propbag->add ('type', 'boolean'); $propbag->add ('name', PLUGIN_EVENT_GOOGLE_ANALYTICS_ENH_LINK_ATTR); $propbag->add ('description', PLUGIN_EVENT_GOOGLE_ANALYTICS_ENH_LINK_ATTR_DESC); $propbag->add ('default', 'false'); break; case 'analytics_exclude_groups' : $_groups = & serendipity_getAllGroups (); if (is_array ($_groups)) { foreach ( $_groups as $group ) { $groups[$group['confkey']] = $group['confvalue']; } $propbag->add ('type', 'multiselect'); $propbag->add ('name', PLUGIN_EVENT_GOOGLE_ANALYTICS_EXCLUDE_GROUPS); $propbag->add ('description', PLUGIN_EVENT_GOOGLE_ANALYTICS_EXCLUDE_GROUPS_DESC); $propbag->add ('select_size', 5); $propbag->add ('select_values', $groups); } break; default : $propbag->add ('type', 'boolean'); $propbag->add ('name', constant ($name)); $propbag->add ('description', sprintf (APPLY_MARKUP_TO, constant ($name))); $propbag->add ('default', 'true'); } return true; } function generate_content(&$title) { $title = $this->get_config ('title'); } function install() { serendipity_plugin_api::hook_event ('backend_cache_entries', $this->title); } function uninstall(&$propbag) { serendipity_plugin_api::hook_event ('backend_cache_purge', $this->title); serendipity_plugin_api::hook_event ('backend_cache_entries', $this->title); } function trim_value(&$value) { $value = trim ($value); } function in_array_loop($array1, $array2) { if (is_array ($array1)) { foreach ( $array1 as $array ) { if (in_array ($array, $array2)) { return true; } } } return false; } function analytics_tracker_callback($matches) { static $internal_hosts = null; static $download_extensions = null; static $analytics_track_external = null; static $analytics_track_downloads = null; if ($internal_hosts === null) { $internal_hosts = explode ("\n", $this->get_config ('analytics_internal_hosts')); array_walk ($internal_hosts, array ($this, 'trim_value' )); } if ($download_extensions === null) { $download_extensions = explode (",", $this->get_config ('analytics_download_extensions')); array_walk ($download_extensions, array ($this, 'trim_value' )); } if ($analytics_track_external === null) { $analytics_track_external = serendipity_db_bool ($this->get_config ('analytics_track_external', true)); } if ($analytics_track_downloads === null) { $analytics_track_downloads = serendipity_db_bool ($this->get_config ('analytics_track_downloads', true)); } if (substr ($matches[3], 0, 4) == 'http') { $host = parse_url ('http://' . $matches[4]); preg_match ('/\.([a-z0-9]+)$/i', $host['path'], $extension); if (!in_array ($host['host'], $internal_hosts) && $analytics_track_external) { return 'get ('event_hooks'); if ($analytics_anonymizeIp === null) { $analytics_anonymizeIp = serendipity_db_bool ($this->get_config ('analytics_anonymizeIp', false)); } if ($analytics_track_adsense === null) { $analytics_track_adsense = serendipity_db_bool ($this->get_config ('analytics_track_adsense', false)); } if ($analytics_track_downloads === null) { $analytics_track_downloads = serendipity_db_bool ($this->get_config ('analytics_track_downloads', true)); } if ($analytics_track_external === null) { $analytics_track_external = serendipity_db_bool ($this->get_config ('analytics_track_external', true)); } if ($analytics_enh_link_attr === null) { $analytics_enh_link_attr = serendipity_db_bool ($this->get_config ('analytics_enh_link_attr', false)); } if ($analytics_exclude_groups === null) { $analytics_exclude_groups = explode ("^", $this->get_config ('analytics_exclude_groups', true)); if (!empty ($analytics_exclude_groups)) { $_groups = serendipity_getGroups ($serendipity['authorid']); if (is_array ($_groups)) { foreach ( $_groups as $group ) { $usergroup[] = $group['id']; } } else { $usergroup = false; } } else { $usergroup = false; } } if (isset ($hooks[$event])) { switch ($event) { case 'frontend_header' : $analytics_enh_link_attr ? $analytics_enh_link_attr_code = "var pluginUrl = '//www.google-analytics.com/plugins/ga/inpage_linkid.js'; _gaq.push(['_require', 'inpage_linkid', pluginUrl]);" : $analytics_enh_link_attr_code = ''; $analytics_anonymizeIp ? $analytics_anonymizeIp_code = "_gaq.push(['_gat._anonymizeIp']);\r " : $analytics_anonymizeIp_code = ''; $analytics_track_adsense ? $analytics_track_adsense_code = "\r\r" : $analytics_track_adsense_code = ''; if ($serendipity['authorid'] === null || !$this->in_array_loop ($usergroup, $analytics_exclude_groups)) { echo $analytics_track_adsense_code; echo ' '; } return true; break; case 'frontend_display' : if ($serendipity['authorid'] && $usergroup !== false && $this->in_array_loop ($usergroup, $analytics_exclude_groups)) { return true; } foreach ( $this->markup_elements as $temp ) { if (serendipity_db_bool ($this->get_config ($temp['name'], true)) && isset ($eventData[$temp['element']]) && !$eventData['properties']['ep_disable_markup_' . $this->instance] && !isset ($serendipity['POST']['properties']['disable_markup_' . $this->instance]) && ($analytics_track_downloads || $analytics_track_external)) { $element = $temp['element']; $eventData[$element] = preg_replace_callback ("#]*)>#isUm", array ($this, 'analytics_tracker_callback' ), $eventData[$element]); } } return true; break; default : return false; } } else { return false; } } }