| 
pierre@0
 | 
     1 <?php | 
| 
pierre@0
 | 
     2 // $Id: ad.pages.inc,v 1.1.2.6 2009/02/16 23:12:28 jeremy Exp $ | 
| 
pierre@0
 | 
     3  | 
| 
pierre@0
 | 
     4 /** | 
| 
pierre@0
 | 
     5  * @file | 
| 
pierre@0
 | 
     6  * Advertisement nodes pages and forms. | 
| 
pierre@0
 | 
     7  * | 
| 
pierre@0
 | 
     8  * Copyright (c) 2005-2009. | 
| 
pierre@0
 | 
     9  *   Jeremy Andrews <jeremy@tag1consulting.com> | 
| 
pierre@0
 | 
    10  */ | 
| 
pierre@0
 | 
    11  | 
| 
pierre@0
 | 
    12 function theme_node_ad($node, $yield_form = TRUE) { | 
| 
pierre@0
 | 
    13   $output = ''; | 
| 
pierre@0
 | 
    14   if (ad_adaccess($node, 'access statistics')) { | 
| 
pierre@0
 | 
    15     $output = theme('ad_status_display', $node); | 
| 
pierre@0
 | 
    16     $output .= theme('ad_statistics_display', ad_statistics($node->nid)); | 
| 
pierre@0
 | 
    17   } | 
| 
pierre@0
 | 
    18   if (ad_adaccess($node, 'access click history')) { | 
| 
pierre@0
 | 
    19     $header = array( | 
| 
pierre@0
 | 
    20       array('data' => t('Time'), 'field' => 'timestamp', 'sort' => 'desc'), | 
| 
pierre@0
 | 
    21       array('data' => t('User'), 'field' => 'uid'), | 
| 
pierre@0
 | 
    22       array('data' => t('URL where clicked'), 'field' => 'url'), | 
| 
pierre@0
 | 
    23     ); | 
| 
pierre@0
 | 
    24     if (function_exists('click_filter_status_text') && user_access('view filtered clicks')) { | 
| 
pierre@0
 | 
    25       $header[] = array('data' => t('Status'), 'field' => 'status'); | 
| 
pierre@0
 | 
    26     } | 
| 
pierre@0
 | 
    27     $header[] = ''; | 
| 
pierre@0
 | 
    28  | 
| 
pierre@0
 | 
    29     if ($node->nid) { | 
| 
pierre@0
 | 
    30       $sql = "SELECT cid, timestamp, uid, status, url FROM {ad_clicks} WHERE aid = %d"; | 
| 
pierre@0
 | 
    31       $sql .= tablesort_sql($header); | 
| 
pierre@0
 | 
    32       $result = pager_query($sql, 25, 0, NULL, $node->nid); | 
| 
pierre@0
 | 
    33  | 
| 
pierre@0
 | 
    34       while ($ad = db_fetch_object($result)) { | 
| 
pierre@0
 | 
    35         if (module_exists('click_filter') && $ad->status != CLICK_VALID) { | 
| 
pierre@0
 | 
    36           // Only show filtered clicks to users with permission to view them. | 
| 
pierre@0
 | 
    37           if (!user_access('view filtered clicks')) { | 
| 
pierre@0
 | 
    38             continue; | 
| 
pierre@0
 | 
    39           } | 
| 
pierre@0
 | 
    40         } | 
| 
pierre@0
 | 
    41         if (strlen($ad->url) > 40) { | 
| 
pierre@0
 | 
    42           $url = substr($ad->url, 0, 37) .'...'; | 
| 
pierre@0
 | 
    43         } | 
| 
pierre@0
 | 
    44         else { | 
| 
pierre@0
 | 
    45           $url = $ad->url; | 
| 
pierre@0
 | 
    46         } | 
| 
pierre@0
 | 
    47         $row = array(); | 
| 
pierre@0
 | 
    48         $click_user = user_load(array('uid' => $ad->uid)); | 
| 
pierre@0
 | 
    49         $row[] = format_date($ad->timestamp, 'custom', 'M j H:i'); | 
| 
pierre@0
 | 
    50         $row[] = theme('username', $click_user); | 
| 
pierre@0
 | 
    51         $row[] = l($url, $ad->url); | 
| 
pierre@0
 | 
    52         if (function_exists('click_filter_status_text') && user_access('view filtered clicks')) { | 
| 
pierre@0
 | 
    53           $row[] = click_filter_status_text($ad->status); | 
| 
pierre@0
 | 
    54         } | 
| 
pierre@0
 | 
    55         $row[] = '['. l(t('details'), 'node/'. $node->nid .'/details/'. $ad->cid) .']'; | 
| 
pierre@0
 | 
    56         $rows[] = $row; | 
| 
pierre@0
 | 
    57       } | 
| 
pierre@0
 | 
    58  | 
| 
pierre@0
 | 
    59       if (empty($rows)) { | 
| 
pierre@0
 | 
    60         $click_history = '<p>'. t('There are no clicks yet.') .'</p>'; | 
| 
pierre@0
 | 
    61       } | 
| 
pierre@0
 | 
    62       else { | 
| 
pierre@0
 | 
    63         $click_history = theme('table', $header, $rows); | 
| 
pierre@0
 | 
    64       } | 
| 
pierre@0
 | 
    65       $click_history .= theme('pager', NULL, 25, 0); | 
| 
pierre@0
 | 
    66       $output .= theme('box', t('Click history'), $click_history); | 
| 
pierre@0
 | 
    67     } | 
| 
pierre@0
 | 
    68   } | 
| 
pierre@0
 | 
    69   return $output; | 
| 
pierre@0
 | 
    70 } | 
