]> git.llucax.com Git - software/bife/bife-all.git/blob - album/BIFE/Album/Thumbs.php
Moved back to a clean bife directory. Each subdirectory has a module
[software/bife/bife-all.git] / album / BIFE / Album / Thumbs.php
1 <?php
2 // vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4:
3 // +--------------------------------------------------------------------+
4 // |                       BIFE - Buil It FastEr                        |
5 // +--------------------------------------------------------------------+
6 // | This file is part of BIFE.                                         |
7 // |                                                                    |
8 // | BIFE 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 // | BIFE 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: Wed May 17 18:16:54 ART 2003                              |
23 // | Authors: Leandro Lucarella <luca@lugmen.org.ar>                    |
24 // +--------------------------------------------------------------------+
25 //
26 // $Id$
27 //
28
29 // +X2C includes
30 require_once 'BIFE/Widget.php';
31 // ~X2C
32
33 require_once 'BIFE/Link.php';
34 require_once 'Image/Transform.php';
35
36 // +X2C Class 20 :Thumbs
37 /**
38  * Photo album widget. [TODO: Make a better explanation]
39  *
40  * @access public
41  */
42 class BIFE_Album_Thumbs extends BIFE_Widget {
43     // ~X2C
44
45     // +X2C Operation 22
46     /**
47      * Constructor.
48      *
49      * @param  array $attrs Attributes.
50      *
51      * @return void
52      * @access public
53      */
54     function BIFE_Album_Thumbs($attrs) // ~X2C
55     {
56         $this->__construct($attrs);
57     }
58     // -X2C
59
60     // +X2C Operation 57
61     /**
62      * Constructor.
63      *
64      * @param  array $attrs Attributes.
65      *
66      * @return void
67      * @access public
68      */
69     function __construct($attrs) // ~X2C
70     {
71         // TODO - get defaults from an INI file.
72         $defaults = array(
73             'DIR'           => '.',
74             'RECURSIVE'     => true,
75             'THUMBSFORMAT'  => 'jpeg',
76             'THUMBSDIR'     => '.thumbs',
77             'EXTENSIONS'    => 'png,jpg,jpeg,PNG,JPG,JPEG',
78             'MAXROWS'       => 0,
79             'COLUMNS'       => 4,
80             'LINK-BIFE'     => 'photo.xbf',
81             'LINK-URL'      => '',
82         );
83         $attrs = array_merge($defaults, $attrs);
84         $attrs['EXTENSIONS'] = explode(',', $attrs['EXTENSIONS']);
85         parent::__construct($attrs);
86     }
87     // -X2C
88
89     // +X2C Operation 23
90     /**
91      * Renders the widget.
92      *
93      * @param  HTML_Template_HIT &$template Template to use to render the widget.
94      *
95      * @return string
96      * @access public
97      */
98     function render(&$template) // ~X2C
99     {
100         $template->pushGroup('album');
101         $list = $this->getList();
102         $tot  = count($list);
103         $rows = ceil($tot / $this->attrs['COLUMNS']);
104         for ($row = 0; $row < $rows; $row++) {
105             for ($col = 0; $col < $this->attrs['COLUMNS']; $col++) {
106                 $cur = $row * $this->attrs['COLUMNS'] + $col;
107                 if ($photo = @$list[$cur]) {
108                     if (is_null($photo['THUMB'])) {
109                         $photo['THUMB'] = $this->makeThumb($photo['FILE']);
110                     }
111                     $photo['URL'] = BIFE_Link::getURL(
112                         array(
113                             'BIFE'                  => $this->attrs['LINK-BIFE'],
114                             'URL'                   => $this->attrs['LINK-URL'],
115                             'DATA-BIFE_ALBUM_FILE'  => $photo['FILE'],
116                         )
117                     );
118                     $cell = $template->parse('item', $photo);
119                 } else {
120                     $cell = $template->parse('empty');
121                 }
122                 $template->parseBuffered('cell', 'CONTENTS', $cell);
123             }
124             $template->parseBuffered('row', 'CONTENTS',
125                 $template->popBuffer('cell'));
126         }
127         $out = $template->parse('body', array(
128             'DESC'     => $this->getDescription(),
129             'CONTENTS' => $template->popBuffer('row')));
130         $template->popGroup();
131         return $out;
132     }
133     // -X2C
134
135     // +X2C Operation 95
136     /**
137      * Gets a list of photos with their descriptions and thumbnails.
138 Returns an array of associative arrays with this keys:
139 <ul>
140 <li><b>file:</b> Photo filename.</li>
141 <li><b>desc:</b> Photo Description.</li>
142 <li><b>thumb:</b> Photo thumbnail filename.</li>
143 </ul>
144      *
145      * @return array
146      * @access protected
147      */
148     function getList() // ~X2C
149     {
150         $root = $this->attrs['DIR'];
151         $exts = $this->attrs['EXTENSIONS'];
152         $format = $this->attrs['THUMBSFORMAT'];
153         $return = array();
154         $d = dir($root);
155         if ($d) {
156             while (($file = $d->read()) !== false) {
157                 list($path, $name, $ext) = $this->splitFilename("$root/$file");
158                 if (is_readable("$root/$file") and in_array($ext, $exts)) {
159                     $thumb = $this->getThumbFilename("$root/$file");
160                     $return[] = array(
161                         'FILE'  => "$root/$file",
162                         'DESC'  => $name,
163                         'THUMB' => is_readable($thumb) ? $thumb : null,
164                     );
165                 }               
166             }
167             $d->close();
168         }
169         return $return;
170     }
171     // -X2C
172
173     // +X2C Operation 97
174     /**
175      * Creates an image thumbnail, returning his filename.
176      *
177      * @param  string $filename Filename of the image to create the thumb.
178      * @param  int $size Maximum thumbnail size.
179      *
180      * @return string
181      * @access protected
182      */
183     function makeThumb($filename, $size = 100) // ~X2C
184     {
185         $format = $this->attrs['THUMBSFORMAT'];
186         $thumb = $this->getThumbFilename($filename);
187         list($path, $name, $ext) = $this->splitFilename($thumb);
188         $img =& Image_Transform::factory('GD');
189         $img->load($filename);
190         // If image is larger than the maximum size, we resize it.
191         if ($img->img_x > $size or $img->img_y > $size ) {
192             if (!@is_dir($path) and !@mkdir($path)) {
193                 return null;
194             }
195             if (PEAR::isError($img)) {
196                 return null;
197             }
198             if (!$img->scale($size)) {
199                 return null;
200             }
201         }
202         $img->save("$path/$name.$format", $format);
203         $img->free();
204
205         return $thumb;
206     }
207     // -X2C
208
209     // +X2C Operation 98
210     /**
211      * Returns the filename of an image thumb.
212      *
213      * @param  string $filename Filename of the image to get the thumb name.
214      *
215      * @return string
216      * @access protected
217      */
218     function getThumbFilename($filename) // ~X2C
219     {
220         $root = $this->attrs['DIR'];
221         $format = $this->attrs['THUMBSFORMAT'];
222         $thumbsdir = $this->attrs['THUMBSDIR'];
223
224         list($path, $name, $ext) = $this->splitFilename($filename);
225
226         return "$root/$thumbsdir/$name.$format";
227     }
228     // -X2C
229
230     // +X2C Operation 102
231     /**
232      * Returns the description of the album.
233      *
234      * @return string
235      * @access protected
236      */
237     function getDescription() // ~X2C
238     {
239         $root = $this->attrs['DIR'];
240         return @join('', file($file));
241     }
242     // -X2C
243
244     // +X2C Operation 100
245     /**
246      * Splits a filename returning an array with the path, name and extension.
247      *
248      * @param  string $filename Filename to split.
249      *
250      * @return array
251      * @access public
252      * @static
253      */
254     function splitFilename($filename) // ~X2C
255     {
256         $path = explode('/', $filename);
257         $file = array_pop($path);
258         $ext  = '';
259         if (strstr($file, '.')) {
260             preg_match('|([^/]+?)(\.([^\.]*))?$|', $file, $m);
261             $file = @$m[1] . ((@$m[2] == '.' ) ? '.' : '');
262             $ext  = @$m[3];
263         }
264         $dir = count($path) ? join('/', $path) : '';
265         return array($dir, $file, $ext);
266     }
267     // -X2C
268
269 } // -X2C Class :Thumbs
270
271 ?>