4 * @package html Output class
5 * @desc the God class. It does everything, from database initialization
6 * to error reporting and page buffering. <- yeah it might be stupid
8 * @public the smarty template class instance and the theme path
9 * @private the page identification
12 class tsPage
extends Output
{
23 * the constructor that does it all.
24 * starts output buffering, and initializes different things
27 public function __construct(){
28 $prevOutput = ob_get_clean(); // errors previous to the tsPage init
30 // $this->output = $this->setOutput();
31 // Override standard string functions
32 if (extension_loaded('mbstring')) {
33 ini_set('mbstring.func_overload', 7);
36 // $this->time['start'] = microtime (true);
38 // set_error_handler(array(&$this, 'triggerError'));
39 // commented in the light of the xdebug profiling -
40 // dropped loading times by almost one order of magnitude
41 // maybe it was just my imagination
42 if (!empty($prevOutput)) {
43 $this->errors
= "\n".'<!-- output previous init at '.date('G:i:s').' -->'."\n".$prevOutput."\n";
56 // function __destruct(){
57 //// $this->db->close();
60 private function connectDb () {
61 $this->db
= sqlFactory
::connect(DB_TYPE
);
63 if (defined ('DB_NAME') && DB_NAME
&& !empty($this->db
->link
)) {
64 $this->db
->selectDatabase(DB_NAME
);
72 * function to redirect the client
76 * @param bool $onlyJScript
78 static public function redirect($url, $die = true, $onlyJScript = false) {
79 if ($onlyJScript == true ||
headers_sent()) {
80 printf ('<?xml version="1.0" encoding="utf-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"><head><title>Redirect</title><meta http-equiv="Refresh" content="0;url=%s" /></head><body onload="try {self.location.href=\'%s\' } catch(e) {}"><p><a href="%s">REDIRECTING - PLEASE CLICK HERE !</a></p></body></html>', $url, $url, $url);
83 header ('Location: '.str_replace('&', '&', $url));
90 // FIXME: I should stop using REQUEST for getting get and post variables !!!
91 static public function getRequest($varName = null) {
92 if (is_null($varName))
94 if (isset($_REQUEST[$varName]))
95 return $_REQUEST[$varName];
101 * function to generate URLs compatible with tsPage
103 * @param string $whereTo the page name
104 * @param string $varVal additional params
105 * @param string $method [get|TODO post]
108 static public function setRequest ($whereTo = null, $varVal = null, $method = 'get'){
109 if (!empty($whereTo))
110 $whereTo = NAV_VAR
. '=' . $whereTo;
112 if (is_array($varVal)) {
113 foreach ($varVal as $key => $val){
114 if (is_numeric($key) && stristr ($val, '#')) {
115 // probably an href with id in it
118 $tArr[] = $key.(!empty($val) ?
'='.$val : '');
121 $retUrl = implode ('&', $tArr).$end;
122 } elseif (is_string($varVal)){
128 if ($method == 'get'){
129 if (!empty ($whereTo) && !empty ($retUrl) )
131 $outStr .= '/?' . $whereTo . $retUrl;
137 public function setTheme (){
140 $this->themePath
= THEME_PATH
. $this->theme
;
141 if (!is_dir($this->themePath
)) {
142 $this->theme
= DEFAULT_THEME
;
143 $this->themePath
= THEME_PATH
. $this->theme
;
146 $this->setThemeCookie();
149 private function setThemeCookie () {
150 if (empty ($_COOKIE['theme']) ||
$_COOKIE['theme'] != $this->theme
) {
151 $test = setcookie ('theme', $this->theme
, time()+
1296000, '/');
155 private function reportErrors (){
156 if (!stristr (C_SYSTEM_DEBUG_IPS
, $_SERVER['REMOTE_ADDR'])) {
159 if (!empty ($this->errors
)) {
160 $errors = $this->errors
;
161 $this->errors
= '<!-- ERRORS: '.get_class($this).' at '.date('G:i:s').'-->'."\n".$errors;
164 if (defined ('ERROR_LEVEL') && ERROR_LEVEL
== 9 )
165 $this->errors
.= "\n".var_export (debug_backtrace(), true);
166 switch (C_SYSTEM_DEBUG_METHOD
){
168 $this->smarty
->assign('errors', $this->errors
);
172 $mailMsg = $this->errors
;
173 // mail (DEBUG_MAIL,'DEBUG:',$mailMsg);
180 public function triggerError($errNo=0, $errStr='', $errFile='', $errLine=''){
181 if (empty($this->errors
)){
182 $this->errors
= "\n";
183 // if (is_a($this->smarty,'Smarty'))
184 // $this->smarty->assign('errors', var_export($this->errors));
188 $errType = 'WARNING';
193 case (256): // errNo = 4
194 $errType = 'USER_ERROR';
196 case (512): // errNo = 8
197 $errType = 'USER_WARNING';
199 case (1024): // errNo = 16
200 $errType = 'USER_NOTICE';
202 case (2048): // errNo = 16
203 $errType = 'USER_ERROR';
205 // case (4096): // errNo = 16
212 $baseColor = array('R'=>100,'G'=>16,'B'=>16);
213 $color = (string)dechex($baseColor['R']+
40 * (log($errNo, 2))).(string)dechex($baseColor['G']+
(20 - 4*log($errNo, 2))*(log($errNo, 2))).(string)dechex($baseColor['B']+
(20 - 4*log($errNo, 2))*(log($errNo, 2)));
215 $baseColor = array('R'=>16,'G'=>16,'B'=>100);
216 $errNo = $errNo / 128;
217 $color = (string)dechex($baseColor['R']+
(20 - 4*log($errNo, 2)) * (log($errNo, 2))).(string)dechex($baseColor['G']+
(20 - 4*log($errNo, 2))*(log($errNo, 2))).(string)dechex($baseColor['B']+
40*(log($errNo, 2)));
220 $this->errors
.= '<span style="color:#'.strtoupper($color).'">';
221 $this->errors
.= '<b>'.$errType.'</b> '.$errStr;
222 if (false || tsPage
::getRequest('bt') == 'full') {
223 $this->errors
.= ' at line '.$errLine.' in file '.$errFile;
224 // $t = debug_backtrace();
225 // $this->errors .= '<pre>'.var_export($t,true).'</pre>';
228 $this->errors
.= ' </span><br/>'."\n";
233 private function setOutput (){
234 $userAgent = $_SERVER['HTTP_USER_AGENT'];
238 public function dispatch (){
242 $this->smarty
= &new Smarty();
244 $this->smarty
->compile_check
= true;
245 // $this->smarty->debugging = C_SYSTEM_DEBUG;
246 $this->smarty
->compile_dir
= RES_PATH
. S_C_TEMPL_DIR
;
248 $this->smarty
->assign('header', $this->themePath
. DIRECTORY_SEPARATOR
. S_TEMPL_DIR
. 'header.tpl');
249 $this->smarty
->assign('footer', $this->themePath
. DIRECTORY_SEPARATOR
. S_TEMPL_DIR
. 'footer.tpl');
251 $this->smarty
->assign('url', URL
);
252 $this->smarty
->assign('style', '');
254 $className = get_class ($this);
255 $methArr = get_class_methods ($this);
257 if (is_file (PAGE_PATH
. $className . DIRECTORY_SEPARATOR
. $className . '.tpl')) {
258 $this->smarty
->assign('contentFile', PAGE_PATH
. $className . DIRECTORY_SEPARATOR
. $className . '.tpl');
260 $this->smarty
->assign('contentFile', $this->themePath
. DIRECTORY_SEPARATOR
. S_TEMPL_DIR
. 'tpl404.tpl');
263 /* Execution of any _exec method we have in the derived classes
264 --------------------------------------------------------------------- */
265 foreach ($methArr as $method){
266 if (stristr($method, '_exec')){
270 /* Loading of any varArray template variables we have in the derived classes
271 --------------------------------------------------------------------- */
272 if (is_array($this->varArray
)) {
273 $this->smarty
->assign ($this->varArray
);
276 // if(!empty($GLOBALS['errors'])) {
277 // $GLOBALS['errors'] = '.';
280 if (!C_SYSTEM_DEBUG
) {
284 $this->errors
.= ob_get_clean();
285 ob_start(); // clean output - heheh, yeah right :P
286 $this->reportErrors ();
289 // $this->smarty->assign ('time', true);
291 $this->content
= $this->smarty
->fetch($this->themePath
. DIRECTORY_SEPARATOR
. S_TEMPL_DIR
. 'main.tpl');
293 $this->postDispatch ($this->content
);
296 private function postDispatch ($incString){
297 // later on we will do some string manipulation to have a bit _more_ control over the smarty output
298 // (for example smarty->fetch gives a lot of notices - bad templates) - maybe we want to catch them
299 // TODO LOSE SMARTY !! - php is enough for templating ... or so I heard ;)
300 if ( stristr($_SERVER['HTTP_ACCEPT'],'application/xhtml+xml') && !C_SYSTEM_DEBUG
) {
301 header('Content-type: application/xhtml+xml');
303 header('Content-type: text/html');
305 // $this->time['end'] = microtime (true);
308 array ('%TIME%','%QUERIES%', '%MEMUSED%'),
310 number_format(microtime (true) - $GLOBALS['st'] , 5, ',', '.'),
312 number_format(memory_get_usage()/1024, 3, ',', '.')