app. * 2. set the pathes, config, lang of current module * * @param string $appName * @access public * @return void */ public function __construct($appName = '') { global $app, $config, $lang, $dbh; $this->app = $app; $this->config = $config; $this->lang = $lang; $this->dbh = $dbh; $this->appName = empty($appName) ? $this->app->getAppName() : $appName; $moduleName = $this->getModuleName(); if($this->config->framework->multiLanguage) $this->app->loadLang($moduleName, $this->appName); if($moduleName != 'common') $this->app->loadModuleConfig($moduleName, $this->appName); $this->loadDAO(); $this->setSuperVars(); } /** * 获取该model的模块名,而不是用户请求的模块名。 * * 这个方法通过去掉该model类名的'ext'和'model'字符串,来获取当前模块名。 * 不要使用$app->getModuleName(),因为其返回的是用户请求的模块名。 * 另一个model可以通过loadModel()加载进来,与请求的模块名不一致。 * * Get the module name of this model. Not the module user visiting. * * This method replace the 'ext' and 'model' string from the model class name, thus get the module name. * Not using $app->getModuleName() because it return the module user is visiting. But one module can be * loaded by loadModel() so we must get the module name of this model. * * @access public * @return string the module name. */ public function getModuleName() { $parentClass = get_parent_class($this); $selfClass = get_class($this); $className = $parentClass == 'model' ? $selfClass : $parentClass; if($className == 'extensionModel') return 'extension'; return strtolower(str_ireplace(array('ext', 'Model'), '', $className)); } /** * 设置全局超级变量。 * Set the super vars. * * @access public * @return void */ public function setSuperVars() { $this->post = $this->app->post; $this->get = $this->app->get; $this->server = $this->app->server; $this->cookie = $this->app->cookie; $this->session = $this->app->session; } /** * 加载一个模块的model。加载完成后,使用$this->$moduleName来访问这个model对象。 * 比如:loadModel('user')引入user模块的model实例对象,可以通过$this->user来访问它。 * * Load the model of one module. After loaded, can use $this->$moduleName to visit the model object. * * @param string $moduleName * @access public * @return object|bool the model object or false if model file not exists. */ public function loadModel($moduleName, $appName = '') { if(empty($moduleName)) return false; if(empty($appName)) $appName = $this->appName; global $loadedModels; if(isset($loadedModels[$appName][$moduleName])) { $this->$moduleName = $loadedModels[$appName][$moduleName]; return $this->$moduleName; } $modelFile = $this->app->setModelFile($moduleName, $appName); if(!helper::import($modelFile)) return false; $modelClass = class_exists('ext' . $appName . $moduleName. 'model') ? 'ext' . $appName . $moduleName . 'model' : $appName . $moduleName . 'model'; if(!class_exists($modelClass)) { $modelClass = class_exists('ext' . $moduleName. 'model') ? 'ext' . $moduleName . 'model' : $moduleName . 'model'; if(!class_exists($modelClass)) $this->app->triggerError(" The model $modelClass not found", __FILE__, __LINE__, $exit = true); } $loadedModels[$appName][$moduleName] = new $modelClass($appName); $this->$moduleName = $loadedModels[$appName][$moduleName]; return $this->$moduleName; } /** * 加载model的class扩展,主要是为了开发加密代码使用。 * 可以将主要的逻辑存放到$moduleName/ext/model/class/$extensionName.class.php中。 * 然后在ext/model/$extension.php的扩展里面使用$this->loadExtension()来调用相应的方法。 * ext/model/class/*.class.php代码可以加密。而ext/model/*.php可以不用加密。 * 因为框架对model的扩展是采取合并文件的方式,ext/model/*.php文件不能加密。 * * Load extension class of a model thus user can encrypt the code. * You can put the main extension logic codes in $moduleName/ext/model/class/$extensionName.class.php. * And call them by the ext/model/$extension.php like this: $this->loadExtension('myextension')->method(). * You can encrypt the code in ext/model/class/*.class.php. * Because the framework will merge the extension files in ext/model/*.php to the module/model.php. * * @param string $extensionName * @param string $moduleName * @access public * @return void */ public function loadExtension($extensionName, $moduleName = '') { if(empty($extensionName)) return false; /* 设置扩展的名字和相应的文件。Set extenson name and extension file. */ $extensionName = strtolower($extensionName); $moduleName = $moduleName ? $moduleName : $this->getModuleName(); $moduleExtPath = $this->app->getModuleExtPath($this->appName, $moduleName, 'model'); if(!empty($moduleExtPath['site'])) $extensionFile = $moduleExtPath['site'] . 'class/' . $extensionName . '.class.php'; if(!isset($extensionFile) or !file_exists($extensionFile)) $extensionFile = $moduleExtPath['common'] . 'class/' . $extensionName . '.class.php'; /* 载入父类。Try to import parent model file auto and then import the extension file. */ if(!class_exists($moduleName . 'Model')) helper::import($this->app->getModulePath($this->appName, $moduleName) . 'model.php'); if(!helper::import($extensionFile)) return false; /* 设置扩展类的名字。Set the extension class name. */ $extensionClass = $extensionName . ucfirst($moduleName); if(!class_exists($extensionClass)) return false; /* 实例化扩展类。Create an instance of the extension class and return it. */ $extensionObject = new $extensionClass; $extensionClass = str_replace('Model', '', $extensionClass); $this->$extensionClass = $extensionObject; return $extensionObject; } /** * 加载DAO。 * Load DAO. * * @access public * @return void */ public function loadDAO() { $this->dao = $this->app->loadClass('dao'); } /** * 删除记录。 * Delete one record. * * @param string $table the table name * @param string $id the id value of the record to be deleted * @access public * @return void */ public function delete($table, $id) { $this->dao->delete()->from($table)->where('id')->eq($id)->exec(); } }