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