HTML/FlexyFramework/Page.php
[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
36 class HTML_FlexyFramework_Page  {
37
38
39     /**
40     * the main Template name (which can include a body template)
41     *
42     * @var string template name
43     * @access public
44     */
45     var $masterTemplate = "master.html";
46     /**
47     * the body Template name
48     *
49     * @var string template name
50     * @access public
51     */
52     var $template = "error.html";
53
54
55
56
57     /**
58     * cache method -
59     *   can be 'output', or 'data'
60     * used to set a default caching method
61     *
62     * @var string
63     * @access public
64     * @see getCache()
65     */
66     var $cacheMethod = '';
67
68
69
70
71    /**
72     * cache store (PEAR's Cache Object Instance
73     *   initialized at start
74     *   set at output stage.
75     *
76     * @var object
77     * @access private
78     * @see getCache()
79     */
80
81     var $_cache = NULL;
82
83     /* ---- Variables set by Page loader -------- */
84
85
86
87     /**
88     * baseURL, that can be prefixed to URL's to ensure that they correctly relate to application
89     * (set by page loader)
90     * @var string
91     * @access public
92     */
93     var $baseURL;
94     /**
95     * rootURL, the base installation directory - can be used to get images directories.
96     * (set by page loader)
97     * @var string
98     * @access public
99     */
100     var $rootURL;
101     /**
102     * rootDir, the base installation directory - can be used to find relative files.
103     * (set by page loader)
104     * @var string
105     * @access public
106     */
107     var $rootDir;
108     /**
109     * the full request string used by the getCacheID().
110     * (set by page loader)
111     * @var string
112     * @access public
113     */
114     var $request; // clean page request for page
115     /**
116     * overrides for elements.
117     *
118     * @var array
119     * @access public
120     */
121     var $elements = array(); // key=>HTML_Template_Flexy_Element
122
123      /**
124     * errors for elements
125     *
126     * @var array
127     * @access public
128     */
129     var $errors = array(); // key(element name)=>error message
130
131
132
133     /**
134     * Arguments from cli if static $cli_opts is used.
135     *
136     * @var array
137     * @access public
138     */
139     var $cli_args = array(); // key(element name)=>error message
140
141     /**
142      * Reference to the page loader
143      * @var type HTML_FlexyFramework -
144      *
145      */
146
147     var $bootLoader = false;
148
149
150
151     /**
152     * The default page handler
153     * by default relays to get(), or post() methods depending on the request.
154     *
155     * Override this if you do not handle get or post differently.
156     *
157     *
158     * @param   string  request, the remainder of the request not handled by the object.
159     *
160     * @return   none|string none = handled, string = redirect to another page = eg. data/list
161     * @access   public
162     */
163
164     function start($request,$isRedirect=false,$args=array())
165     {
166         $cli= HTML_Flexyframework::get()->cli;
167         if (!$cli && !$isRedirect && !empty($_SERVER["REQUEST_METHOD"]) && $_SERVER["REQUEST_METHOD"] == "POST") {
168             return $this->post($request,$args);
169         } else {
170             return $this->get($request,$args,$isRedirect);
171         }
172     }
173     /**
174     * The get page handler
175     *
176     * Override this if you want to handle get requests
177     *
178     *
179     * @param   string  request, the remainder of the request not handled by the object.
180     *
181     * @return   none|string none = handled, string = redirect to another page = eg. data/list
182     * @access   public
183     */
184     function get($request)
185     {
186     }
187      /**
188     * The post page handler
189     *
190     * Override this if you want to handle get requests
191     *
192     *
193     * @param   string  request, the remainder of the request not handled by the object.
194     *
195     * @return   none|string none = handled, string = redirect to another page = eg. data/list
196     * @access   public
197     */
198    function post($request)
199    {
200    }
201     /**
202     * Authentication Check method
203     * Override this with a straight return for pages that do not require authentication
204     *
205     * By default
206     *   a) redirects to login if authenticaiton fails
207     *   b) checks to see if a isAdmin method exists on the auth object
208     *       if it does see if the user is admin and let them in.
209     *       otherwise access denied error is raised
210     *   c) lets them in.
211     *
212     *
213     *
214     * @return   none or string redirection to another page.
215     * @access   public
216     */
217
218     function getAuth() {
219
220
221         return false;
222
223     }
224
225
226
227
228     /**
229     * The master Output layer.
230     *
231     * compiles the template
232     * if no caching - just runs the template.
233     * otherwise stores it in the cache.
234     *
235     * you dont normally need to override this.
236     *
237     * called by the page loader.
238     * @access   public
239     */
240
241
242
243     function output()
244     {
245         print_r('break template');exit;
246         if (!empty($this->cli)) {
247             return;
248         }
249
250         /* output the body if no masterTemplate is set */
251         $options = HTML_FlexyFramework::get();
252
253         $type = isset($this->contentType) ? $this->contentType : 'text/html';
254         header('Content-Type: '.$type.';charset='.( empty($options->charset) ? 'UTF-8' : $options->charset ));
255
256
257         if (!$this->masterTemplate) {
258             return $this->outputBody();
259         }
260         /* master template */
261
262
263         $template_engine = new HTML_Template_Flexy();
264         $template_engine->compile($this->masterTemplate);
265         if (!$this->_cache || !$this->cacheMethod) {
266             $template_engine->outputObject($this,$this->elements);
267             return;
268         }
269
270         $id = $this->_cache->generateID($this->getID());
271         $this->_cache->save($id, $template_engine->bufferedOutputObject($this,$this->elements));
272         echo $this->_cache->get($id);
273
274     }
275     /**
276     * The body Output layer.
277     *
278     * compiles the template
279     * At present there is no caching in here..  - this may change latter..
280     *
281     * used by putting {outputBody} in the main template.
282     * @access   public
283     */
284     function outputBody() {
285
286         $template_engine = new HTML_Template_Flexy();
287         $template_engine->compile($this->template);
288         if ($this->elements) { /* BC crap! */
289             $this->elements = HTML_Template_Flexy_Factory::setErrors($this->elements,$this->errors);
290         }
291         $template_engine->elements = $this->elements;
292         $template_engine->outputObject($this,$this->elements);
293
294     }
295
296
297      /**
298     * Do any Page Caching if $this->cacheMethod is set.
299     * You should also look at output caching by overriding the outputBody Method.
300     *
301     * Note that Caching is disabled in a number of situations.
302     *   a) cacheMethod is empty
303     *   b) POST requests
304     *   c) if sess is set (Eg. if you are using sessions)
305     *   d) useCache is not set in the [Cache] section of the config.
306     *
307     * utilizes $this->getCacheID() to
308     *
309     * @return   none|boolean|string|int|object    Description
310     * @access   public|private
311     * @see      see also methods.....
312     */
313
314
315     function getCache() {
316         if (!$this->cacheMethod) {
317             return;
318         }
319         if ($_SERVER["REQUEST_METHOD"] == "POST") {
320             return;
321         }
322
323         /* lets assume we can cache ourselves.. */
324         $coptions = PEAR::getStaticProperty('Cache','options');
325         if (!$coptions) {
326             return;
327         }
328         if (empty($coptions['useCache'])) {
329             return;
330         }
331         require_once 'Cache.php';
332
333         $this->_cache = new Cache($coptions['container'], $coptions);
334         $id = $this->_cache->generateID($this->getCacheID());
335         if ($_SERVER["REQUEST_METHOD"] == "POST") {
336             $this->_cache->flush($id);
337             return;
338         }
339         if ($data = $this->_cache->get($id)) {
340             echo $data;
341             return TRUE;
342         }
343
344     }
345
346     /**
347     * Get a distinct Page Cache ID.
348     *
349     * By default this is the full request string
350     * override this to define a more precise string
351     *
352     * @return   string   distinct page id (eg. the request url)
353     * @access   private
354     */
355
356     function getCacheID() {
357         return  $this->request;
358
359     }
360
361
362     /**
363     * Utility method : get the Class name (used on templates)
364     *
365     * @return   string   class name
366     * @access   public
367     */
368
369
370     function getClass() {
371         return get_class($this);
372     }
373     /**
374     * Utility method : get the Time taken to generate the page.
375     *
376     * @return   string   time in seconds..
377     * @access   public
378     */
379
380     function getTime() {
381
382         $m = explode(' ',microtime());
383         $ff =  HTML_FlexyFramework::get();
384         return sprintf('%0.2fs',($m[0] + $m[1]) -  $ff->start)
385                 . '/ Files ' . count(get_included_files());
386
387
388     }
389     /**
390      * turn on off session - wrap long database queries or
391      * data processing with this to prevent locking
392      * @see
393      * @param int $state new session state - 0 = off, 1 = on
394      */
395
396     function sessionState($state)
397     {
398         static $ses_status = false;
399         static $ini = false;
400         // session status is only php5.4 and up..
401         if (!defined('PHP_SESSION_ACTIVE')) {
402             define('PHP_SESSION_ACTIVE' , 1);
403         }
404         if(!function_exists('session_status')){
405              $ses_status = 1;
406         } else {
407             $ses_status = ($ses_status === false) ? session_status() : $ses_status;
408         }
409         if (PHP_SESSION_ACTIVE != $ses_status) {
410             return;
411         }
412
413         switch ($state) {
414             case 0:
415                 session_write_close();
416                 return;
417             case 1:
418                 if ($ini) {
419                     ini_set('session.use_only_cookies', false);
420                     ini_set('session.use_cookies', false);
421                     ini_set('session.use_trans_sid', false);
422                     ini_set('session.cache_limiter', null);
423                 }
424                 $ini = true;
425                 // sometimes raises a notice - ps_files_cleanup_dir.
426                 @session_start();
427                 return;
428         }
429     }
430
431 }