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