/[drupal]/contributions/modules/banner/banner_db.php
ViewVC logotype

Contents of /contributions/modules/banner/banner_db.php

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.25 - (show annotations) (download) (as text)
Sun Dec 10 20:59:30 2006 UTC (2 years, 11 months ago) by wulff
Branch: MAIN
CVS Tags: HEAD
Changes since 1.24: +1 -3 lines
File MIME type: text/x-php
Updated for 5.0
1 <?php
2 // $Id: banner_db.php,v 1.24.2.1 2006/09/23 14:39:43 wulff Exp $
3
4 /**
5 * @file
6 * The database cache handler for the banner module.
7 */
8
9 header("Content-Type: application/x-javascript; charset=utf-8");
10
11 include_once './includes/bootstrap.inc';
12 drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE);
13
14 $group = (int) $_GET['group'];
15 $count = (int) $_GET['count'];
16 $terms = (string) $_GET['terms'];
17
18 // build queries
19 $queries = array();
20 $columns = ', b.nid, b.chance, b.cache, b.views, b.views_max, b.views_day, b.views_day_max, b.views_week, b.views_week_max, n.uid';
21 if ($terms != '0') {
22 // build query to group terms by vocabulary
23 $tids = explode(',', $terms);
24 for ($i = 0; $i < count($tids); $i++) {
25 $like[] = '%d';
26 }
27 $query = 'SELECT DISTINCT(tn.tid), td.vid FROM {term_node} tn INNER JOIN {term_data} td ON tn.tid = td.tid WHERE tn.tid IN ('. implode(',', $like) .')';
28
29 $result = db_query($query, $tids);
30
31 $tidgroup = array();
32 while ($row = db_fetch_array($result)) {
33 $tidgroup[$row['vid']][] = $row['tid'];
34 }
35
36 // build query for AND matching between vocabularies
37 $join = '';
38 $where = array();
39 foreach ($tidgroup as $vid => $tids) {
40 $join .= ' INNER JOIN {term_node} tn'. $vid .' ON b.nid = tn'. $vid .'.nid';
41 $where[] = 'tn'. $vid .'.tid IN ('. implode(',', $tids) .')';
42 }
43 $query = 'SELECT DISTINCT(b.vid)'. $columns .' FROM {node} n INNER JOIN {term_node} tn ON n.nid = tn.nid INNER JOIN {banner} b ON n.vid = b.vid'. $join .' WHERE tn.tid = %d AND b.workflow = 1';
44
45 if ($where) {
46 $query .= ' AND ('. implode(' AND ', $where) .')';
47 }
48 $queries[] = array($query , $group);
49
50 // build query for OR matching between vocabularies
51 $join = '';
52 $where = array();
53 foreach ($tidgroup as $vid => $tids) {
54 $join .= ' INNER JOIN {term_node} tn'. $vid .' ON b.nid = tn'. $vid .'.nid';
55 $where[] = 'tn'. $vid .'.tid IN ('. implode(',', $tids) .')';
56 }
57 $query = 'SELECT DISTINCT(b.vid)'. $columns .' FROM {node} n INNER JOIN {term_node} tn ON n.nid = tn.nid INNER JOIN {banner} b ON n.vid = b.vid'. $join .' WHERE tn.tid = %d AND b.workflow = 1';
58 if ($where) {
59 $query .= ' AND ('. implode(' OR ', $where) .')';
60 }
61 $queries[] = array($query , $group);
62 }
63 $queries[] = array('SELECT b.vid'. $columns .' FROM {node} n INNER JOIN {term_node} tn ON n.nid = tn.nid INNER JOIN {banner} b ON n.vid = b.vid WHERE tn.tid = %d AND b.workflow = 1', $group);
64
65 // run queries, stop after first query which returns one or more rows
66 foreach ($queries as $query) {
67 $result = db_query($query[0], $query[1]);
68 if (db_num_rows($result) > 0) {
69 break;
70 }
71 }
72
73 // build ballot
74 $ballot = array();
75 while ($banner = db_fetch_object($result)) {
76 for ($i = 0; $i < $banner->chance; $i++) {
77 $ballot[] = $banner->nid;
78 }
79 $banners[$banner->nid] = $banner;
80 }
81
82 // get uid of current user
83 $result = db_query("SELECT uid, sid FROM {sessions} WHERE sid = '%s'", $_COOKIE[session_name()]);
84 if (db_num_rows($result)) {
85 $session = db_fetch_array($result);
86 $uid = $session['uid'];
87 }
88 else {
89 $uid = 0;
90 }
91
92 $counter = 0;
93 while ($counter < $count && count($ballot)) {
94 // choose random banner
95 $max = count($ballot) - 1;
96 if ($max > 0) {
97 $random = mt_rand(0, $max);
98 }
99 else {
100 $random = 0;
101 }
102 $nid = $ballot[$random];
103
104 // get banner and remove it from the ballot
105 $banner = $banners[$nid];
106 array_splice($ballot, $random, 1);
107
108 // update view statistics, admin and owner views are not counted
109 if ($uid != 1 && $uid != $banner->uid) {
110 db_query('UPDATE {banner} SET views = views + 1, views_day = views_day + 1, views_week = views_week + 1 WHERE vid = %d', $banner->vid);
111 }
112
113 // change banner status?
114 if ($banner->views_max > 0 && $banner->views >= $banner->views_max) {
115 // limit reached
116 db_query('UPDATE {banner} SET workflow = 5 WHERE vid = %d', $banner->vid);
117 }
118 else if ($banner->views_day_max > 0 && $banner->views_day >= $banner->views_day_max) {
119 // day limit reached
120 db_query('UPDATE {banner} SET workflow = 2 WHERE vid = %d', $banner->vid);
121 }
122 else if ($banner->views_week_max > 0 && $banner->views_week >= $banner->views_week_max) {
123 // week limit reached
124 db_query('UPDATE {banner} SET workflow = 3 WHERE vid = %d', $banner->vid);
125 }
126
127 print $banner->cache;
128
129 $counter++;
130 }

  ViewVC Help
Powered by ViewVC 1.1.2