* The class incapsulates the main run-cycle of the script, provide access to all other objects in the framework.
*
* The class is a singleton, which means that there could be only one instance of KernelApplication in the script.
* This could be guranteed by NOT calling the class constuctor directly, but rather calling KernelApplication::Instance() method, * which returns an instance of the application. The method gurantees that it will return exactly the same instance for any call.
* See singleton pattern by GOF. * @package kernel4 */ class kApplication { /** * Holds internal TemplateParser object * @access private * @var TemplateParser */ var $Parser; var $Profiler; /** * Holds parser output buffer * @access private * @var string */ var $HTML; var $DocRoot; var $BasePath; var $KernelPath; var $Server; /** * The main Factory used to create * almost any class of kernel and * modules * * @access private * @var kFactory */ var $Factory; var $XMLFactory; // in use? /** * Holds all phrases used * in code and template * * @var PhrasesCache */ var $Phrases; /** * Holds connection to database * * @var DBConnection */ var $DB; /** * Constucts KernelApplication - constructor is PRIVATE * * The constuructor of KernelApplication should NOT be called directly * To create KernelApplication, call its Instance() method * @see KerenelApplication::Instance * @access private */ function kApplication() { global $doc_root, $base_path, $kernel_path, $protocol, $server; $this->DocRoot = $doc_root; $this->BasePath = $base_path; $this->KernelPath = $kernel_path; $this->Protocol = $protocol; $this->Server = $server; } /** * Returns kApplication instance anywhere in the script. * * This method should be used to get single kApplication object instance anywhere in the * Kernel-based application. The method is guranteed to return the SAME instance of kApplication. * Anywhere in the script you could write: * * $application =& kApplication::Instance(); * * or in an object: * * $this->Application =& kApplication::Instance(); * * to get the instance of kApplication. Note that we call the Instance method as STATIC - directly from the class. * To use descendand of standard kApplication class in your project you would need to define APPLICATION_CLASS constant * BEFORE calling kApplication::Instance() for the first time. If APPLICATION_CLASS is not defined the method would * create and return default KernelApplication instance. * @static * @access public * @return kApplication */ function &Instance() { static $instance = false; if (!$instance) { if (!defined('APPLICATION_CLASS')) define('APPLICATION_CLASS', 'kApplication'); $class = APPLICATION_CLASS; $instance = new $class(); } return $instance; } /** * Initializes the Application * * Creates Utilites instance, HTTPQuery, Session, Profiler, TemplatesCache, Parser * @access public * @see HTTPQuery * @see Session * @see TemplatesCache * @return void */ function Init() { $this->DB = new DBConnection(SQL_TYPE, Array(&$this,'handleSQLError') ); $this->DB->Connect(SQL_SERVER, SQL_USER, SQL_PASS, SQL_DB); $this->DB->debugMode = $this->isDebugMode(); $this->SetDefaultConstants(); setcookie('CookiesOn', 1, time()+600); $this->Factory = new kFactory(); $this->registerDefaultClasses(); // 1. to read configs before doing any recallObject $config_reader =& $this->recallObject('kUnitConfigReader'); $this->Phrases = new PhrasesCache( $this->RecallVar('LanguageId', DEFAULT_LANGUAGE_ID) ); $this->ValidateLogin(); // TODO: write that method } /** * Registers default classes such as ItemController, GridController and LoginController * * Called automatically while initializing Application * @access private * @return void */ function RegisterDefaultClasses() { //$this->registerClass('Utilites',KERNEL_PATH.'/utility/utilities.php'); $this->registerClass('HTTPQuery',KERNEL_PATH.'/utility/http_query.php'); $this->registerClass('Session',KERNEL_PATH.'/session/session.php'); $this->registerClass('kEventManager',KERNEL_PATH.'/event_manager.php','EventManager'); $this->registerClass('kUnitConfigReader',KERNEL_PATH.'/utility/unit_config_reader.php'); $this->registerClass('Params',KERNEL_PATH.'/utility/params.php','kActions'); //$this->registerClass('Configuration',KERNEL_PATH.'/utility/configuration.php'); $this->registerClass('TemplatesCache',KERNEL_PATH.'/parser/template.php'); $this->registerClass('TemplateParser',KERNEL_PATH.'/parser/template_parser.php'); $this->registerClass('MainProcessor', KERNEL_PATH.'/processors/main_processor.php','m_TagProcessor'); $this->registerClass('kDBList', KERNEL_PATH.'/db/dblist.php'); $this->registerClass('kDBItem', KERNEL_PATH.'/db/dbitem.php'); $this->registerClass('kDBEventHandler', KERNEL_PATH.'/db/db_event_handler.php'); $this->registerClass('kDBTagProcessor', KERNEL_PATH.'/db/db_tag_processor.php'); $this->registerClass('kTagProcessor', KERNEL_PATH.'/processors/tag_processor.php'); /*$this->RegisterClass('LoginController', KERNEL_PATH.'/users/login_controller.php');*/ } /** * Defines default constants if it's not defined before - in config.php * * Called automatically while initializing Application and defines: * LOGIN_CONTROLLER, XML_FACTORY etc. * @access private * @return void */ function SetDefaultConstants() { if (!defined('SERVER_NAME')) define('SERVER_NAME', $_SERVER['SERVER_NAME']); if (!defined('LOGIN_CONTROLLER')) define('LOGIN_CONTROLLER', 'LoginController'); if (!defined('XML_FACTORY')) define('XML_FACTORY', 'XMLFactory'); if (!defined('ADMINS_LIST')) define('ADMINS_LIST', '/users/users.php'); if (!defined('USER_MODEL')) define('USER_MODEL', 'Users'); if (!defined('DEFAULT_LANGUAGE_ID')) define('DEFAULT_LANGUAGE_ID', 1); } /** * Actually runs the parser against current template and stores parsing result * * This method gets t variable passed to the script, loads the template given in t variable and * parses it. The result is store in {@link $this->HTML} property. * @access public * @return void */ function Run() { $event_manager =& $this->recallObject('EventManager'); $event_manager->ProcessRequest(); $this->Parser =& $this->recallObject('TemplateParser'); $template_cache =& $this->recallObject('TemplatesCache'); $t = $this->GetVar('t'); $this->HTML = $this->Parser->Parse( $template_cache->GetTemplateBody($t) ); } /** * Send the parser results to browser * * Actually send everything stored in {@link $this->HTML}, to the browser by echoing it. * @access public * @return void */ function Done() { //eval("?".">".$this->HTML); echo $this->HTML; $this->Phrases->UpdateCache(); $session =& $this->recallObject('Session'); $session->SaveData(); } // Facade /** * Returns current session id (SID) * @access public * @return longint */ function GetSID() { $session =& $this->recallObject('Session'); return $session->GetID(); } function DestroySession() { $session =& $this->recallObject('Session'); $session->DestroySession(); } /** * Returns variable passed to the script as GET/POST/COOKIE * * @access public * @param string $var Variable name * @return mixed */ function GetVar($var,$mode=FALSE_ON_NULL) { $http_query =& $this->recallObject('HTTPQuery'); return $http_query->Get($var,$mode); } /** * Returns ALL variables passed to the script as GET/POST/COOKIE * * @access public * @return array */ function GetVars() { $http_query =& $this->recallObject('HTTPQuery'); return $http_query->GetParams(); } /** * Set the variable 'as it was passed to the script through GET/POST/COOKIE' * * This could be useful to set the variable when you know that * other objects would relay on variable passed from GET/POST/COOKIE * or you could use SetVar() / GetVar() pairs to pass the values between different objects.
* * This method is formerly known as $this->Session->SetProperty. * @param string $var Variable name to set * @param mixed $val Variable value * @access public * @return void */ function SetVar($var,$val) { $http_query =& $this->recallObject('HTTPQuery'); $http_query->Set($var,$val); } function RemoveVar($var) { $session =& $this->recallObject('Session'); return $session->RemoveVar($var); } /** * Returns session variable value * * Return value of $var variable stored in Session. An optional default value could be passed as second parameter. * * @see SimpleSession * @access public * @param string $var Variable name * @param mixed $default Default value to return if no $var variable found in session * @return mixed */ function RecallVar($var,$default='') { $session =& $this->recallObject('Session'); return $session->RecallVar($var,$default); } /** * Stores variable $val in session under name $var * * Use this method to store variable in session. Later this variable could be recalled. * @see RecallVar * @access public * @param string $var Variable name * @param mixed $val Variable value */ function StoreVar($var, $val) { $session =& $this->recallObject('Session'); $session->StoreVar($var, $val); } function StoreVarDefault($var, $val) { $session =& $this->recallObject('Session'); $session->StoreVarDefault($var, $val); } /** * Links HTTP Query variable with session variable * * If variable $var is passed in HTTP Query it is stored in session for later use. If it's not passed it's recalled from session. * This method could be used for making sure that GetVar will return query or session value for given * variable, when query variable should overwrite session (and be stored there for later use).
* This could be used for passing item's ID into popup with multiple tab - * in popup script you just need to call LinkVar('id', 'current_id') before first use of GetVar('id'). * After that you can be sure that GetVar('id') will return passed id or id passed earlier and stored in session * @access public * @param string $var HTTP Query (GPC) variable name * @param mixed $ses_var Session variable name * @param mixed $default Default variable value */ function LinkVar($var, $ses_var=null, $default='') { if (!isset($ses_var)) $ses_var = $var; if ($this->GetVar($var) !== false) { $this->StoreVar($ses_var, $this->GetVar($var)); } else $this->SetVar($var, $this->RecallVar($ses_var, $default)); } /** * Returns variable from HTTP Query, or from session if not passed in HTTP Query * * The same as LinkVar, but also returns the variable value taken from HTTP Query if passed, or from session if not passed. * Returns the default value if variable does not exist in session and was not passed in HTTP Query * * @see LinkVar * @access public * @param string $var HTTP Query (GPC) variable name * @param mixed $ses_var Session variable name * @param mixed $default Default variable value * @return mixed */ function GetLinkedVar($var, $ses_var=null, $default='') { if (!isset($ses_var)) $ses_var = $var; $this->LinkVar($var, $ses_var, $default); return $this->GetVar($var); } /*function ExtractByMask($array, $mask, $key_id=1, $ret_mode=1) { $utils =& $this->recallObject('Utilities'); return $utils->ExtractByMask($array, $mask, $key_id, $ret_mode); } function GetSelectedIDs($mask, $format) { $http_query =& $this->recallObject('HTTPQuery'); return $http_query->GetSelectedIDs($mask, $format); } function GetSelectedIDsArray($mask, $value_mask="%s,") { $http_query =& $this->recallObject('HTTPQuery'); return $http_query->GetSelectedIDsArray($mask, $value_mask); }*/ /** * Returns configurtion option * * @param string $option * @return string * @access public */ /*function ConfigOption($option) { $config =& $this->recallObject('Configuration'); return $config->Get($option); }*/ /** * Sets configuration option * * @param string $option * @param string $value * @return bool * @access public */ /*function SetConfigOption($option,$value) { $config =& $this->recallObject('Configuration'); return $config->Set($option, $value); }*/ function AddBlock($name, $tpl) { $this->cache[$name] = $tpl; } function SetTemplateBody($title,$body) { $templates_cache =& $this->recallObject('TemplatesCache'); $templates_cache->SetTemplateBody($title,$body); } function ProcessTag($tag_data) { $a_tag = new Tag($tag_data,$this->Parser); return $a_tag->DoProcessTag(); } /*function &GetProcessor($prefix) { $this->KernelDie('GetProcessor is DEPRICATED, use recallObject'); // return $this->Processors->GetProcessor($prefix, new Tag('empty', $this->Parser)); }*/ /* DEFINETLY NEEDS TO BE MOVED AWAY!!!!! */ /*var $email_body; function Email($params) { $this->email_body = $this->ParseBlock($params); $from = $this->GetVar('email_from'); $to = $this->GetVar('email_to'); $replay = $this->GetVar('email_replay'); if ( $replay == "" ) $replay = $from; $subject = $this->GetVar('email_subject'); $charset = $this->GetVar('email_charset'); // $display = $this->GetVar('email_display'); $display = 0; if (!isset($charset) || $charset == '') $charset = 'US-ASCII'; $mime = $this->GetVar('email_mime'); if ($mime == 'yes') { $mime_mail = new MIMEMail($to, $from, $subject, $charset); $mime_mail->mailbody($this->email_body); if ($f_name = $this->GetVar('email_attach')) { $full_path = DOC_ROOT.BASE_PATH.'/'.$f_name; $data = ''; if(file_exists($full_path)) { $fd = fopen($full_path, "r"); $data = fread($fd, filesize($full_path)); fclose($fd); } else exit; $filename = $this->GetVar('email_attach_filename'); $type = $this->GetVar('email_attach_type'); $mime_mail->attachfile_raw($data, $filename, $type); $mime_mail->send(); } } else { $headers.="From: $from\n"; $headers.="Reply-To: $replay\n"; $headers.="Content-Type: text/html; charset=\"$charset\"\n"; if ( $display == 1 ) { echo "
";
	 			echo " from : $from 
"; echo " to : $to
"; echo " replay : $replay
"; echo " subject : $subject
"; echo " this->email_body : $this->email_body
"; echo " headers : $headers
"; echo "
"; } mail($to, $subject, $this->email_body, $headers); } }*/ /** * Return ADODB Connection object * * Returns ADODB Connection object already connected to the project database, configurable in config.php * @access public * @return ADODBConnection */ function &GetADODBConnection() { return $this->DB; } function ParseBlock($params,$pass_params=0) { return $this->Parser->ParseBlock($params,$pass_params); } function &GetXMLFactory() { return $this->XMLFactory; } /** * Return href for template * * @access public * @param string $t Template path * @var string $prefix index.php prefix - could be blank, 'admin' */ function HREF($t, $prefix='') { global $HTTP_SERVER_VARS; if (defined('ADMIN') && $prefix == '') $prefix='/admin'; if (defined('ADMIN') && $prefix == '_FRONT_END_') $prefix = ''; $index_file = defined('INDEX_FILE') ? INDEX_FILE : 'index.php'; $t_path = !empty($t) ? 't='.$t : ''; $session =& $this->recallObject('Session'); $sid = $session->NeedQueryString()?$this->GetSID():''; $ret = $this->BaseURL($prefix).$index_file.'?'.ENV_VAR_NAME.'='.$sid.':'.$t; $t_pass=$this->GetVar('t_pass'); $t_pass_events=$this->GetVar('t_pass_events'); // pass events with url if($t_pass) { $pass_info=explode(',',$t_pass); // array( prefix[.special], prefix[.special] ... foreach($pass_info as $pass_element) { $ret.=':'; list($prefix)=explode('.',$pass_element); $query_vars = $this->getUnitOption($prefix,'QueryString'); if(!$t_pass_events) $this->SetVar($pass_element.'_event',''); // remove event from url if requested if($query_vars) { $tmp_string=Array(0=>$pass_element); foreach($query_vars as $index => $var_name) { $tmp_string[$index]=$this->GetVar($pass_element.'_'.$var_name); } $ret.=implode('-',$tmp_string); } } } $this->SetVar('t_pass_events',0); // don't pass events in url by default return $ret; } function BaseURL($prefix='') { return PROTOCOL.SERVER_NAME.(defined('PORT')?':'.PORT : '').BASE_PATH.$prefix.'/'; } /** * Build enviroment variable based on * data submitted from previous template * * @access public */ function ReBuildENV() { $event_manager =& $this->recallObject('EventManager'); $prefix_specials = array_keys($event_manager->queryMaps); $this->SetVar('t_pass', implode(',',$prefix_specials) ); } function Redirect($t='', $params='', $prefix='') { if ($t == '') $t = $this->GetVar('t'); // pass prefixes and special from previous url $this->ReBuildENV(); $location = $this->HREF($t, $prefix); $a_location = $location; $location = sprintf("Location: %s".($params ? "&" : '')."%s",$location, $params); //echo " location : $location
"; if (headers_sent() != '') { echo "Debug output above!!! Proceed to redirect: $a_location
"; } else header("$location"); $session =& $this->recallObject('Session'); $session->SaveData(); exit; } /*function UserError($msg) { error_reporting(E_ALL); trigger_error($msg, E_USER_WARNING ); }*/ function Phrase($label) { if (ereg("^!.+!$", $label) > 0) { $label = substr($label, 1, -1); //cut exclamation marks } return $this->Phrases->GetPhrase($label); } /** * Validtates user in session if required * */ function ValidateLogin() { if (defined('LOGIN_REQUIRED')) { // Original Kostja call //$login_controller =& $this->Factory->MakeClass(LOGIN_CONTROLLER, Array('model' => USER_MODEL, 'prefix' => 'login')); // Call proposed by Alex //$login_controller =& $this->RecallObject(LOGIN_CONTROLLER, Array('model' => USER_MODEL, 'prefix' => 'login')); //$login_controller->CheckLogin(); } } function KernelDie($message) { echo "KernelApplication died: $message
Debug backtrace follows:
"; print_pre(debug_backtrace()); echo ""; } function trigerError($message,$error_type=E_USER_WARNING) { trigger_error($message,$error_type); } /** * Allows to process any type of event * * @param kEvent $event * @access public */ function HandleEvent(&$event) { $event_manager =& $this->recallObject('EventManager'); $event_manager->HandleEvent(&$event); } /** * Registers new class in the factory * * @param string $real_class * @param string $file * @param string $pseudo_class * @access public */ function registerClass($real_class,$file,$pseudo_class=null) { $this->Factory->registerClass($real_class,$file,$pseudo_class); } /** * Returns object using params specified, * creates it if is required * * @param string $name * @param string $pseudo_class * @param Array $event_params * @return Object */ function &recallObject($name,$pseudo_class=null,$event_params=Array()) { return $this->Factory->getObject($name,$pseudo_class,$event_params); } /** * Checks if application is in debug mode * * @return bool * @access public */ function isDebugMode() { return defined('DEBUG_MODE')&&DEBUG_MODE; } /** * Reads unit (specified by $prefix) * option specified by $option * * @param string $prefix * @param string $option * @return string * @access public */ function getUnitOption($prefix,$option) { $unit_config_reader =& $this->recallObject('kUnitConfigReader'); return $unit_config_reader->getUnitOption($prefix,$option); } /** * Set's new unit option value * * @param string $prefix * @param string $name * @param string $value * @access public */ function setUnitOption($prefix,$option,$value) { $unit_config_reader =& $this->recallObject('kUnitConfigReader'); return $unit_config_reader->setUnitOption($prefix,$option,$value); } /** * Splits any mixing of prefix and * special into correct ones * * @param string $prefix_special * @return Array * @access public */ function processPrefix($prefix_special) { return $this->Factory->processPrefix($prefix_special); } /** * Set's new event for $prefix_special * passed * * @param string $prefix_special * @param string $event_name * @access public */ function setEvent($prefix_special,$event_name) { $event_manager =& $this->recallObject('EventManager'); $event_manager->setEvent($prefix_special,$event_name); } /** * SQL Error Handler * * @param int $code * @param string $msg * @param string $sql * @return bool * @access private */ function handleSQLError($code,$msg,$sql) { global $debugger; if($debugger) { $errorLevel=defined('DBG_SQL_FAILURE')&&DBG_SQL_FAILURE?E_USER_ERROR:E_USER_WARNING; $debugger->dumpVars($_REQUEST); $debugger->appendTrace(); trigger_error(''.$msg.' ('.$code.')
SQL: '.$debugger->highlightString($sql),$errorLevel); return true; } else { echo 'xProcessing SQL: '.$sql.'
'; echo 'Error ('.$code.'): '.$msg.'
'; return false; } } } ?>