]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MLIB/Tpl/FileDir.php
d2cb5c3dee25d33791a3d0ec3c6293fdcf467ae7
[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  * @note This class was originally created as a part of BIFE.
35  * @author Leandro Lucarella <luca@llucax.hn.org>
36  * @todo Add a global example and an explanation of the directory structure to
37  *       use, etc.
38  */
39 class MLIB_Tpl_FileDir extends /* implements */ MLIB_Tpl 
40 {
41     /**
42      * Root directory where template files are.
43      */
44     var $root = '.';
45
46     /**
47      * If it's true, it looks for template files in PHP's include_path.
48      */
49     var $useIncludePath = false;
50
51     /**
52      * Group of templates to use.
53      * In this implementation is a subdirectory in $root.
54      *
55      * @protected
56      */
57     var $group = '';
58
59     /**
60      * Constructor.
61      * For PHP4 backward compatibility.
62      *
63      * @copydoc __construct()
64      * @see __construct()
65      */
66     function MLIB_Tpl_FileDir($root = '.', $useIncludePath = false, $group = '')
67     {
68         $this->__construct($root, $useIncludePath, $group);
69     }
70
71     /**
72      * Constructor.
73      *
74      * @param root           Root directory where template files are.
75      * @param useIncludePath If it's true, it looks for template files in
76      *                       PHP's include_path.
77      * @param group          Group of templates to use (a subdirectory in
78      *                       root in this implementation).
79      *
80      * @todo Add an example.
81      */
82     function __construct($root = '.', $useIncludePath = false, $group = '')
83     {
84         $this->root           = $root;
85         $this->useIncludePath = $useIncludePath;
86         $this->pushGroup($group);
87     }
88
89     /**
90      * Parse a template returning the results.
91      * If $vars is an array, the {[keys]} are replaced with [values] ($val is ignored). 
92      * If is a string, {$vars} is replaced with $val.
93      *
94      * @copydoc MLIB_Tpl::parse()
95      * @todo Add an example.
96      */
97     function parse($name, $vars = '', $val = '', $group = null)
98     {
99         $tpl = $this->getFileContent($this->getFilename($name, $group));
100         if ($vars) {
101             if (is_string($vars)) {
102                 $vars = array($vars => $val);
103             }
104             foreach ($vars as $key => $val) {
105                 $keys[] = '{' . $key . '}';
106                 $vals[] = $val;
107             }
108             return str_replace($keys, $vals, $tpl);
109         } else {
110             return $tpl;
111         }
112     }
113
114     /**
115      * @copydoc MLIB_Tpl::pushGroup()
116      */
117     function pushGroup($group = '')
118     {
119         $this->group[] = $group;
120     }
121
122     /**
123      * @copydoc MLIB_Tpl::popGroup()
124      */
125     function popGroup()
126     {
127         return array_pop($this->group);
128     }
129
130     /**
131      * @copydoc MLIB_Tpl::getGroup()
132      */
133     function getGroup()
134     {
135         return end($this->group);
136     }
137
138     /**
139      * @copydoc MLIB_Tpl::exists()
140      */
141     function exists($name, $group = null)
142     {
143         $tpl = $this->getFileContent($this->getFilename($name, $group));
144         if (!$this->useIncludePath) {
145             return is_readable($file);
146         } else {
147             $include_path = array_unique(preg_split('/[:;]/', ini_get('include_path')));
148             foreach ($include_path as $path) {
149                 if (is_readable("$path/$file")) {
150                     return true;
151                 }
152             }
153             return false;
154         }
155     }
156
157     /**
158      * Returns the template filename.
159      * Returns the template filename based on the $name and the $group of the
160      * template. If $group is null it uses the current group in the groups
161      * stack.
162      *
163      * @param name  Tempate's name.
164      * @param group Group where to look for the template.
165      *
166      * @protected
167      * @return Filename.
168      */
169     function getFilename($name, $group = null)
170     {
171         $group = is_null($group) ? end($this->group) : $group;
172         if ($group) {
173             $file = "{$this->root}/$group/$name.tpl.html";
174         } else {
175             $file = "{$this->root}/$name.tpl.html";
176         }
177         return $file;
178     }
179
180     /**
181      * Returns the contents of a file as a string.
182      * It uses useIncludePath to search (or not) for the file in the PHP's
183      * include_path.
184      *
185      * @param filename Filename.
186      *
187      * @protected
188      * @return File contents as a string.
189      */
190     function getFileContent($filename)
191     {
192         return file_get_contents($filename, $this->useIncludePath);
193     }
194
195 }
196
197 ?>