comparison report/ad_report.module @ 0:d8a3998dac8e ad

ajout module ad
author pierre
date Fri, 20 Feb 2009 14:04:09 +0000
parents
children 948362c2a207
comparison
equal deleted inserted replaced
-1:000000000000 0:d8a3998dac8e
1 <?php
2 // $Id: ad_report.module,v 1.1.2.3.2.7.2.6 2009/02/16 23:12:29 jeremy Exp $
3
4 /**
5 * @file
6 * Provides comprehensive charts and reports about advertising statistics.
7 *
8 * Copyright (c) 2005-2009.
9 * Jeremy Andrews <jeremy@tag1consulting.com>.
10 */
11
12 /**
13 * Implementation of hook_menu().
14 */
15 function ad_report_menu() {
16 $items = array();
17
18 $items['node/%node/report'] = array(
19 'title' => 'Reports',
20 'page callback' => 'ad_report_bargraph',
21 'page arguments' => array(1),
22 'type' => MENU_LOCAL_TASK,
23 'access callback' => 'ad_report_access',
24 'access arguments' => array(1),
25 );
26 $items['node/%node/report/monthly'] = array(
27 'title' => 'Monthly Reports',
28 'page callback' => 'ad_report_bargraph',
29 'page arguments' => array(1,3),
30 'type' => MENU_LOCAL_TASK,
31 'access callback' => 'ad_report_access',
32 'access arguments' => array(1),
33 );
34 $items['node/%node/report/weekly'] = array(
35 'title' => 'Weekly Reports',
36 'page callback' => 'ad_report_bargraph',
37 'page arguments' => array(1,3),
38 'type' => MENU_LOCAL_TASK,
39 'access callback' => 'ad_report_access',
40 'access arguments' => array(1),
41 );
42 $items['node/%node/report/daily'] = array(
43 'title' => 'Daily Reports',
44 'page callback' => 'ad_report_bargraph',
45 'page arguments' => array(1,3),
46 'type' => MENU_DEFAULT_LOCAL_TASK,
47 'access callback' => 'ad_report_access',
48 'access arguments' => array(1),
49 );
50 $items['node/%node/report/hourly'] = array(
51 'title' => 'Hourly Reports',
52 'page callback' => 'ad_report_bargraph',
53 'page arguments' => array(1,3),
54 'type' => MENU_LOCAL_TASK,
55 'access callback' => 'ad_report_access',
56 'access arguments' => array(1),
57 );
58 $items['ad_report/%node/bargraph'] = array(
59 'title' => 'Bar graph',
60 'page callback' => 'ad_report_generate_bargraph',
61 'page arguments' => array(1),
62 'type' => MENU_CALLBACK,
63 'access callback' => 'ad_report_access',
64 'access arguments' => array(1),
65 );
66
67 return $items;
68 }
69 /**
70 * Implementation of access callback.
71 *
72 * @param mixed $node
73 * Ad object.
74 */
75 function ad_report_access($node){
76 return ($node->type == 'ad') && ad_adaccess($node, 'access statistics');
77 }
78 /**
79 * Page to display ad with bargraph.
80 */
81 function ad_report_bargraph($node, $granularity = 'daily', $type = 'node') {
82 switch ($granularity) {
83 case 'hourly':
84 drupal_set_title(t('Past twelve hours'));
85 break;
86 case 'daily':
87 drupal_set_title(t('Past twelve days'));
88 break;
89 case 'weekly':
90 drupal_set_title(t('Past twelve weeks'));
91 break;
92 case 'monthly':
93 drupal_set_title(t('Past twelve months'));
94 break;
95 }
96
97 switch ($type) {
98 case 'node':
99 if ($node->aid) {
100 $output = '<img src="'. url("ad_report/$node->nid/bargraph/$granularity/node") .'" />';
101 $ad_link = module_invoke('ad_' . $node->adtype, 'display_ad', $node);
102 $output .= theme('box', $node->title, $ad_link);
103 }
104 break;
105 default:
106 $output = '<img src="'. url("ad_report/$node->uid/bargraph/$granularity/$type") .'" />';
107 break;
108 }
109 return $output;
110 }
111
112 /**
113 * Page that utilizes gd to generate a bargraph.
114 *
115 * TODO: Make this more dynamic, allowing to move through time, etc.
116 */
117 function ad_report_generate_bargraph($node, $granularity = 'daily', $type = 'node') {
118 $id = $node->nid;
119 header("Content-type: image/png");
120
121 // Preperation.
122 $views = array();
123 $max_views = 0;
124 $statistics = array();
125 $clicks = array();
126 $max_clicks = 0;
127 $time = time();
128
129 $increments = 12;
130 $end_add = 0;
131 switch ($granularity) {
132 case 'hourly':
133 $start_time = (60 * 60 * 11);
134 // Increment hourly.
135 $increment_time = (60 * 60);
136
137 $format_start = 'YmdH';
138 $format_end = 'YmdH';
139 $format_end_append = '';
140 $format_upper = 'M d';
141 $format_lower = 'ga';
142 $graph_height = 250;
143 break;
144 case 'daily':
145 default:
146 $start_time = (60 * 60 * 24 * 11);
147 // Increment daily.
148 $increment_time = (60 * 60 * 24);
149
150 $format_start = 'Ymd00';
151 $format_end = 'Ymd';
152 $format_end_append = '24';
153 $format_upper = 'D';
154 $format_lower = 'M d';
155 break;
156 case 'weekly':
157 $start_time = (60 * 60 * 24 * 7 * 11);
158 // Increment weekly.
159 $increment_time = (60 * 60 * 24 * 7);
160
161 $format_start = 'Ymd00';
162 $format_end = 'Ymd';
163 $format_end_append = '24';
164 $end_add = (60 * 60 * 24 * 6);
165 //$end_add = 600;
166 $format_upper = 'M d -';
167 $format_lower = '';
168 break;
169 case 'monthly':
170 $start_time = ((60 * 60 * 24 * 2) + (60 * 60 * 24 * 7 * 4)) * 11;
171 // Increment monthly (every 30 days).
172 $increment_time = (60 * 60 * 24 * 2) + (60 * 60 * 24 * 7 * 4);
173
174 $format_start = 'Ymd00';
175 $format_end = 'Ymd';
176 $format_end_append = '24';
177 $end_add = (60 * 60 * 24 * 29);
178 $format_upper = 'M d -';
179 $format_lower = '';
180 break;
181 }
182
183 // Retrive data from database.
184 for ($i = $time - $start_time; $i <= $time; $i = $i + $increment_time) {
185 $day_start = date($format_start, $i);
186 $day_end = date($format_end, $i + $end_add). $format_end_append;
187 if ($type == 'node') {
188 $view = (int)db_result(db_query("SELECT SUM(count) FROM {ad_statistics} WHERE aid = %d AND action = 'view' AND date >= %d AND date <= %d", $id, $day_start, $day_end));
189 $click = (int)db_result(db_query("SELECT SUM(count) FROM {ad_statistics} WHERE aid = %d AND action = 'click' AND date >= %d AND date <= %d", $id, $day_start, $day_end));
190 }
191 else if ($type == 'user') {
192 $view = (int)db_result(db_query("SELECT SUM(a.count) FROM {ad_statistics} a LEFT JOIN {node} n ON a.aid = n.nid WHERE uid = %d AND type = 'ad' AND (action = 'view' OR action = 'count') AND date >= %d AND date <= %d", $id, $day_start, $day_end));
193 $click = (int)db_result(db_query("SELECT SUM(a.count) FROM {ad_statistics} a LEFT JOIN {node} n ON a.aid = n.nid WHERE uid = %d AND type = 'ad' AND action = 'click' AND date >= %d AND date <= %d", $id, $day_start, $day_end));
194 }
195 else {
196 $function = "ad_report_views_$type";
197 if (function_exists("$function")) {
198 $view = $function($id, $day_start, $day_end);
199 }
200 $function = "ad_report_clicks_$type";
201 if (function_exists("$function")) {
202 $click = $function($id, $day_start, $day_end);
203 }
204 }
205 if ($view > $max_views) {
206 $max_views = $view;
207 }
208 $statistics[] = array(
209 'upper' => date($format_upper, $i),
210 'lower' => date($format_lower, $i),
211 'views' => $view,
212 'clicks' => $click
213 );
214 }
215
216 // Build graph image.
217 $image_width = 50 * $increments + 1;
218 $image_height = 300;
219 $graph_width = 50 * $increments;
220 $graph_height = 250;
221
222 $graph = imagecreate($image_width, $image_height);
223
224 // Configure colors to use in chart.
225 $color = array(
226 'white' => imagecolorallocate($graph, 255, 255, 255),
227 'black' => imagecolorallocate($graph, 0, 0, 0),
228 'grey' => imagecolorallocate($graph, 192, 192, 192),
229 'blue' => imagecolorallocate($graph, 0, 0, 255),
230 'orange' => imagecolorallocate($graph, 220, 210, 60),
231 );
232
233 // Draw the outside edges of the graph.
234 imageline($graph, 0, 0, 0, $graph_height, $color['grey']);
235 imageline($graph, 0, 0, $graph_width, 0, $color['grey']);
236 imageline($graph, $graph_width - 1, 0, $graph_width - 1, $graph_height, $color['grey']);
237 imageline($graph, 0, $graph_height - 1, $graph_width - 1, $graph_height - 1, $color['grey']);
238
239 // Draw a grid.
240 for ($i = 0; $i < ($increments + 1); $i++) {
241 imageline($graph, $i*50, 0, $i*50, $graph_height, $color['grey']);
242 }
243 for ($i = 0; $i < 11; $i++) {
244 imageline($graph, 0, $i*25, $graph_width, $i*25, $color['grey']);
245 }
246
247 $multiply = 0;
248 if ($max_views > $graph_height) {
249 if (!$multiply) {
250 $multiply = .9;
251 }
252 while (($max_views * $multiply) >= $graph_height) {
253 $multiply *= .9;
254 }
255 }
256 else if ($max_views) {
257 while (($max_views * ($multiply + 1)) <= $graph_height) {
258 $multiply++;
259 }
260 }
261
262 // Display impressions.
263 for ($i = 0; $i < $increments ; $i++) {
264 $view = $multiply ? $statistics[$i]['views'] * $multiply : $statistics[$i]['views'];
265 if ($view) {
266 imagefilledrectangle($graph, $i*50 + 4, $graph_height-$view, ($i+1)*50, $graph_height, $color['grey']);
267 $string_height = $view < 10 ? $graph_height - 10 : $graph_height - $view;
268 imagestring($graph, 2, $i*50 + 15, $string_height, $statistics[$i]['views'], $color['black']);
269 }
270 // Display timestamp
271 imagestring($graph, 2, $i*50 + 2, 255, $statistics[$i]['upper'], $color['black']);
272 imagestring($graph, 2, $i*50 + 3, 265, $statistics[$i]['lower'], $color['black']);
273 }
274
275 // Display clicks.
276 for ($i = 0; $i < $increments; $i++) {
277 $click = $multiply ? $statistics[$i]['clicks'] * $multiply : $statistics[$i]['clicks'];
278 if ($click) {
279 imagefilledrectangle($graph, $i*50 + 10, $graph_height-$click, ($i+1)*50, $graph_height, $color['blue']);
280 $string_height = $click < 10 ? $graph_height - 10 : $graph_height - $click;
281 imagestring($graph, 2, $i*50 + 20, $string_height, $statistics[$i]['clicks'], $color['white']);
282 }
283 }
284
285 imagepng($graph);
286 imagedestroy($graph);
287
288 }
289