Manage CSS path with LStemplate
[ldapsaisie.git] / public_html / includes / class / class.LStemplate.php
1 <?php
2 /*******************************************************************************
3  * Copyright (C) 2007 Easter-eggs
4  * http://ldapsaisie.labs.libre-entreprise.org
5  *
6  * Author: See AUTHORS file in top-level directory.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License version 2
10  * as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20
21 ******************************************************************************/
22
23 /** 
24  * Manage template
25  *
26  * This class is use to manage template in LdapSaisie.
27  *
28  * @author Benjamin Renard <brenard@easter-eggs.com>
29  */
30 class LStemplate {
31
32   /**
33    * LStemplate configuration
34    *
35    * array(
36    *   'smarty_path' => '/path/to/Smarty.php',
37    *   'template_dir' => '/path/to/template/directory',
38    *   'image_dir' => '/path/to/image/directory',
39    *   'css_dir' => '/path/to/css/directory',
40    *   'compile_dir' => '/path/to/compile/directory',
41    *   'debug' => True,
42    *   'debug_smarty' => True
43    * ) 
44    *
45    **/
46   private static $config = array (
47     'smarty_path' => 'smarty/libs/Smarty.class.php',
48     'template_dir' => 'templates',
49     'image_dir' => 'images',
50     'css_dir' => 'css',
51     'compile_dir' => 'tmp',
52     'debug' => False,
53     'debug_smarty' => False
54   );
55
56   // Smarty object
57   public static $_smarty = NULL;
58   
59   // Smarty version
60   private static $_smarty_version = NULL;
61
62   // Array of directories
63   private static $directories = array(
64                                   'local',
65                                   LS_THEME
66                                 );
67
68  /**
69   * Start LStemplate
70   *
71   * Set configuration from parameter $config and initialize
72   * Smarty object.
73   *
74   * @param[in] $config array LStemplate configuration
75   *
76   * @retval boolean True on success, False instead
77   **/
78   public static function start($config) {
79     foreach ($config as $key => $value) {
80       self :: $config[$key] = $value;
81     }
82
83     if (LSsession :: includeFile(self :: $config['smarty_path'])) {
84       self :: $_smarty = new Smarty();
85       self :: $_smarty -> template_dir = self :: $config['template_dir'];
86
87       if ( ! is_writable(self :: $config['compile_dir']) ) {
88         die(_('LStemplate : compile directory is not writable (dir : '.self :: $config['compile_dir'].')'));
89       }
90       self :: $_smarty -> compile_dir = self :: $config['compile_dir'];
91
92       if (self :: $config['debug']) {
93         self :: $_smarty -> caching = 0;
94         // cache files are always regenerated
95         self :: $_smarty -> force_compile = TRUE;
96         // recompile template if it is changed
97         self :: $_smarty -> compile_check = TRUE;
98         if (self :: $config['debug_smarty']) {
99           // debug smarty
100           self :: $_smarty -> debugging = true;
101         }
102       }
103
104       if (method_exists(self :: $_smarty,'register_function')) {
105         self :: $_smarty_version=2;
106         if (!LSsession :: loadLSclass('LStemplate_smarty2_support')) {
107           die(_("LStemplate : Can't load Smarty 2 support file"));
108         }
109
110       }
111       elseif (method_exists(self :: $_smarty,'registerPlugin')) {
112         self :: $_smarty_version=3;
113         if (!LSsession :: loadLSclass('LStemplate_smarty3_support')) {
114           die(_("LStemplate : Can't load Smarty 3 support file"));
115         }
116       }
117       else {
118         die(_("LStemplate : Smarty version not recognized."));
119       }
120
121       return True;
122     }
123     else {
124       die(_("LStemplate : Can't load Smarty."));
125       return False;
126     }
127   }
128
129  /**
130   * Return the path of the file to use
131   *
132   * @param[in] string $name The file name (eg: mail.png)
133   * @param[in] string $root_dir The root directory (eg: images)
134   * @param[in] string $default_dir The default directory (eg: default)
135   *
136   * @retval string The path of the file
137   **/
138   public static function getFilePath($file,$root_dir,$default_dir='default') {
139     foreach(self :: $directories as $dir) {
140       if (file_exists($root_dir.'/'.$dir.'/'.$file)) {
141         return $root_dir.'/'.$dir.'/'.$file;
142       }
143     }
144     if (!$default_dir) {
145       return;
146     }
147     return $root_dir.'/'.$default_dir.'/'.$file;
148   }
149
150  /**
151   * Return the path of the image file to use
152   *
153   * @param[in] string $image The image name (eg: mail)
154   *
155   * @retval string The path of the image file
156   **/
157   public static function getImagePath($image) {
158     $exts=array('png','gif','jpg');
159     foreach($exts as $ext) {
160       $path=self :: getFilePath("$image.$ext",self :: $config['image_dir'],False);
161       if ($path) return $path;
162     }
163     return self :: $config['image_dir']."/default/$image.png";
164   }
165
166  /**
167   * Return the path of the CSS file to use
168   *
169   * @param[in] string $css The CSS name (eg: main.css)
170   *
171   * @retval string The path of the CSS file
172   **/
173   public static function getCSSPath($css) {
174     return self :: getFilePath($css,self :: $config['css_dir']);
175   }
176
177  /**
178   * Return the path of the Smarty template file to use
179   *
180   * @param[in] string $template The template name (eg: top.tpl)
181   *
182   * @retval string The path of the Smarty template file
183   **/
184   public static function getTemplatePath($template) {
185     return self :: getFilePath($template,self :: $config['template_dir']);
186   }
187
188  /**
189   * Return the content of a Smarty template file.
190   *
191   * @param[in] string $template The template name (eg: top.tpl)
192   *
193   * @retval string The content of the Smarty template file
194   **/
195   public static function getTemplateSource($template) {
196     $tpl_path=self :: getTemplatePath($template);
197     if (!is_readable($tpl_path)) {
198       $tpl_path=self :: getTemplatePath('empty.tpl');
199       LSerror::addErrorCode('LStemplate_01',$template);
200     }
201     return implode('',file($tpl_path));
202   }
203
204  /**
205   * Return the timestamp of the last change of a Smarty
206   * template file.
207   *
208   * @param[in] string $template The template name (eg: top.tpl)
209   *
210   * @retval string The timestamp of the last change of the Smarty template file
211   **/
212   public static function getTemplateTimestamp($template) {
213     $tpl_path=self :: getTemplatePath($template);
214     if (is_file($tpl_path)) {
215       $time=filemtime($tpl_path);
216       if ($time)
217         return $time;
218     }
219     return NULL;
220   }
221
222  /**
223   * Assign template variable
224   *
225   * @param[in] string $name The variable name
226   * @param[in] mixed $value The variable value
227   *
228   * @retval void
229   **/
230   public static function assign($name,$value) {
231     return self :: $_smarty -> assign($name,$value);
232   }
233
234  /**
235   * Display a template
236   *
237   * @param[in] string $template The template name (eg: empty.tpl)
238   *
239   * @retval void
240   **/
241   public static function display($template) {
242     return self :: $_smarty -> display("ls:$template");
243   }
244
245  /**
246   * Fetch a template
247   *
248   * @param[in] string $template The template name (eg: empty.tpl)
249   *
250   * @retval string The template compiled
251   **/
252   public static function fetch($template) {
253     return self :: $_smarty -> fetch("ls:$template");
254   }
255
256 }
257
258 function LStemplate_smarty_getFData($params) {
259     extract($params);
260     echo getFData($format,$data,$meth=NULL);
261 }
262
263 function LStemplate_smarty_tr($params) {
264   extract($params);
265   echo __($msg);
266 }
267
268 function LStemplate_smarty_img($params) {
269   extract($params);
270   echo "image.php?i=$name";
271 }
272
273 function LStemplate_smarty_css($params) {
274   extract($params);
275   echo LStemplate :: getCSSPath($name);
276 }
277
278 // Errors
279 LSerror :: defineError('LStemplate_01',
280 _("LStemplate : Template %{file} not found.")
281 );