]> git.llucax.com Git - software/bife/bife-all.git/blob - src/BIFE/Album.php
- Added package.xml to make a PEAR package.
[software/bife/bife-all.git] / src / BIFE / Album.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 // +X2C Class 20 :Album
34 /**
35  * Photo album widget. [TODO: Make a better explanation]
36  *
37  * @access public
38  */
39 class BIFE_Album extends BIFE_Widget {
40     /**
41      * Attributes.
42      *
43      * @var    array $attrs
44      * @access public
45      */
46     var $attrs;
47
48     // ~X2C
49
50     // +X2C Operation 22
51     /**
52      * Constructor.
53      *
54      * @param  array $attrs Attributes.
55      *
56      * @return void
57      * @access public
58      */
59     function BIFE_Album($attrs) // ~X2C
60     {
61         $this->__construct($attrs);
62     }
63     // -X2C
64
65     // +X2C Operation 57
66     /**
67      * Constructor.
68      *
69      * @param  array $attrs Attributes.
70      *
71      * @return void
72      * @access public
73      */
74     function __construct($attrs) // ~X2C
75     {
76         // TODO - get defaults from an INI file.
77         $defaults = array(
78             'DIR'           => '.',
79             'RECURSIVE'     => true,
80             'THUMBSFORMAT'  => 'jpeg',
81             'THUMBSDIR'     => '.thumbs',
82             'EXTENSIONS'    => 'png,jpg,jpeg,PNG,JPG,JPEG',
83             'SELECTED'      => '',
84             'MAXROWS'       => 0,
85             'COLUMNS'       => 4,
86         );
87         $this->attrs = array_merge($defaults, $attrs);
88         $this->attrs['EXTENSIONS'] = explode(',', $this->attrs['EXTENSIONS']);
89     }
90     // -X2C
91
92     // +X2C Operation 23
93     /**
94      * Renders the widget.
95      *
96      * @param  HTML_Template_Sigma &$template Template to use to render the widget.
97      *
98      * @return string
99      * @access public
100      */
101     function render(&$template) // ~X2C
102     {
103         $template->loadTemplateFile('bife_album.html');
104         $template->addBlockFile('ITEMS', 'ITEM', 'bife_album_item.html');
105         $root = $this->attrs['DIR'];
106         $list = $this->getList();
107         $tot  = count($list);
108         $rows = ceil($tot / $this->attrs['COLUMNS']);
109         for ($row = 0; $row < $rows; $row++) {
110             for ($col = 0; $col < $this->attrs['COLUMNS']; $col++) {
111                 $cur = $row * $this->attrs['COLUMNS'] + $col;
112                 if ($photo = @$list[$cur]) {
113                     $selected = ($photo['file'] === $this->attrs['SELECTED']);
114                     if (is_null($photo['thumb'])) {
115                         $photo['thumb'] = $this->makeThumb($photo['file']);
116                     }
117                     // FIXME - Si no se pudo crear el thumb, devuelve null
118                     // (ver si se agrega otro template para indicar error
119                     // o algo asi).
120                     $template->setVariable(
121                         array(
122                             'PHOTO' => $photo['file'],
123                             'DESC'  => $photo['desc'],
124                             'THUMB' => $photo['thumb'],
125                         )
126                     );
127                     $template->parse('ITEM');
128                 } else {
129                     if (!@$empty) {
130                         $template->replaceBlockFile('ITEM',
131                             'bife_album_emptyitem.html', true);
132                         $empty = true;
133                     }
134                     $template->touchBlock('ITEM');
135                     $template->parse('ITEM');
136                 }
137             }
138             $template->parse('FILA');
139         }
140         $template->setVariable('DESC', $this->getDescription());
141         return $template->get();
142     }
143     // -X2C
144
145     // +X2C Operation 95
146     /**
147      * Gets a list of photos with their descriptions and thumbnails.
148 Returns an array of associative arrays with this keys:
149 <ul>
150 <li><b>file:</b> Photo filename.</li>
151 <li><b>desc:</b> Photo Description.</li>
152 <li><b>thumb:</b> Photo thumbnail filename.</li>
153 </ul>
154      *
155      * @return array
156      * @access protected
157      */
158     function getList() // ~X2C
159     {
160         $root = $this->attrs['DIR'];
161         $exts = $this->attrs['EXTENSIONS'];
162         $format = $this->attrs['THUMBSFORMAT'];
163         $return = array();
164         
165         $d = dir($root);
166         while (($file = $d->read()) !== false) {
167             list($path, $name, $ext) = $this->splitFilename("$root/$file");
168             if (is_readable("$root/$file") and in_array($ext, $exts)) {
169                 $thumb = $this->getThumbFilename("$root/$file");
170                 $return[] = array(
171                     'file'  => "$root/$file",
172                     'desc'  => $name,
173                     'thumb' => is_readable($thumb) ? $thumb : null,
174                 );
175             }           
176         }
177         $d->close();
178
179         return $return;
180     }
181     // -X2C
182
183     // +X2C Operation 97
184     /**
185      * Creates an image thumbnail, returning his filename.
186      *
187      * @param  string $filename Filename of the image to create the thumb.
188      * @param  int $size Maximum thumbnail size.
189      *
190      * @return string
191      * @access protected
192      */
193     function makeThumb($filename, $size = 100) // ~X2C
194     {
195         $format = $this->attrs['THUMBSFORMAT'];
196         $thumb = $this->getThumbFilename($filename);
197         list($path, $name, $ext) = $this->splitFilename($thumb);
198         $img =& Image_Transform::factory('GD');
199         $img->load($filename);
200         // If image is larger than the maximum size, we resize it.
201         if ($img->img_x > $size or $img->img_y > $size ) {
202             if (!@is_dir($path) and !@mkdir($path)) {
203                 return null;
204             }
205             if (PEAR::isError($img)) {
206                 return null;
207             }
208             if (!$img->scale($size)) {
209                 return null;
210             }
211         }
212         $img->save("$path/$name.$format", $format);
213         $img->free();
214
215         return $thumb;
216     }
217     // -X2C
218
219     // +X2C Operation 98
220     /**
221      * Returns the filename of an image thumb.
222      *
223      * @param  string $filename Filename of the image to get the thumb name.
224      *
225      * @return string
226      * @access protected
227      */
228     function getThumbFilename($filename) // ~X2C
229     {
230         $root = $this->attrs['DIR'];
231         $format = $this->attrs['THUMBSFORMAT'];
232         $thumbsdir = $this->attrs['THUMBSDIR'];
233
234         list($path, $name, $ext) = $this->splitFilename($filename);
235
236         return "$root/$thumbsdir/$name.$format";
237     }
238     // -X2C
239
240     // +X2C Operation 102
241     /**
242      * Returns the description of the album.
243      *
244      * @return string
245      * @access protected
246      */
247     function getDescription() // ~X2C
248     {
249         $root = $this->attrs['DIR'];
250         return @join('', file($file));
251     }
252     // -X2C
253
254     // +X2C Operation 100
255     /**
256      * Splits a filename returning an array with the path, name and extension.
257      *
258      * @param  string $filename Filename to split.
259      *
260      * @return array
261      * @access public
262      * @static
263      */
264     function splitFilename($filename) // ~X2C
265     {
266         $path = explode('/', $filename);
267         $file = array_pop($path);
268         $ext  = '';
269         if (strstr($file, '.')) {
270             preg_match('|([^/]+?)(\.([^\.]*))?$|', $file, $m);
271             $file = @$m[1] . ((@$m[2] == '.' ) ? '.' : '');
272             $ext  = @$m[3];
273         }
274         $dir = count($path) ? join('/', $path) : '';
275         return array($dir, $file, $ext);
276     }
277     // -X2C
278
279 } // -X2C Class :Album
280
281 ?>