| 
pierre@0
 | 
    71  | 
| 
pierre@0
 | 
    72 /** | 
| 
pierre@0
 | 
    73  * Calculate statistics for the given advertisements. | 
| 
pierre@0
 | 
    74  * TODO: Introduce caching to make this more efficient. | 
| 
pierre@0
 | 
    75  */ | 
| 
pierre@0
 | 
    76 function ad_statistics($aid) { | 
| 
pierre@0
 | 
    77   // Get global statistics. | 
| 
pierre@0
 | 
    78   $statistics['global']['views'] = (int)db_result(db_query("SELECT SUM(count) FROM {ad_statistics} WHERE aid = %d AND action = 'view'", $aid)); | 
| 
pierre@0
 | 
    79   $statistics['global']['clicks'] = (int)db_result(db_query("SELECT SUM(count) FROM {ad_statistics} WHERE aid = %d AND action = 'click'", $aid)); | 
| 
pierre@0
 | 
    80  | 
| 
pierre@0
 | 
    81   // No sense in making further queries if the ad has no global statistics. | 
| 
pierre@0
 | 
    82   if (!$statistics['global']['views'] && !$statistics['global']['clicks']) { | 
| 
pierre@0
 | 
    83     return $statistics; | 
| 
pierre@0
 | 
    84   } | 
| 
pierre@0
 | 
    85  | 
| 
pierre@0
 | 
    86   // Get statistics for this year and last year. | 
| 
pierre@0
 | 
    87   $this_year = date('Y000000'); | 
| 
pierre@0
 | 
    88   $last_year = date('Y') - 1 .'000000'; | 
| 
pierre@0
 | 
    89   $statistics['last_year']['views'] = (int)db_result(db_query("SELECT SUM(count) FROM {ad_statistics} WHERE aid = %d AND action = 'view' AND date >= %d AND date <= %d", $aid, $last_year, $this_year)); | 
| 
pierre@0
 | 
    90   $statistics['last_year']['clicks'] = (int)db_result(db_query("SELECT SUM(count) FROM {ad_statistics} WHERE aid = %d AND action = 'click' AND date >= %d AND date <= %d", $aid, $last_year, $this_year)); | 
| 
pierre@0
 | 
    91   $statistics['this_year']['views'] = (int)db_result(db_query("SELECT SUM(count) FROM {ad_statistics} WHERE aid = %d AND action = 'view' AND date >= %d", $aid, $this_year)); | 
| 
pierre@0
 | 
    92   $statistics['this_year']['clicks'] = (int)db_result(db_query("SELECT SUM(count) FROM {ad_statistics} WHERE aid = %d AND action = 'click' AND date >= %d", $aid, $this_year)); | 
| 
pierre@0
 | 
    93  | 
| 
pierre@0
 | 
    94   // No sense in making further queries if the ad has no statistics this year. | 
| 
pierre@0
 | 
    95   if (!$statistics['this_year']['views'] && !$statistics['this_year']['clicks']) { | 
| 
pierre@0
 | 
    96     return $statistics; | 
| 
pierre@0
 | 
    97   } | 
| 
pierre@0
 | 
    98  | 
| 
pierre@0
 | 
    99   // Get statistics for this month and last month. | 
| 
pierre@0
 | 
   100   $this_month = date('Ym0000'); | 
| 
pierre@0
 | 
   101   $last_month = date('m') - 1; | 
| 
pierre@0
 | 
   102   if ($last_month == 0) { | 
| 
pierre@0
 | 
   103     $last_month = date('Y') - 1 .'120000'; | 
| 
pierre@0
 | 
   104   } | 
| 
pierre@0
 | 
   105   else { | 
| 
pierre@0
 | 
   106     $last_month = date('Y') . ($last_month < 10 ? '0' : '') . $last_month .'0000'; | 
| 
pierre@0
 | 
   107   } | 
| 
pierre@0
 | 
   108   $statistics['last_month']['views'] = (int)db_result(db_query("SELECT SUM(count) FROM {ad_statistics} WHERE aid = %d AND action = 'view' AND date >= %d AND date <= %d", $aid, $last_month, $this_month)); | 
| 
pierre@0
 | 
   109   $statistics['last_month']['clicks'] = (int)db_result(db_query("SELECT SUM(count) FROM {ad_statistics} WHERE aid = %d AND action = 'click' AND date >= %d AND date <= %d", $aid, $last_month, $this_month)); | 
| 
pierre@0
 | 
   110   $statistics['this_month']['views'] = (int)db_result(db_query("SELECT SUM(count) FROM {ad_statistics} WHERE aid = %d AND action = 'view' AND date >= %d", $aid, $this_month)); | 
| 
pierre@0
 | 
   111   $statistics['this_month']['clicks'] = (int)db_result(db_query("SELECT SUM(count) FROM {ad_statistics} WHERE aid = %d AND action = 'click' AND date >= %d", $aid, $this_month)); | 
| 
pierre@0
 | 
   112  | 
| 
pierre@0
 | 
   113   // No sense in making further queries if the ad has no statistics this month. | 
| 
pierre@0
 | 
   114   if (!$statistics['this_month']['views'] && !$statistics['this_month']['clicks']) { | 
| 
pierre@0
 | 
   115     return $statistics; | 
| 
pierre@0
 | 
   116   } | 
| 
pierre@0
 | 
   117  | 
| 
pierre@0
 | 
   118   // Get statistics for this week. | 
| 
pierre@0
 | 
   119   $this_week_start = date('Ymd00', time() - 60*60*24*6); | 
| 
pierre@0
 | 
   120   $statistics['this_week']['views'] = (int)db_result(db_query("SELECT SUM(count) FROM {ad_statistics} WHERE aid = %d AND action = 'view' AND date > %d", $aid, $this_week_start)); | 
| 
pierre@0
 | 
   121   $statistics['this_week']['clicks'] = (int)db_result(db_query("SELECT SUM(count) FROM {ad_statistics} WHERE aid = %d AND action = 'click' AND date > %d", $aid, $this_week_start)); | 
| 
pierre@0
 | 
   122  | 
| 
pierre@0
 | 
   123   // No sense in making further queries if the ad has no statistics this week. | 
| 
pierre@0
 | 
   124   if (!$statistics['this_week']['views'] && !$statistics['this_week']['clicks']) { | 
| 
pierre@0
 | 
   125     return $statistics; | 
| 
pierre@0
 | 
   126   } | 
| 
pierre@0
 | 
   127  | 
| 
pierre@0
 | 
   128   // Get statistics for yesterday and today. | 
| 
pierre@0
 | 
   129   $yesterday_start = date('Ymd00', time() - 60*60*24); | 
| 
pierre@0
 | 
   130   $yesterday_end = date('Ymd24', time() - 60*60*24); | 
| 
pierre@0
 | 
   131   $today_start = date('Ymd00', time()); | 
| 
pierre@0
 | 
   132   $statistics['yesterday']['views'] = (int)db_result(db_query("SELECT SUM(count) FROM {ad_statistics} WHERE aid = %d AND action = 'view' AND date >= %d AND date <= %d", $aid, $yesterday_start, $yesterday_end)); | 
| 
pierre@0
 | 
   133   $statistics['yesterday']['clicks'] = (int)db_result(db_query("SELECT SUM(count) FROM {ad_statistics} WHERE aid = %d AND action = 'click' AND date >= %d AND date <= %d", $aid, $yesterday_start, $yesterday_end)); | 
| 
pierre@0
 | 
   134   $statistics['today']['views'] = (int)db_result(db_query("SELECT SUM(count) FROM {ad_statistics} WHERE aid = %d AND action = 'view' AND date >= %d", $aid, $today_start)); | 
| 
pierre@0
 | 
   135   $statistics['today']['clicks'] = (int)db_result(db_query("SELECT SUM(count) FROM {ad_statistics} WHERE aid = %d AND action = 'click' AND date >= %d", $aid, $today_start)); | 
| 
pierre@0
 | 
   136  | 
| 
pierre@0
 | 
   137   // No sense in making further queries if the ad has no statistics today. | 
| 
pierre@0
 | 
   138   if (!$statistics['today']['views'] && !$statistics['today']['clicks']) { | 
| 
pierre@0
 | 
   139     return $statistics; | 
| 
pierre@0
 | 
   140   } | 
| 
pierre@0
 | 
   141  | 
| 
pierre@0
 | 
   142   // Get statistics for this hour and the last hour. | 
| 
pierre@0
 | 
   143   $last_hour = date('YmdH', time() - 60*60); | 
| 
pierre@0
 | 
   144   $this_hour = date('YmdH', time()); | 
| 
pierre@0
 | 
   145   $statistics['last_hour']['views'] = (int)db_result(db_query("SELECT SUM(count) FROM {ad_statistics} WHERE aid = %d AND action = 'view' AND date = %d", $aid, $last_hour)); | 
| 
pierre@0
 | 
   146   $statistics['last_hour']['clicks'] = (int)db_result(db_query("SELECT SUM(count) FROM {ad_statistics} WHERE aid = %d AND action = 'click' AND date = %d", $aid, $last_hour)); | 
| 
pierre@0
 | 
   147   $statistics['this_hour']['views'] = (int)db_result(db_query("SELECT SUM(count) FROM {ad_statistics} WHERE aid = %d AND action = 'view' AND date = %d", $aid, $this_hour)); | 
| 
pierre@0
 | 
   148   $statistics['this_hour']['clicks'] = (int)db_result(db_query("SELECT SUM(count) FROM {ad_statistics} WHERE aid = %d AND action = 'click' AND date = %d", $aid, $this_hour)); | 
| 
pierre@0
 | 
   149  | 
| 
pierre@0
 | 
   150   return $statistics; | 
| 
pierre@0
 | 
   151 } | 
