2 /* vim: set expandtab tabstop=4 shiftwidth=4: */
3 // +----------------------------------------------------------------------+
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 // +----------------------------------------------------------------------+
19 // $Id: Page.php,v 1.5 2003/02/22 01:52:50 alan Exp $
21 // A Base Page Class for use with HTML_Template_Flexy
22 // You could write one of these which used another template engine.
26 require_once 'HTML/Template/Flexy.php' ;
27 require_once 'HTML/Template/Flexy/Factory.php' ;
30 * The Base Page class - extend and override the methods to implement your own pages.
36 class HTML_FlexyFramework_Page {
40 * the main Template name (which can include a body template)
42 * @var string template name
45 var $masterTemplate = "master.html";
47 * the body Template name
49 * @var string template name
52 var $template = "error.html";
59 * can be 'output', or 'data'
60 * used to set a default caching method
66 var $cacheMethod = '';
72 * cache store (PEAR's Cache Object Instance
73 * initialized at start
74 * set at output stage.
83 /* ---- Variables set by Page loader -------- */
88 * baseURL, that can be prefixed to URL's to ensure that they correctly relate to application
89 * (set by page loader)
95 * rootURL, the base installation directory - can be used to get images directories.
96 * (set by page loader)
102 * rootDir, the base installation directory - can be used to find relative files.
103 * (set by page loader)
109 * the full request string used by the getCacheID().
110 * (set by page loader)
114 var $request; // clean page request for page
116 * overrides for elements.
121 var $elements = array(); // key=>HTML_Template_Flexy_Element
124 * errors for elements
129 var $errors = array(); // key(element name)=>error message
133 * is the page being run from the command line?
140 * Arguments from cli if static $cli_opts is used.
145 var $cli_args = array(); // key(element name)=>error message
148 * Reference to the page loader
149 * @var type HTML_FlexyFramework -
153 var $bootLoader = false;
160 * The default page handler
161 * by default relays to get(), or post() methods depending on the request.
163 * Override this if you do not handle get or post differently.
166 * @param string request, the remainder of the request not handled by the object.
168 * @return none|string none = handled, string = redirect to another page = eg. data/list
172 function start($request,$isRedirect=false,$args=array())
174 $cli= HTML_Flexyframework::get()->cli;
175 if (!$cli && !$isRedirect && !empty($_SERVER["REQUEST_METHOD"]) && $_SERVER["REQUEST_METHOD"] == "POST") {
176 return $this->post($request,$args);
178 return $this->get($request,$args,$isRedirect);
182 * The get page handler
184 * Override this if you want to handle get requests
187 * @param string request, the remainder of the request not handled by the object.
189 * @return none|string none = handled, string = redirect to another page = eg. data/list
192 function get($request)
196 * The post page handler
198 * Override this if you want to handle get requests
201 * @param string request, the remainder of the request not handled by the object.
203 * @return none|string none = handled, string = redirect to another page = eg. data/list
206 function post($request)
210 * Authentication Check method
211 * Override this with a straight return for pages that do not require authentication
214 * a) redirects to login if authenticaiton fails
215 * b) checks to see if a isAdmin method exists on the auth object
216 * if it does see if the user is admin and let them in.
217 * otherwise access denied error is raised
222 * @return none or string redirection to another page.
237 * The master Output layer.
239 * compiles the template
240 * if no caching - just runs the template.
241 * otherwise stores it in the cache.
243 * you dont normally need to override this.
245 * called by the page loader.
254 if (!empty($this->cli)) {
258 /* output the body if no masterTemplate is set */
259 $options = HTML_FlexyFramework::get();
261 $type = isset($this->contentType) ? $this->contentType : 'text/html';
262 header('Content-Type: '.$type.';charset='.( empty($options->charset) ? 'UTF-8' : $options->charset ));
265 if (!$this->masterTemplate) {
266 return $this->outputBody();
268 /* master template */
271 $template_engine = new HTML_Template_Flexy();
272 $template_engine->compile($this->masterTemplate);
273 if (!$this->_cache || !$this->cacheMethod) {
274 $template_engine->outputObject($this,$this->elements);
278 $id = $this->_cache->generateID($this->getID());
279 $this->_cache->save($id, $template_engine->bufferedOutputObject($this,$this->elements));
280 echo $this->_cache->get($id);
284 * The body Output layer.
286 * compiles the template
287 * At present there is no caching in here.. - this may change latter..
289 * used by putting {outputBody} in the main template.
292 function outputBody() {
294 $template_engine = new HTML_Template_Flexy();
295 $template_engine->compile($this->template);
296 if ($this->elements) { /* BC crap! */
297 $this->elements = HTML_Template_Flexy_Factory::setErrors($this->elements,$this->errors);
299 $template_engine->elements = $this->elements;
300 $template_engine->outputObject($this,$this->elements);
306 * Do any Page Caching if $this->cacheMethod is set.
307 * You should also look at output caching by overriding the outputBody Method.
309 * Note that Caching is disabled in a number of situations.
310 * a) cacheMethod is empty
312 * c) if sess is set (Eg. if you are using sessions)
313 * d) useCache is not set in the [Cache] section of the config.
315 * utilizes $this->getCacheID() to
317 * @return none|boolean|string|int|object Description
318 * @access public|private
319 * @see see also methods.....
323 function getCache() {
324 if (!$this->cacheMethod) {
327 if ($_SERVER["REQUEST_METHOD"] == "POST") {
331 /* lets assume we can cache ourselves.. */
332 $coptions = PEAR::getStaticProperty('Cache','options');
336 if (empty($coptions['useCache'])) {
339 require_once 'Cache.php';
341 $this->_cache = new Cache($coptions['container'], $coptions);
342 $id = $this->_cache->generateID($this->getCacheID());
343 if ($_SERVER["REQUEST_METHOD"] == "POST") {
344 $this->_cache->flush($id);
347 if ($data = $this->_cache->get($id)) {
355 * Get a distinct Page Cache ID.
357 * By default this is the full request string
358 * override this to define a more precise string
360 * @return string distinct page id (eg. the request url)
364 function getCacheID() {
365 return $this->request;
371 * Utility method : get the Class name (used on templates)
373 * @return string class name
378 function getClass() {
379 return get_class($this);
382 * Utility method : get the Time taken to generate the page.
384 * @return string time in seconds..
390 $m = explode(' ',microtime());
391 $ff = HTML_FlexyFramework::get();
392 return sprintf('%0.2fs',($m[0] + $m[1]) - $ff->start)
393 . '/ Files ' . count(get_included_files());
398 * turn on off session - wrap long database queries or
399 * data processing with this to prevent locking
401 * @param int $state new session state - 0 = off, 1 = on
404 function sessionState($state)
406 static $ses_status = false;
409 if (!empty($_SERVER['PHP_AUTH_USER']) || php_sapi_name() == "cli") {
410 // do not do sessions if we are using http auth.
414 // session status is only php5.4 and up..
415 if (!defined('PHP_SESSION_ACTIVE')) {
416 define('PHP_SESSION_ACTIVE' , 1);
418 if(!function_exists('session_status')){
421 $ses_status = ($ses_status === false) ? session_status() : $ses_status;
423 if (PHP_SESSION_ACTIVE != $ses_status) {
429 session_write_close();
433 ini_set('session.use_only_cookies', false);
434 ini_set('session.use_cookies', false);
435 ini_set('session.use_trans_sid', false);
436 ini_set('session.cache_limiter', null);
439 // sometimes raises a notice - ps_files_cleanup_dir.
441 $this->dedupeSessionCookies();
446 function dedupeSessionCookies()
448 if (headers_sent()) {
453 foreach (headers_list() as $header) {
454 // Identify cookie headers
455 if (strpos($header, 'Set-Cookie:') === 0) {
456 $cookies[] = $header;
459 header_remove('Set-Cookie');
461 // Restore one copy of each cookie
462 foreach(array_unique($cookies) as $cookie) {
463 header($cookie, false);