]> git.llucax.com Git - software/bife/bife-all.git/blob - Album.php
5cb8c8d55059cf6f010389a3a3eb5a26486313d2
[software/bife/bife-all.git] / Album.php
1 <?php
2 // vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4:
3 // +--------------------------------------------------------------------+
4 // |                               Hooks                                |
5 // +--------------------------------------------------------------------+
6 // | This file is part of Hooks.                                        |
7 // |                                                                    |
8 // | Hooks 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 2 of the License, or  |
11 // | (at your option) any later version.                                |
12 // |                                                                    |
13 // | Hooks 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 GNU   |
16 // | General Public License for more details.                           |
17 // |                                                                    |
18 // | You should have received a copy of the GNU General Public License  |
19 // | along with Hooks; if not, write to the Free Software Foundation,   |
20 // | Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA      |
21 // +--------------------------------------------------------------------+
22 // | Created: 2000                                                      |
23 // | Authors: Harpo Maxx <harpo@lugmen.org.ar>                          |
24 // |          Groucho Marx <groucho@lugmen.org.ar>                      |
25 // |          Leandro Lucarella <luca@lugmen.org.ar>                    |
26 // +--------------------------------------------------------------------+
27 //
28 // $Id$
29 //
30
31 require_once 'PEAR.php';
32 require_once 'Util.php';
33 require_once 'Image/Transform.php';
34 require_once 'HTML/Template/Sigma.php';
35
36 /**
37  * Generates a photo album.
38  *
39  * This library generates a photo album dinamically.
40  *
41  * @package     Hooks
42  * @subpackage  Album
43  * @author      Harpo Maxx <harpo@lugmen.org.ar>
44  * @author      Groucho Marx <groucho@lugmen.org.ar>
45  * @author      Leandro Lucarella <luca@lugmen.org.ar>
46  * @version     $Rev$
47  * @since       rev 130
48  * @access      public
49  */
50 class Hook_Album {
51
52     var $root;
53     var $recursive;
54     var $thumbsdir;
55     var $thumbsformat;
56     var $exts;
57
58     /**
59      * Constructor.
60      *
61      * @param  string $root      Root directory.
62      *                           same row.
63      * @param  bool   $recursive True if subdirectories must be
64      *                           proccessed.
65      * @param  string $thumbsdir Directory where the thumbnails are (or
66      *                           will be generated).
67      * @param  array  $exts      Comma separated extensions of photo files.
68      *
69      * @access public
70      */
71     function Hook_Album($root = '.', $recursive = true, $thumbsformat = 'jpeg', $thumbsdir = '.thumbs', $exts = 'png,jpg,jpeg,gif') {
72         $this->root         = $root ? $root : '.';
73         $this->recursive    = $recursive;
74         $this->thumbsdir    = $thumbsdir;
75         $this->thumbsformat = $thumbsformat;
76         $this->exts         = preg_split('/\s*,\s*/', $exts);
77     }
78
79     /**
80      * Shows the photo album.
81      *
82      * Shows the photo album.
83      *
84      * @param  string $photo Selected photo.
85      * @param  int    $max   Maximum quantity of thumbnails to show. 0 for
86      *                       unlimited.
87      * @param  int    $cols      How many thumbnails are shown in the
88      *
89      * @access public
90      * @todo   Implement the 'max' feature!
91      * @todo   Make the thumbs cache before showing the images so the
92      *         browser can find the with having to refresh.
93      */
94     function album(&$tpl, $photo = '', $max = 0, $cols = 4) {
95         $tpl->loadTemplateFile('bife_album.html');
96         $tpl->addBlockFile('ITEMS', 'ITEM', 'bife_album_item.html');
97
98         $root = $this->root;
99         $list = $this->getList();
100         $tot  = count($list);
101         $rows = ceil($tot / $cols);
102
103         for ($row = 0; $row < $rows; $row++) {
104             for ($col = 0; $col < $cols; $col++) {
105                 $cur = $row*$cols+$col;
106                 if ($photo = @$list[$cur]) {
107                     $selected = ($photo['file'] === $photo);
108                     if (is_null($photo['thumb'])) {
109                         $photo['thumb'] = $this->makeThumb($photo['file']);
110                     }
111                     $tpl->setVariable(
112                         array(
113                             'PHOTO' => $photo['file'],
114                             'DESC'  => $photo['desc'],
115                             'THUMB' => $photo['thumb'],
116                         )
117                     );
118                     $tpl->parse('ITEM');
119                 } else {
120                     if (!@$empty) {
121                         $tpl->replaceBlockFile('ITEM',
122                             'bife_album_emptyitem.html', true);
123                         $empty = true;
124                     }
125                     $tpl->touchBlock('ITEM');
126                     $tpl->parse('ITEM');
127                 }
128             }
129             $tpl->parse('FILA');
130         }
131         $tpl->setVariable('DESC', $this->getDescription());
132         return $tpl->get();
133     }
134
135     /**
136      * Shows a photo.
137      *
138      * Shows a photo.
139      *
140      * @param  string $photo Photo to show.
141      *
142      * @access public
143      * @since  rev 131
144      */
145     function photo($photo) {
146         list($path, $name, $ext) = File_Util::splitFilename($photo);
147         $tpl =& new HTML_Template_Sigma('.');
148         $tpl->loadTemplateFile('photo.html');
149         $tpl->setVariable(
150             array(
151                 'DESC'  => $name,
152                 'PHOTO' => $photo,
153             )
154         );
155         $tpl->show();
156     }
157
158     /**
159      * Makes a photo thumbnail.
160      *
161      * @param  string $photo Source photo to create the thumbnail.
162      * @param  int    $size  Maximum thumbnail size.
163      *
164      * @return bool   True on success, false on failure.
165      *
166      * @access public
167      * @since  rev 131
168      */
169     function makeThumb($photo, $size = 100) {
170         $format = $this->thumbsformat;
171         $thumb  = $this->getThumbName($photo);
172         list($path, $name, $ext) = File_Util::splitFilename($thumb);
173
174         $img =& Image_Transform::factory('GD');
175
176         $img->load($photo);
177         // If image is larger than the maximum size, we resize it.
178         if ($img->img_x > $size or $img->img_y > $size ) {
179             if (!is_dir($path) and !mkdir($path)) {
180                 return false;
181             }
182             if (PEAR::isError($img)) {
183                 return false;
184             }
185             if (!$img->scale($size)) {
186                 return false;
187             }
188         }
189         $img->save("$path/$name.$format", $format);
190         $img->free();
191
192         return true;
193     }
194
195     /**
196      * Gets a list of photos with their descriptions and thumbnails.
197      *
198      * Returns an array of associative arrays with this keys:
199      * <ul>
200      *  <li><b>file:</b> Photo filename.</li>
201      *  <li><b>desc:</b> Photo Description.</li>
202      *  <li><b>thumb:</b> Photo thumbnail filename.</li>
203      * </ul>
204      *
205      * @return array Array of associative arrays with file, desc and
206      *               thumb.
207      *
208      * @access public
209      */
210     function getList() {
211         $root = $this->root;
212         $exts = $this->exts;
213         $format = $this->thumbsformat;
214         $return = array();
215         
216         $d = dir($root);
217         while (($file = $d->read()) !== false) {
218             list($path, $name, $ext) = File_Util::splitFilename("$root/$file");
219             if (is_readable("$root/$file") and in_array($ext, $exts)) {
220                 $thumb = $this->getThumbName("$root/$file");
221                 $return[] = array(
222                     'file'  => "$root/$file",
223                     'desc'  => $name,
224                     'thumb' => is_readable($thumb) ? $thumb : null,
225                 );
226             }           
227         }
228         $d->close();
229
230         return $return;
231     }
232
233     /**
234      * Gets a photo thumbnail name.
235      *
236      * @param  string $photo Source photo to create the thumbnail.
237      *
238      * @return string Thumbnail name.
239      *
240      * @access public
241      * @since  rev 131
242      */
243     function getThumbName($photo) {
244         $root = $this->root;
245         $format = $this->thumbsformat;
246         $thumbsdir = $this->thumbsdir;
247
248         list($path, $name, $ext) = File_Util::splitFilename($photo);
249
250         return "$root/$thumbsdir/$name.$format";
251     }
252
253     /**
254      * Creates album thumbnails.
255      *
256      * @since  rev 147
257      * @access public
258      */
259     function createThumbs() {
260         foreach ($this->getList() as $photo) {
261             if (is_null($photo['thumb'])) {
262                $photo['thumb'] = $this->makeThumb($photo['file']);
263             }
264         }
265     }
266
267     /**
268      * Sets the album description.
269      *
270      * @param   string $desc New album description.
271      *
272      * @returns bool   True on success, false on failure.
273      *
274      * @since  rev 147
275      * @access public
276      */
277     function setDescription($desc) {
278         $root = $this->root;
279         $out  = fopen("$root/.album", 'w');
280         $ret  = fputs($out, $desc);
281         fclose($out);
282         return $ret ? true : false;
283     }
284
285     /**
286      * Gets the album description.
287      *
288      * @returns string Album description.
289      *
290      * @since  rev 149
291      * @access public
292      */
293     function getDescription() {
294         $root = $this->root;
295         return file_get_contents("$root/.album");
296     }
297
298 }
299
300 // $Id$
301 ?>