| Filename | /home/vagrant/kohaclone/C4/NewsChannels.pm |
| Statements | Executed 0 statements in 951µs |
| Line | State ments |
Time on line |
Calls | Time in subs |
Code |
|---|---|---|---|---|---|
| 1 | package C4::NewsChannels; | ||||
| 2 | |||||
| 3 | # This file is part of Koha. | ||||
| 4 | # | ||||
| 5 | # Copyright (C) 2000-2002 Katipo Communications | ||||
| 6 | # Copyright (C) 2013 Mark Tompsett | ||||
| 7 | # | ||||
| 8 | # Koha is free software; you can redistribute it and/or modify it | ||||
| 9 | # under the terms of the GNU General Public License as published by | ||||
| 10 | # the Free Software Foundation; either version 3 of the License, or | ||||
| 11 | # (at your option) any later version. | ||||
| 12 | # | ||||
| 13 | # Koha is distributed in the hope that it will be useful, but | ||||
| 14 | # WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
| 16 | # GNU General Public License for more details. | ||||
| 17 | # | ||||
| 18 | # You should have received a copy of the GNU General Public License | ||||
| 19 | # along with Koha; if not, see <http://www.gnu.org/licenses>. | ||||
| 20 | |||||
| 21 | use Modern::Perl; | ||||
| 22 | use C4::Context; | ||||
| 23 | use Koha::DateUtils; | ||||
| 24 | |||||
| 25 | use vars qw($VERSION @ISA @EXPORT); | ||||
| 26 | |||||
| 27 | BEGIN { | ||||
| 28 | $VERSION = 3.07.00.049; # set the version for version checking | ||||
| 29 | @ISA = qw(Exporter); | ||||
| 30 | @EXPORT = qw( | ||||
| 31 | &GetNewsToDisplay | ||||
| 32 | &add_opac_new &upd_opac_new &del_opac_new &get_opac_new &get_opac_news | ||||
| 33 | ); | ||||
| 34 | } | ||||
| 35 | |||||
| 36 | =head1 NAME | ||||
| 37 | |||||
| 38 | C4::NewsChannels - Functions to manage OPAC and intranet news | ||||
| 39 | |||||
| 40 | =head1 DESCRIPTION | ||||
| 41 | |||||
| 42 | This module provides the functions needed to mange OPAC and intranet news. | ||||
| 43 | |||||
| 44 | =head1 FUNCTIONS | ||||
| 45 | |||||
| 46 | =cut | ||||
| 47 | |||||
| 48 | =head2 add_opac_new | ||||
| 49 | |||||
| 50 | $retval = add_opac_new($hashref); | ||||
| 51 | |||||
| 52 | $hashref should contains all the fields found in opac_news, | ||||
| 53 | except idnew. The idnew field is auto-generated. | ||||
| 54 | |||||
| 55 | =cut | ||||
| 56 | |||||
| 57 | sub add_opac_new { | ||||
| 58 | my ($href_entry) = @_; | ||||
| 59 | my $retval = 0; | ||||
| 60 | |||||
| 61 | if ($href_entry) { | ||||
| 62 | my @fields = keys %{$href_entry}; | ||||
| 63 | my @values = values %{$href_entry}; | ||||
| 64 | my $field_string = join ',', @fields; | ||||
| 65 | $field_string = $field_string // q{}; | ||||
| 66 | my $values_string = join(',', map { '?' } @fields); | ||||
| 67 | my $dbh = C4::Context->dbh; | ||||
| 68 | my $sth = $dbh->prepare("INSERT INTO opac_news ( $field_string ) VALUES ( $values_string )"); | ||||
| 69 | $sth->execute(@values); | ||||
| 70 | $retval = 1; | ||||
| 71 | } | ||||
| 72 | return $retval; | ||||
| 73 | } | ||||
| 74 | |||||
| 75 | =head2 upd_opac_new | ||||
| 76 | |||||
| 77 | $retval = upd_opac_new($hashref); | ||||
| 78 | |||||
| 79 | $hashref should contains all the fields found in opac_news, | ||||
| 80 | including idnew, since it is the key for the SQL UPDATE. | ||||
| 81 | |||||
| 82 | =cut | ||||
| 83 | |||||
| 84 | sub upd_opac_new { | ||||
| 85 | my ($href_entry) = @_; | ||||
| 86 | my $retval = 0; | ||||
| 87 | |||||
| 88 | if ($href_entry) { | ||||
| 89 | # take the keys of hash entry and make a list, but... | ||||
| 90 | my @fields = keys %{$href_entry}; | ||||
| 91 | my @values; | ||||
| 92 | $#values = -1; | ||||
| 93 | my $field_string = q{}; | ||||
| 94 | foreach my $field_name (@fields) { | ||||
| 95 | # exclude idnew | ||||
| 96 | if ( $field_name ne 'idnew' ) { | ||||
| 97 | $field_string = $field_string . "$field_name = ?,"; | ||||
| 98 | push @values,$href_entry->{$field_name}; | ||||
| 99 | } | ||||
| 100 | } | ||||
| 101 | # put idnew at the end, so we know which record to update | ||||
| 102 | push @values,$href_entry->{'idnew'}; | ||||
| 103 | chop $field_string; # remove that excess , | ||||
| 104 | |||||
| 105 | my $dbh = C4::Context->dbh; | ||||
| 106 | my $sth = $dbh->prepare("UPDATE opac_news SET $field_string WHERE idnew = ?;"); | ||||
| 107 | $sth->execute(@values); | ||||
| 108 | $retval = 1; | ||||
| 109 | } | ||||
| 110 | return $retval; | ||||
| 111 | } | ||||
| 112 | |||||
| 113 | sub del_opac_new { | ||||
| 114 | my ($ids) = @_; | ||||
| 115 | if ($ids) { | ||||
| 116 | my $dbh = C4::Context->dbh; | ||||
| 117 | my $sth = $dbh->prepare("DELETE FROM opac_news WHERE idnew IN ($ids)"); | ||||
| 118 | $sth->execute(); | ||||
| 119 | return 1; | ||||
| 120 | } else { | ||||
| 121 | return 0; | ||||
| 122 | } | ||||
| 123 | } | ||||
| 124 | |||||
| 125 | sub get_opac_new { | ||||
| 126 | my ($idnew) = @_; | ||||
| 127 | my $dbh = C4::Context->dbh; | ||||
| 128 | my $query = q{ | ||||
| 129 | SELECT opac_news.*,branches.branchname | ||||
| 130 | FROM opac_news LEFT JOIN branches | ||||
| 131 | ON opac_news.branchcode=branches.branchcode | ||||
| 132 | WHERE opac_news.idnew = ?; | ||||
| 133 | }; | ||||
| 134 | my $sth = $dbh->prepare($query); | ||||
| 135 | $sth->execute($idnew); | ||||
| 136 | my $data = $sth->fetchrow_hashref; | ||||
| 137 | $data->{$data->{'lang'}} = 1 if defined $data->{lang}; | ||||
| 138 | $data->{expirationdate} = output_pref({ dt => dt_from_string( $data->{expirationdate} ), dateonly => 1 }); | ||||
| 139 | $data->{timestamp} = output_pref({ dt => dt_from_string( $data->{timestamp} ), dateonly => 1 }) ; | ||||
| 140 | return $data; | ||||
| 141 | } | ||||
| 142 | |||||
| 143 | sub get_opac_news { | ||||
| 144 | my ($limit, $lang, $branchcode) = @_; | ||||
| 145 | my @values; | ||||
| 146 | my $dbh = C4::Context->dbh; | ||||
| 147 | my $query = q{ | ||||
| 148 | SELECT opac_news.*, branches.branchname, | ||||
| 149 | timestamp AS newdate, | ||||
| 150 | borrowers.title AS author_title, | ||||
| 151 | borrowers.firstname AS author_firstname, | ||||
| 152 | borrowers.surname AS author_surname | ||||
| 153 | FROM opac_news LEFT JOIN branches | ||||
| 154 | ON opac_news.branchcode=branches.branchcode | ||||
| 155 | LEFT JOIN borrowers on borrowers.borrowernumber = opac_news.borrowernumber | ||||
| 156 | }; | ||||
| 157 | $query .= ' WHERE 1'; | ||||
| 158 | if ($lang) { | ||||
| 159 | $query .= " AND (opac_news.lang='' OR opac_news.lang=?)"; | ||||
| 160 | push @values,$lang; | ||||
| 161 | } | ||||
| 162 | if ($branchcode) { | ||||
| 163 | $query .= ' AND (opac_news.branchcode IS NULL OR opac_news.branchcode=?)'; | ||||
| 164 | push @values,$branchcode; | ||||
| 165 | } | ||||
| 166 | $query.= ' ORDER BY timestamp DESC '; | ||||
| 167 | #if ($limit) { | ||||
| 168 | # $query.= 'LIMIT 0, ' . $limit; | ||||
| 169 | #} | ||||
| 170 | my $sth = $dbh->prepare($query); | ||||
| 171 | $sth->execute(@values); | ||||
| 172 | my @opac_news; | ||||
| 173 | my $count = 0; | ||||
| 174 | while (my $row = $sth->fetchrow_hashref) { | ||||
| 175 | if ((($limit) && ($count < $limit)) || (!$limit)) { | ||||
| 176 | push @opac_news, $row; | ||||
| 177 | } | ||||
| 178 | $count++; | ||||
| 179 | } | ||||
| 180 | return ($count, \@opac_news); | ||||
| 181 | } | ||||
| 182 | |||||
| 183 | =head2 GetNewsToDisplay | ||||
| 184 | |||||
| 185 | $news = &GetNewsToDisplay($lang,$branch); | ||||
| 186 | C<$news> is a ref to an array which containts | ||||
| 187 | all news with expirationdate > today or expirationdate is null | ||||
| 188 | that is applicable for a given branch. | ||||
| 189 | |||||
| 190 | =cut | ||||
| 191 | |||||
| 192 | sub GetNewsToDisplay { | ||||
| 193 | my ($lang,$branch) = @_; | ||||
| 194 | my $dbh = C4::Context->dbh; | ||||
| 195 | # SELECT *,DATE_FORMAT(timestamp, '%d/%m/%Y') AS newdate | ||||
| 196 | my $query = q{ | ||||
| 197 | SELECT opac_news.*,timestamp AS newdate, | ||||
| 198 | borrowers.title AS author_title, | ||||
| 199 | borrowers.firstname AS author_firstname, | ||||
| 200 | borrowers.surname AS author_surname | ||||
| 201 | FROM opac_news | ||||
| 202 | LEFT JOIN borrowers on borrowers.borrowernumber = opac_news.borrowernumber | ||||
| 203 | WHERE ( | ||||
| 204 | expirationdate >= CURRENT_DATE() | ||||
| 205 | OR expirationdate IS NULL | ||||
| 206 | OR expirationdate = '00-00-0000' | ||||
| 207 | ) | ||||
| 208 | AND DATE(timestamp) < DATE_ADD(CURDATE(), INTERVAL 1 DAY) | ||||
| 209 | AND (lang = '' OR lang = ?) | ||||
| 210 | AND (opac_news.branchcode IS NULL OR opac_news.branchcode = ?) | ||||
| 211 | ORDER BY number | ||||
| 212 | }; # expirationdate field is NOT in ISO format? | ||||
| 213 | # timestamp has HH:mm:ss, CURRENT_DATE generates 00:00:00 | ||||
| 214 | # by adding 1, that captures today correctly. | ||||
| 215 | 1 | 405µs | 1 | 75µs | my $sth = $dbh->prepare($query); # spent 75µs making 1 call to DBD::mysql::db::prepare |
| 216 | $lang = $lang // q{}; | ||||
| 217 | $sth->execute($lang,$branch); | ||||
| 218 | my @results; | ||||
| 219 | 1 | 545µs | 3 | 133µs | while ( my $row = $sth->fetchrow_hashref ){ # spent 133µs making 3 calls to DBD::mysql::st::__ANON__[DBD/mysql.pm:799], avg 44µs/call |
| 220 | $row->{newdate} = output_pref({ dt => dt_from_string( $row->{newdate} ), dateonly => 1 }); | ||||
| 221 | push @results, $row; | ||||
| 222 | } | ||||
| 223 | return \@results; | ||||
| 224 | } | ||||
| 225 | |||||
| 226 | 1; | ||||
| 227 | __END__ | ||||
| 228 | |||||
| 229 | =head1 AUTHOR | ||||
| 230 | |||||
| 231 | TG | ||||
| 232 | |||||
| 233 | =cut |