| 
pierre@0
 | 
   152  | 
| 
pierre@0
 | 
   153 function theme_ad_statistics_display($statistics) { | 
| 
pierre@0
 | 
   154   $header = array('', t('Impressions'), t('Clicks'), t('Click-thru')); | 
| 
pierre@0
 | 
   155   $rows = array(); | 
| 
pierre@0
 | 
   156  | 
| 
pierre@0
 | 
   157   $data = array( | 
| 
pierre@0
 | 
   158    'this_hour' => t('This hour'), | 
| 
pierre@0
 | 
   159    'last_hour' => t('Last hour'), | 
| 
pierre@0
 | 
   160    'today' => t('Today'), | 
| 
pierre@0
 | 
   161    'yesterday' => t('Yesterday'), | 
| 
pierre@0
 | 
   162    'this_week' => t('Last seven days'), | 
| 
pierre@0
 | 
   163    'this_month' => t('This month'), | 
| 
pierre@0
 | 
   164    'last_month' => t('Last month'), | 
| 
pierre@0
 | 
   165    'this_year' => t('This year'), | 
| 
pierre@0
 | 
   166    'last_year' => t('Last year'), | 
| 
pierre@0
 | 
   167    'global' => t('All time') | 
| 
pierre@0
 | 
   168   ); | 
| 
pierre@0
 | 
   169  | 
| 
pierre@0
 | 
   170   foreach ($data as $key => $value) { | 
| 
pierre@0
 | 
   171     if (isset($statistics[$key]) && (isset($statistics[$key]['views']) || isset($statistics[$key]['clicks']) || $key == 'global')) { | 
| 
pierre@0
 | 
   172       $rows[] = array( | 
| 
pierre@0
 | 
   173         array('data' => $value), | 
| 
pierre@0
 | 
   174         array('data' => (int)$statistics[$key]['views']), | 
| 
pierre@0
 | 
   175         array('data' => (int)$statistics[$key]['clicks']), | 
| 
pierre@0
 | 
   176         array('data' => $statistics[$key]['views'] ? sprintf('%1.2f', ((int)$statistics[$key]['clicks'] / (int)$statistics[$key]['views']) * 100) .'%' : '0.00%'), | 
| 
pierre@0
 | 
   177       ); | 
| 
pierre@0
 | 
   178     } | 
| 
pierre@0
 | 
   179   } | 
| 
pierre@0
 | 
   180   if (empty($rows) || (!$statistics['global']['views'] && !$statistics['global']['clicks'])) { | 
| 
pierre@0
 | 
   181     $statistics = '<p>'. t('There are no any statistics yet.') .'</p>'; | 
| 
pierre@0
 | 
   182   } | 
| 
pierre@0
 | 
   183   else { | 
| 
pierre@0
 | 
   184     $statistics = theme('table', $header, $rows); | 
| 
pierre@0
 | 
   185   } | 
| 
pierre@0
 | 
   186  | 
| 
pierre@0
 | 
   187   return theme('box', t('Statistics'), $statistics); | 
| 
pierre@0
 | 
   188 } | 
