From 07f5140771388c9e0c8a99b0dd2e5d950bdb173b Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Thu, 14 Oct 2021 15:16:42 +1100 Subject: moving h-source subdir out. --- Library/Controller.php | 321 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 321 insertions(+) create mode 100755 Library/Controller.php (limited to 'Library/Controller.php') diff --git a/Library/Controller.php b/Library/Controller.php new file mode 100755 index 0000000..b0eef53 --- /dev/null +++ b/Library/Controller.php @@ -0,0 +1,321 @@ +. + +if (!defined('EG')) die('Direct access not allowed!'); + +class Controller { + + protected $m = array(); //associative array referencing different models + protected $h = array(); //associative array referencing different helpers + protected $s = array(); //associative array referencing different sessions objects (users_checkAdmin objects: see library/users/checkAdmin.php) + protected $c = array(); //associative array referencing different controllers + + protected $_queryString = array(); //the array of args coming from the url + + public $controller; + public $action; + public $currPage; //the URL of the current page + + public $request = null; //reference to a Request object + + public $modelName; + + public $argKeys = array(); //the array of keys representing the status args of the view action of the controller (validate function after colon) + public $argDefault = array(); //the array containing the default values of the $viewArgs array + + public $argFunc = array(); //the array containing the functions to be applied upon the $viewArgs array + + public $viewArgs = array(); //the associative array representing the status args of the main action of the controller. It is the combination of $argKeys and $queryString + public $viewStatus = ''; //string containing the additional url string to get the status of the view action of the controller (derived from $this->viewArgs) + + public $theme; + public $baseUrl = null; //the base url of the website: http://domainname + public $baseUrlSrc = null; //the base url of the website (http://domainname) if MOD_REWRITE_MODULE has been set to false + + public $headerObj; //reference to headerObj class + +// protected $_users; //object to manage access + + protected $scaffold = null; //the reference to the scaffold object + + function __construct($model, $controller, $queryString = array()) { + $this->controller = $controller; + $this->modelName = $model; + $this->_queryString = $queryString; + + $this->theme = new Theme($controller); + $this->baseUrl = $this->theme->baseUrl; + $this->baseUrlSrc = $this->theme->baseUrlSrc; + + $this->headerObj = new HeaderObj(DOMAIN_NAME); + $this->request = new Request(); + } + + //redirect to $path after the time $time + final public function redirect($path,$time = 0,$string = null) + { + $this->headerObj->redirect($path,$time,$string); + } + + //set the $_data structure of the theme + final public function set($value) + { + $this->theme->set($value); + } + + //append values to the $_data structure of the theme + final public function append($value) + { + $this->theme->append($value); + } + + //load a view file + final public function load($viewFile,$option = 'none') { + $this->theme->load($viewFile,$option); + } + + //clean the array containing the view files to load + final public function clean() { + $this->theme->clean(); + } + + //load an helper class + final function helper($helperName) { + $args = func_get_args(); + array_shift($args); + $name = 'Helper_'.$helperName; + if (class_exists($name)) + { + $this->h[$helperName] = new $name(); + + if ($this->h[$helperName] instanceof Helper_Html) { + $this->h[$helperName]->viewArgs = $this->viewArgs; + $this->h[$helperName]->viewStatus = $this->viewStatus; + } + + if (method_exists($this->h[$helperName], 'build')) { + call_user_func_array(array($this->h[$helperName],'build'),$args); + } + } + + } + + //load a model class + //$name: the name of the model class + final public function model($name = null) { + $modelName = isset($name) ? $name : $this->modelName; + if (class_exists($modelName)) { + $this->m[$modelName] = new $modelName(); + } else { + throw new Exception('Error in '.__METHOD__.': class "'.$modelName.'" has not been defined'); + } + } + + //load a controller + //$controllerName: the name of the controller class to load + final public function controller($controller) + { + if (class_exists($controller)) { + $model = str_replace('Controller',null,$controller).'Model'; + $application = strtolower(str_replace('Controller',null,$controller)); + $this->c[$controller] = new $controller($model,$application,array()); + $this->c[$controller]->theme = $this->theme; + } + } + + //load a users_checkAdmin class + //$sessonType: the type of session. It can be 'admin' (in the case of the access of an admin user) or 'registered' (in the case of the access of a registerd user) + final public function session($sessionType = 'admin') { + $sessionTypeArray = array('admin','registered'); + if (!in_array($sessionType,$sessionTypeArray)) { + throw new Exception('Error in '.__METHOD__.': the session type can be \'admin\' or \'registered\' only'); + } + //admin session + if ($sessionType === 'admin') { + $params = array( + 'users_controller' => ADMIN_USERS_CONTROLLER, + 'users_login_action' => ADMIN_USERS_LOGIN_ACTION, + 'panel_controller' => ADMIN_PANEL_CONTROLLER, + 'panel_main_action' => ADMIN_PANEL_MAIN_ACTION, + 'cookie_name' => ADMIN_COOKIE_NAME, + 'sessionsTable' => ADMIN_SESSIONS_TABLE, + 'usersTable' => ADMIN_USERS_TABLE, + 'groupsTable' => ADMIN_GROUPS_TABLE, + 'manyToManyTable' => ADMIN_MANYTOMANY_TABLE, + 'accessesTable' => ADMIN_ACCESSES_TABLE, + 'session_expire' => ADMIN_SESSION_EXPIRE, + 'cookie_path' => ADMIN_COOKIE_PATH, + 'database_type' => DATABASE_TYPE, + 'hijacking_check' => ADMIN_HIJACKING_CHECK, + 'on_hijacking_event' => ADMIN_ON_HIJACKING_EVENT, + 'hijacking_action' => ADMIN_HIJACKING_ACTION, + 'time_after_failure' => ADMIN_TIME_AFTER_FAILURE, + 'password_hash' => PASSWORD_HASH, + 'cookie_domain' => ADMIN_COOKIE_DOMAIN, + 'cookie_secure' => ADMIN_COOKIE_SECURE + ); + $this->s['admin'] = new Users_CheckAdmin($params); + } + //registered session + if ($sessionType === 'registered') { + $params = array( + 'users_controller' => REG_USERS_CONTROLLER, + 'users_login_action' => REG_USERS_LOGIN_ACTION, + 'panel_controller' => REG_PANEL_CONTROLLER, + 'panel_main_action' => REG_PANEL_MAIN_ACTION, + 'cookie_name' => REG_COOKIE_NAME, + 'sessionsTable' => REG_SESSIONS_TABLE, + 'usersTable' => REG_USERS_TABLE, + 'groupsTable' => REG_GROUPS_TABLE, + 'manyToManyTable' => REG_MANYTOMANY_TABLE, + 'accessesTable' => REG_ACCESSES_TABLE, + 'session_expire' => REG_SESSION_EXPIRE, + 'cookie_path' => REG_COOKIE_PATH, + 'database_type' => DATABASE_TYPE, + 'hijacking_check' => REG_HIJACKING_CHECK, + 'on_hijacking_event' => REG_ON_HIJACKING_EVENT, + 'hijacking_action' => REG_HIJACKING_ACTION, + 'time_after_failure' => REG_TIME_AFTER_FAILURE, + 'password_hash' => PASSWORD_HASH, + 'cookie_domain' => REG_COOKIE_DOMAIN, + 'cookie_secure' => REG_COOKIE_SECURE + ); + $this->s['registered'] = new Users_CheckAdmin($params); + } + } + + //method to set $this->argKeys. Chenge the string in the array! + final public function setArgKeys($argKeys) { +// $this->argKeys = explode(',',$argKeys); + $this->argKeys = array_keys($argKeys); + $this->argDefault = array_values($argKeys); + } + + //shift the $this->_queryString array a number of times equal to the number indicated by the $number variable and build the $this->viewArgs array and the $this->viewStatus string (additional url) + final public function shift($number = 0) { + + //save the query string array + $oldQueryString = $this->_queryString; + + for ($i = 0; $i < $number; $i++) + { + array_shift($this->_queryString); + } + $this->callInArgKeysFunc(); + for ($i = 0; $i < count($this->argKeys); $i++) + { + if (isset($_GET[$this->argKeys[$i]]) and strcmp($_GET[$this->argKeys[$i]],'') !== 0) + { + $this->viewArgs[$this->argKeys[$i]] = $this->request->get($this->argKeys[$i],'',$this->argFunc[$i]); + continue; + } + if (!isset($this->_queryString[$i])) { + $this->viewArgs[$this->argKeys[$i]] = isset($this->argDefault[$i]) ? $this->argDefault[$i] : null; + continue; + } + $this->viewArgs[$this->argKeys[$i]] = $this->_queryString[$i]; + } + $this->viewStatus = Url::createUrl(array_values($this->viewArgs)); + $this->updateHelpers(); + + //update the theme + $this->theme->viewStatus = $this->viewStatus; + $this->theme->viewArgs = $this->viewArgs; + + //restore the query string array + $this->_queryString = $oldQueryString; + } + + //call the functions defined in $this->argKeys after the colon (ex- 'page:forceInt' => apply the forceInt() function upon the $page arg) + final public function callInArgKeysFunc() { + for ($i = 0; $i < count($this->argKeys); $i++) { + + $this->argFunc[$i] = 'none'; + + if (strstr($this->argKeys[$i],':')) { + $temp = explode(':',$this->argKeys[$i]); + + $this->argFunc[$i] = $temp[1]; + + //exception + if (!in_array($temp[1],explode(',',params::$allowedSanitizeFunc))) { + throw new Exception('"'.$temp[1]. '" function not allowed in $this->argKeys'); + } + $this->argKeys[$i] = $temp[0]; + if (!isset($this->_queryString[$i])) { + continue; + } + $this->_queryString[$i] = call_user_func($temp[1],$this->_queryString[$i]); + } + } + } + + //function to update all the Helper that are instance of the HtmlHelper class. This function update the $viesArgs and $viewStatus properties. This function is called by the shift method. + final public function updateHelpers() { + foreach ($this->h as $Helper) { + if ($Helper instanceof Helper_Html) { + $Helper->viewArgs = $this->viewArgs; + $Helper->viewStatus = $this->viewStatus; + } + } + } + + //create the viewStatus property + final public function buildStatus() + { + $this->viewStatus = Url::createUrl(array_values($this->viewArgs)); + //update the theme + $this->theme->viewStatus = $this->viewStatus; + $this->theme->viewArgs = $this->viewArgs; + } + + //method to instanciate the scaffold + final public function loadScaffold($type,$params = null) { + + $typeArray = array('main','form'); + if (!in_array($type,$typeArray)) { + throw new Exception("the type '$type' is not allowed in ".__METHOD__); + } + $this->scaffold = new Scaffold($type,$this->controller,$this->m[$this->modelName],$this->viewArgs,$params); + + $this->helper('Menu',$this->controller,$this->scaffold->params['panelController']); + $this->scaffold->mainMenu = $this->h['Menu']; + + $this->m[$this->modelName]->popupBuild(); + $popupArray = $this->m[$this->modelName]->popupArray; + + if ($type === 'main') { + + $here = $this->controller.'/'.$this->scaffold->params['mainAction']; + $this->helper('Pages',$here,$this->scaffold->params['pageVariable']); + $this->helper('List',$this->m[$this->modelName]->identifierName,$here,$this->scaffold->params['pageVariable']); + + + $this->helper('Popup',$here,$popupArray,$this->scaffold->params['popupType'],$this->scaffold->params['pageVariable'],true); + + $this->scaffold->pageList = $this->h['Pages']; + $this->scaffold->itemList = $this->h['List']; + $this->scaffold->popupMenu = $this->h['Popup']; + } + } + +} \ No newline at end of file -- cgit v1.2.3