upload
[pear] / HTML / FlexyFramework / Page.php
1 <?php
2 /* vim: set expandtab tabstop=4 shiftwidth=4: */
3 // +----------------------------------------------------------------------+
4 // | PHP Version 4                                                        |
5 // +----------------------------------------------------------------------+
6 // | Copyright (c) 1997-2002 The PHP Group                                |
7 // +----------------------------------------------------------------------+
8 // | This source file is subject to version 2.02 of the PHP license,      |
9 // | that is bundled with this package in the file LICENSE, and is        |
10 // | available at through the world-wide-web at                           |
11 // | http://www.php.net/license/2_02.txt.                                 |
12 // | If you did not receive a copy of the PHP license and are unable to   |
13 // | obtain it through the world-wide-web, please send a note to          |
14 // | license@php.net so we can mail you a copy immediately.               |
15 // +----------------------------------------------------------------------+
16 // | Authors:  Alan Knowles <alan@akbkhome.com>                           |
17 // +----------------------------------------------------------------------+
18 //
19 // $Id: Page.php,v 1.5 2003/02/22 01:52:50 alan Exp $
20 //
21 // A Base Page Class for use with HTML_Template_Flexy 
22 // You could write one of these which used another template engine.
23 //
24
25
26 require_once 'HTML/Template/Flexy.php' ;
27 require_once 'HTML/Template/Flexy/Factory.php' ;
28
29 /**
30 * The Base Page class - extend and override the methods to implement your own pages.
31 *
32 *
33 */
34
35 class HTML_FlexyFramework_Page  {
36     
37     
38     /**
39     * the main Template name (which can include a body template)
40     *
41     * @var string template name
42     * @access public
43     */
44     var $masterTemplate = "master.html"; 
45     /**
46     * the body Template name
47     *
48     * @var string template name
49     * @access public
50     */
51     var $template = "error.html";
52         
53    
54      
55     
56     /**
57     * cache method - 
58     *   can be 'output', or 'data'
59     * used to set a default caching method
60     *
61     * @var string
62     * @access public
63     * @see getCache()
64     */
65     var $cacheMethod = '';
66     
67      
68     
69     
70    /**
71     * cache store (PEAR's Cache Object Instance
72     *   initialized at start
73     *   set at output stage.
74     *
75     * @var object
76     * @access private
77     * @see getCache()
78     */
79    
80     var $_cache = NULL; 
81     
82     /* ---- Variables set by Page loader -------- */
83     
84    
85         
86     /**
87     * baseURL, that can be prefixed to URL's to ensure that they correctly relate to application
88     * (set by page loader)
89     * @var string
90     * @access public
91     */
92     var $baseURL; 
93     /**
94     * rootURL, the base installation directory - can be used to get images directories.
95     * (set by page loader)
96     * @var string
97     * @access public
98     */
99     var $rootURL; 
100     /**
101     * the full request string used by the getCacheID().
102     * (set by page loader)
103     * @var string
104     * @access public
105     */
106     var $request; // clean page request for page
107     /**
108     * overrides for elements.
109     *  
110     * @var array
111     * @access public
112     */
113     var $elements = array(); // key=>HTML_Template_Flexy_Element
114    
115      /**
116     * errors for elements
117     *  
118     * @var array
119     * @access public
120     */
121     var $errors = array(); // key(element name)=>error message
122    
123     /**
124     * The default page handler
125     * by default relays to get(), or post() methods depending on the request.
126     *
127     * Override this if you do not handle get or post differently.
128     * 
129     * 
130     * @param   string  request, the remainder of the request not handled by the object.
131     *
132     * @return   none|string none = handled, string = redirect to another page = eg. data/list
133     * @access   public
134     */
135   
136     function start($request,$isRedirect=false,$args=array()) 
137     { 
138         if (!$isRedirect && !empty($_SERVER["REQUEST_METHOD"]) && $_SERVER["REQUEST_METHOD"] == "POST") {
139             return $this->post($request,$args);
140         } else {
141             return $this->get($request,$args);
142         }
143     }
144     /**
145     * The get page handler
146     *
147     * Override this if you want to handle get requests 
148     * 
149     * 
150     * @param   string  request, the remainder of the request not handled by the object.
151     *
152     * @return   none|string none = handled, string = redirect to another page = eg. data/list
153     * @access   public
154     */
155     function get($request) 
156     {
157     }
158      /**
159     * The post page handler
160     *
161     * Override this if you want to handle get requests 
162     * 
163     * 
164     * @param   string  request, the remainder of the request not handled by the object.
165     *
166     * @return   none|string none = handled, string = redirect to another page = eg. data/list
167     * @access   public
168     */
169    function post($request) 
170    {
171    }
172     /**
173     * Authentication Check method
174     * Override this with a straight return for pages that do not require authentication
175     *
176     * By default 
177     *   a) redirects to login if authenticaiton fails
178     *   b) checks to see if a isAdmin method exists on the auth object
179     *       if it does see if the user is admin and let them in.
180     *       otherwise access denied error is raised
181     *   c) lets them in.
182     * 
183     * 
184     *
185     * @return   none or string redirection to another page.
186     * @access   public
187     */
188  
189     function getAuth() {
190          
191         
192         return false;
193         
194     }
195     
196   
197     
198      
199     /**
200     * The master Output layer.
201     * 
202     * compiles the template
203     * if no caching - just runs the template.
204     * otherwise stores it in the cache.
205     * 
206     * you dont normally need to override this.
207     * 
208     * called by the page loader.
209     * @access   public
210     */
211     
212     
213     
214     function output() 
215     {
216         /* output the body if no masterTemplate is set */
217         $options = PEAR::getStaticProperty('HTML_FlexyFramework','options');
218         
219         
220         header('Content-Type: text/html;charset='.( empty($options['charset']) ? 'UTF-8' : $options['charset'] ));
221         
222          
223         if (!$this->masterTemplate) {
224             return $this->outputBody();
225         }
226         /* master template */
227         
228        
229         $template_engine = new HTML_Template_Flexy();
230         $template_engine->compile($this->masterTemplate);
231         if (!$this->_cache || !$this->cacheMethod) {\r
232             $template_engine->outputObject($this,$this->elements);
233             return;
234         }
235         
236         $id = $this->_cache->generateID($this->getID());
237         $this->_cache->save($id, $template_engine->bufferedOutputObject($this,$this->elements));
238         echo $this->_cache->get($id);
239         
240     }
241     /**
242     * The body Output layer.
243     * 
244     * compiles the template
245     * At present there is no caching in here..  - this may change latter..
246     * 
247     * used by putting {outputBody} in the main template.
248     * @access   public
249     */    
250     function outputBody() {
251
252         $template_engine = new HTML_Template_Flexy();
253         $template_engine->compile($this->template);
254         if ($this->elements) { /* BC crap! */
255             $this->elements = HTML_Template_Flexy_Factory::setErrors($this->elements,$this->errors);
256         }
257         $template_engine->elements = $this->elements;
258         $template_engine->outputObject($this,$this->elements);
259         
260     }
261     
262    
263      /**
264     * Do any Page Caching if $this->cacheMethod is set.
265     * You should also look at output caching by overriding the outputBody Method.
266     *
267     * Note that Caching is disabled in a number of situations.
268     *   a) cacheMethod is empty
269     *   b) POST requests
270     *   c) if sess is set (Eg. if you are using sessions)
271     *   d) useCache is not set in the [Cache] section of the config.
272     * 
273     * utilizes $this->getCacheID() to  
274     *
275     * @return   none|boolean|string|int|object    Description
276     * @access   public|private
277     * @see      see also methods.....
278     */
279   
280     
281     function getCache() {
282         if (!$this->cacheMethod) {
283             return;
284         }
285         if ($_SERVER["REQUEST_METHOD"] == "POST") {
286             return;
287         } 
288          
289         /* lets assume we can cache ourselves.. */
290         $coptions = PEAR::getStaticProperty('Cache','options');
291         if (!$coptions) {
292             return;
293         }
294         if (empty($coptions['useCache'])) {
295             return;
296         }
297         require_once 'Cache.php';
298         
299         $this->_cache = new Cache($coptions['container'], $coptions);
300         $id = $this->_cache->generateID($this->getCacheID());
301         if ($_SERVER["REQUEST_METHOD"] == "POST") {
302             $this->_cache->flush($id);
303             return;
304         }
305         if ($data = $this->_cache->get($id)) {
306             echo $data;
307             return TRUE;
308         }
309     
310     }
311     
312     /**
313     * Get a distinct Page Cache ID. 
314     *
315     * By default this is the full request string
316     * override this to define a more precise string 
317     *
318     * @return   string   distinct page id (eg. the request url)
319     * @access   private
320     */
321   
322     function getCacheID() {
323         return  $this->request;
324         
325     }
326     
327     
328     /**
329     * Utility method : get the Class name (used on templates)
330     *
331     * @return   string   class name
332     * @access   public
333     */
334     
335     
336     function getClass() {
337         return get_class($this);
338     }
339     /**
340     * Utility method : get the Time taken to generate the page.
341     *
342     * @return   string   time in seconds..
343     * @access   public
344     */
345     
346     function getTime() {
347          
348         $m = explode(' ',microtime());
349         return sprintf('%0.2fs',($m[0] + $m[1]) -  HTML_FlexyFramework::get()->start)
350                 . '/ Files ' . count(get_included_files());
351     
352     
353     }
354     
355 }
356
357