| 
pierre@0
 | 
   189  | 
| 
pierre@0
 | 
   190  | 
| 
pierre@0
 | 
   191 function ad_click_details($node, $cid) { | 
| 
pierre@0
 | 
   192   drupal_set_breadcrumb(array(l(t('Home'), NULL), l(check_plain($node->title), 'node/'. $node->nid))); | 
| 
pierre@0
 | 
   193   if ($click = db_fetch_object(db_query('SELECT * FROM {ad_clicks} WHERE cid = %d', $cid))) { | 
| 
pierre@0
 | 
   194     $ad = node_load($click->aid); | 
| 
pierre@0
 | 
   195     $account = user_load(array('uid' => $click->uid)); | 
| 
pierre@0
 | 
   196     $rows = array( | 
| 
pierre@0
 | 
   197       array( | 
| 
pierre@0
 | 
   198         array('data' => t('Time'), 'header' => TRUE), | 
| 
pierre@0
 | 
   199         format_date($click->timestamp, 'custom', 'D F j, Y h:i a'), | 
| 
pierre@0
 | 
   200       ), | 
| 
pierre@0
 | 
   201       array( | 
| 
pierre@0
 | 
   202         array('data' => t('User'), 'header' => TRUE), | 
| 
pierre@0
 | 
   203         theme('username', $account), | 
| 
pierre@0
 | 
   204       ), | 
| 
pierre@0
 | 
   205       array( | 
| 
pierre@0
 | 
   206         array('data' => t('IP Address'), 'header' => TRUE), | 
| 
pierre@0
 | 
   207         $click->hostname, | 
| 
pierre@0
 | 
   208       ), | 
| 
pierre@0
 | 
   209       array( | 
| 
pierre@0
 | 
   210         array('data' => t('User Agent'), 'header' => TRUE), | 
| 
pierre@0
 | 
   211         check_plain($click->user_agent), | 
| 
pierre@0
 | 
   212       ), | 
| 
pierre@0
 | 
   213       array( | 
| 
pierre@0
 | 
   214         array('data' => t('URL'), 'header' => TRUE), | 
| 
pierre@0
 | 
   215         l($click->url, $click->url), | 
| 
pierre@0
 | 
   216       ), | 
| 
pierre@0
 | 
   217       array( | 
| 
pierre@0
 | 
   218         array('data' => t('Advertisement'), 'header' => TRUE), | 
| 
pierre@0
 | 
   219         $ad->ad, | 
| 
pierre@0
 | 
   220       ) | 
| 
pierre@0
 | 
   221     ); | 
| 
pierre@0
 | 
   222     if (function_exists('click_filter_status_text') && user_access('view filtered clicks')) { | 
| 
pierre@0
 | 
   223       switch ($click->status) { | 
| 
pierre@0
 | 
   224         case 0: | 
| 
pierre@0
 | 
   225         default: | 
| 
pierre@0
 | 
   226           $status = t('Not valid: this click has not been counted for unknown reasons.  This is an unexpected error.'); | 
| 
pierre@0
 | 
   227           break; | 
| 
pierre@0
 | 
   228         case 1: | 
| 
pierre@0
 | 
   229           $status = t('Valid: this is a valid click.'); | 
| 
pierre@0
 | 
   230           break; | 
| 
pierre@0
 | 
   231         case 2: | 
| 
pierre@0
 | 
   232           $status = t('Not valid: this click has not been counted because another click by the same IP address was already counted.'); | 
| 
pierre@0
 | 
   233           break; | 
| 
pierre@0
 | 
   234         case 3: | 
| 
pierre@0
 | 
   235           $status = t('Not valid: this click has not been counted because it was generated by an owner of the advertisement.'); | 
| 
pierre@0
 | 
   236           break; | 
| 
pierre@0
 | 
   237         case 4: | 
| 
pierre@0
 | 
   238           $status = t('Not valid: this click has not been counted because it was generated by a user in a filtered role.'); | 
| 
pierre@0
 | 
   239           break; | 
| 
pierre@0
 | 
   240         case 5: | 
| 
pierre@0
 | 
   241           $status = t('Not valid: this click has not been counted because it was generated by an automated "bot".'); | 
| 
pierre@0
 | 
   242           break; | 
| 
pierre@0
 | 
   243       } | 
| 
pierre@0
 | 
   244       $rows[] = array(array('data' => t('Status'), 'header' => TRUE), $status); | 
| 
pierre@0
 | 
   245     } | 
| 
pierre@0
 | 
   246     $output = theme('table', array(), $rows); | 
| 
pierre@0
 | 
   247   } | 
| 
pierre@0
 | 
   248   return $output; | 
| 
pierre@0
 | 
   249 } | 
| 
pierre@0
 | 
   250  | 
| 
pierre@0
 | 
   251  |