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