]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MLIB/Tpl/FileDir.php
Se agrega la clase Widget y algunos derivados.
[mecon/meconlib.git] / lib / MLIB / Tpl / FileDir.php
1 <?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
2 -------------------------------------------------------------------------------
3                                     mlib
4 -------------------------------------------------------------------------------
5 This file is part of mlib.
6
7 mlib is free software; you can redistribute it and/or modify it under
8 the terms of the GNU Lesser General Public License as published by the Free
9 Software Foundation; either version 2 of the License, or (at your option)
10 any later version.
11
12 mlib is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 
15 details.
16  
17 You should have received a copy of the GNU Lesser General Public License; if 
18 not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
19 Boston, MA  02111-1307  USA
20 -------------------------------------------------------------------------------
21 Created: Wed Jun 17 19:03:14 2003
22 Authors: Leandro Lucarella <luca@lugmen.org.ar>
23 -------------------------------------------------------------------------------
24 $Id$
25 -----------------------------------------------------------------------------*/
26
27 require_once 'MLIB/Tpl.php';
28
29 /**
30  * FileDir is a class based on HIT (Hooks vs IT Template Engine).
31  * Hooks vs IT (HIT) is a simple template implementation, based on hooks and IT 
32  * template systems.
33  *
34  *
35  * @note This class was originally created as a part of BIFE.
36  * @author Leandro Lucarella <luca@llucax.hn.org>
37  * @todo Add a global example and an explanation of the directory structure to
38  *       use, etc.
39  */
40 class MLIB_Tpl_FileDir extends /* implements */ MLIB_Tpl 
41 {
42     /**
43      * Root directory where template files are.
44      */
45     var $root = '.';
46
47     /**
48      * If it's true, it looks for template files in PHP's include_path.
49      */
50     var $useIncludePath = false;
51
52     /**
53      * Group of templates to use.
54      * In this implementation is a subdirectory in $root.
55      *
56      * @protected
57      */
58     var $group = '';
59
60     /**
61      * Constructor.
62      * For PHP4 backward compatibility.
63      *
64      * @copydoc __construct()
65      * @see __construct()
66      */
67     function MLIB_Tpl_FileDir($root = '.', $useIncludePath = false, $group = '')
68     {
69         $this->__construct($root, $useIncludePath, $group);
70     }
71
72     /**
73      * Constructor.
74      *
75      * @param root           Root directory where template files are.
76      * @param useIncludePath If it's true, it looks for template files in
77      *                       PHP's include_path.
78      * @param group          Group of templates to use (a subdirectory in
79      *                       root in this implementation).
80      *
81      * @todo Add an example.
82      */
83     function __construct($root = '.', $useIncludePath = false, $group = '')
84     {
85         $this->root           = $root;
86         $this->useIncludePath = $useIncludePath;
87         $this->pushGroup($group);
88     }
89
90     /**
91      * Parse a template returning the results.
92      * If $vars is an array, the {[keys]} are replaced with [values] ($val is ignored). 
93      * If is a string, {$vars} is replaced with $val.
94      *
95      * @copydoc MLIB_Tpl::parse()
96      * @todo Add an example.
97      */
98     function parse($name, $vars = '', $val = '', $group = null)
99     {
100         $tpl = $this->getFileContent($this->getFilename($name, $group));
101         if ($vars) {
102             if (is_string($vars)) {
103                 $vars = array($vars => $val);
104             }
105             foreach ($vars as $key => $val) {
106                 $keys[] = '{' . $key . '}';
107                 $vals[] = $val;
108             }
109             return str_replace($keys, $vals, $tpl);
110         } else {
111             return $tpl;
112         }
113     }
114
115     /**
116      * Push a new item into the group array.
117      *
118      * @param group Item to be added on the group array.
119      *
120      * @todo Add an example.
121      */
122     function pushGroup($group = '')
123     {
124         $this->group[] = $group;
125     }
126
127     /**
128      * Pops the actual group from the group array.
129      *
130      * @return mixed.
131      * @todo Add an example.
132      */
133     function popGroup()
134     {
135         return array_pop($this->group);
136     }
137
138     /**
139      * Returns the last element of the group array.
140      *
141      * @return mixed.
142      * @todo Add an example.
143      */
144     function getGroup()
145     {
146         return end($this->group);
147     }
148
149     /**
150      * Checks if a certain template file exists.
151      *
152      * @param name Template file name.
153      * @param group If it is true, search in the group directory, otherwise
154      *              checks only in the root path.
155      *
156      * @return bool.
157      * @todo Add an example.
158      */
159     function exists($name, $group = null)
160     {
161         $tpl = $this->getFileContent($this->getFilename($name, $group));
162         if (!$this->useIncludePath) {
163             return is_readable($file);
164         } else {
165             $include_path = array_unique(preg_split('/[:;]/', ini_get('include_path')));
166             foreach ($include_path as $path) {
167                 if (is_readable("$path/$file")) {
168                     return true;
169                 }
170             }
171             return false;
172         }
173     }
174
175     /**
176      * Returns the template filename.
177      * Returns the template filename based on the $name and the $group of the
178      * template. If $group is null it uses the current group in the groups
179      * stack.
180      *
181      * @param name  Tempate's name.
182      * @param group Group where to look for the template.
183      *
184      * @protected
185      * @return Filename.
186      */
187     function getFilename($name, $group = null)
188     {
189         $group = is_null($group) ? end($this->group) : $group;
190         if ($group) {
191             $file = "{$this->root}/$group/$name.tpl.html";
192         } else {
193             $file = "{$this->root}/$name.tpl.html";
194         }
195         return $file;
196     }
197
198     /**
199      * Returns the contents of a file as a string.
200      * It uses useIncludePath to search (or not) for the file in the PHP's
201      * include_path.
202      *
203      * @param filename Filename.
204      *
205      * @protected
206      * @return File contents as a string.
207      */
208     function getFileContent($filename)
209     {
210         return file_get_contents($filename, $this->useIncludePath);
211     }
212
213 }
214
215 /**
216  * @example Tpl/FileDir/test.php
217  *
218  * This example will create an HTML page with a header, body and a footer.
219  * In order to do this, I will use three template groups (header, body, footer).
220  * All this templates are located in TPLS directory.
221  */
222
223 ?>