Fix handling of extra_query_params in Business::OnlinePayment wrapper.
[interchange.git] / code / SystemTag / banner.coretag
1 # Copyright 2002-2007 Interchange Development Group and others
2
3 # This program is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 2 of the License, or
6 # (at your option) any later version.  See the LICENSE file for details.
7
8 # $Id: banner.coretag,v 1.6 2007-03-30 23:40:49 pajamian Exp $
9
10 UserTag banner              Order        category
11 UserTag banner              addAttr
12 UserTag banner              PosNumber    1
13 UserTag banner              Version      $Revision: 1.6 $
14 UserTag banner              Routine      <<EOR
15 sub {
16         my ($place, $opt) = @_;
17
18
19         sub initialize_banner_directory {
20                 my ($dir, $category, $opt) = @_;
21                 mkdir $dir, 0777 if ! -d $dir;
22                 my $t = $opt->{table} || 'banner';
23                 my $c_field;
24                 my $append = '';
25                 if($category) {
26                         $append = ' AND ';
27                         $append .= ($opt->{c_field} || 'category');
28                         $category =~ s/'/''/g;
29                         $append .= " = '$category'";
30                 }
31                 my $db = database_exists_ref($t);
32                 if(! $db) {
33                         my $weight_file = "$dir/total_weight";
34                         return undef if -f $weight_file;
35                         $t = "no banners db $t\n";
36                         Vend::Util::writefile( $weight_file, $t, $opt);
37                         ::logError($t);
38                         return undef;
39                 }
40                 my $w_field = $opt->{w_field} || 'weight';
41                 my $b_field = $opt->{b_field} || 'banner';
42                 my $q = "select $w_field, $b_field from $t where $w_field >= 1$append";
43                 my $banners = $db->query({
44                         query => $q,
45                         st => 'db',
46                 });
47                 my $i = 0;
48                 for(@$banners) {
49                         my ($weight, $text) = @$_;
50                         for(1 .. $weight) {
51                                 Vend::Util::writefile(">$dir/$i", $text, $opt);
52                                 $i++;
53                         }
54                 }
55                 Vend::Util::writefile(">$dir/total_weight", $i, $opt);
56         }
57
58
59         sub tag_weighted_banner {
60                 my ($category, $opt) = @_;
61                 my $dir = catfile($Vend::Cfg->{ScratchDir}, 'Banners');
62                 mkdir $dir, 0777 if ! -d $dir;
63                 if($category) {
64                         my $c = $category;
65                         $c =~ s/\W//g;
66                         $dir .= "/$c";
67                 }
68                 my $statfile = $Vend::Cfg->{ConfDir};
69                 $statfile .= "/status.$Vend::Cat";
70                 my $start_time;
71                 if($opt->{once}) {
72                         $start_time = 0;
73                 }
74                 elsif(! -f $statfile) {
75                         Vend::Util::writefile( $statfile, "banners initialized " . time() . "\n");
76                         $start_time = time();
77                 }
78                 else {
79                         $start_time = (stat(_))[9];
80                 }
81                 my $weight_file = "$dir/total_weight";
82                 initialize_banner_directory($dir, $category, $opt)
83                         if  ( ! -f $weight_file  or  (stat(_))[9] < $start_time );
84                 my $n = int( rand( readfile($weight_file) ) );
85                 return Vend::Util::readfile("$dir/$n");
86         }
87         return tag_weighted_banner($place, $opt) if $opt->{weighted};
88
89         my $table = $opt->{table}     || 'banner';
90         my $r_field = $opt->{r_field} || 'rotate';
91         my $b_field = $opt->{b_field} || 'banner';
92         my $sep  = $opt->{separator}  || ':';
93         my $delim = $opt->{delimiter} || "{or}";
94         $place = 'default' if ! $place;
95         my $totrot;
96         do {
97                 my $banner_data;
98                 $totrot = tag_data($table, $r_field, $place);
99                 if(! length $totrot) {
100                         # No banner present
101                         unless ($place =~ /$sep/ or $place eq 'default') {
102                                 $place = 'default';
103                                 redo;
104                         }
105                 }
106                 elsif ($totrot) {
107                         my $current = $::Scratch->{"rotate_$place"}++ || 0;
108                         my $data = tag_data($table, $b_field, $place);
109                         my(@banners) = split /\Q$delim/, $data;
110                         return '' unless @banners;
111                         return $banners[$current % scalar(@banners)];
112                 }
113                 else {
114                         return tag_data($table, $b_field, $place);
115                 }
116         } while $place =~ s/(.*)$sep.*/$1/;
117         return;
118 }
119 EOR