Example #1
0
 /**
  * 实例化一个模型
  * @param type $classname_path
  * @param type $hmvc_module_floder
  * @return type CoreModel
  */
 public static function instance($classname_path = null, $hmvc_module_floder = NULL)
 {
     if (!empty($hmvc_module_floder)) {
         CoreRouter::switchHmvcConfig($hmvc_module_floder);
     }
     //这里调用控制器instance是为了触发自动加载,从而避免了插件模式下,直接instance模型,自动加载失效的问题
     CoreController::instance();
     if (empty($classname_path)) {
         $renew = is_bool($classname_path) && $classname_path === true;
         CoreLoader::classAutoloadRegister();
         return empty(self::$instance) || $renew ? self::$instance = new self() : self::$instance;
     }
     $system = CoreLoader::$system;
     $classname_path = str_replace('.', DIRECTORY_SEPARATOR, $classname_path);
     $classname = basename($classname_path);
     $model_folders = $system['model_folder'];
     if (!is_array($model_folders)) {
         $model_folders = array($model_folders);
     }
     $count = count($model_folders);
     CoreLoader::classAutoloadRegister();
     foreach ($model_folders as $key => $model_folder) {
         $filepath = $model_folder . DIRECTORY_SEPARATOR . $classname_path . $system['model_file_suffix'];
         $alias_name = $classname;
         if (isset(CoreModelLoader::$model_files[$alias_name])) {
             return CoreModelLoader::$model_files[$alias_name];
         }
         if (file_exists($filepath)) {
             //在plugin模式下,路由器不再使用,那么自动注册不会被执行,自动加载功能会失效,所以在这里再尝试加载一次,
             //如此一来就能满足两种模式
             //CoreLoader::classAutoloadRegister();
             if (!class_exists($classname, FALSE)) {
                 CoreLoader::includeOnce($filepath);
             }
             if (class_exists($classname, FALSE)) {
                 return CoreModelLoader::$model_files[$alias_name] = new $classname();
             } else {
                 if ($key == $count - 1) {
                     Fn::trigger404('Model Class:' . $classname . ' not found.');
                 }
             }
         } else {
             if ($key == $count - 1) {
                 Fn::trigger404($filepath . ' not  found.');
             }
         }
     }
 }
Example #2
0
 /**
  * 获取视图绝对路径,在视图中include其它视图的时候用到。
  * 提示:
  * hvmc模式,“视图路经数组”是模块的视图数组和主配置视图数组合并后的数组。
  * 即:$hmvc_system['view_folder']=array_merge($hmvc_system['view_folder'], $system['view_folder']);
  * @param type $view_name 视图名称,不含后缀
  * @param type $path_key  就是配置中“视图路经数组”的键
  * @return string
  */
 public static function view_path($view_name, $path_key = 0)
 {
     if (stripos($view_name, ':') !== false) {
         $info = explode(':', $view_name);
         $path_key = current($info);
         $view_name = next($info);
     }
     $system = CoreLoader::$system;
     if (!is_array($system['view_folder'])) {
         $system['view_folder'] = array($system['view_folder']);
     }
     if (!isset($system['view_folder'][$path_key])) {
         Fn::trigger404('error key[' . $path_key . '] of ' . $system['view_folder']);
     }
     $dir = $system['view_folder'][$path_key];
     $view_path = $dir . DIRECTORY_SEPARATOR . $view_name . $system['view_file_suffix'];
     return Fn::truepath($view_path);
 }
Example #3
0
 private static function getQueryStr()
 {
     $system = CoreLoader::$system;
     // 命令行运行检查
     if (CoreInput::isCli()) {
         global $argv;
         $pathinfo_query = isset($argv[1]) ? $argv[1] : '';
     } else {
         $pathinfo = @parse_url($_SERVER['REQUEST_URI']);
         if (empty($pathinfo)) {
             if ($system['debug']) {
                 Fn::trigger404('request parse error:' . $_SERVER['REQUEST_URI']);
             } else {
                 Fn::trigger404();
             }
         }
         // pathinfo模式下有?,那么$pathinfo['query']也是非空的,这个时候查询字符串是PATH_INFO和query
         $query_str = empty($pathinfo['query']) ? '' : $pathinfo['query'];
         $pathinfo_query = empty($_SERVER['PATH_INFO']) ? $query_str : $_SERVER['PATH_INFO'] . '&' . $query_str;
     }
     if ($pathinfo_query) {
         $pathinfo_query = trim($pathinfo_query, '/&');
     }
     // urldecode 解码所有的参数名,解决get表单会编码参数名称的问题
     $pq = $_pq = array();
     $_pq = explode('&', $pathinfo_query);
     foreach ($_pq as $value) {
         $p = explode('=', $value);
         if (isset($p[0])) {
             $p[0] = urldecode($p[0]);
         }
         $pq[] = implode('=', $p);
     }
     $pathinfo_query = implode('&', $pq);
     return $pathinfo_query;
 }
Example #4
0
 /**
  * 实例化一个控制器
  * @staticvar array $loadedClasses
  * @param type $classname_path
  * @param type $hmvc_module_floder
  * @return CoreController
  */
 public static function instance($classname_path = null, $hmvc_module_floder = NULL)
 {
     if (!empty($hmvc_module_floder)) {
         CoreRouter::switchHmvcConfig($hmvc_module_floder);
     }
     if (empty($classname_path)) {
         CoreLoader::classAutoloadRegister();
         return new self();
     }
     $system = CoreLoader::$system;
     $classname_path = str_replace('.', DIRECTORY_SEPARATOR, $classname_path);
     $classname = basename($classname_path);
     $filepath = $system['controller_folder'] . DIRECTORY_SEPARATOR . $classname_path . $system['controller_file_suffix'];
     $alias_name = strtolower($classname);
     static $loadedClasses = array();
     if (isset($loadedClasses[$alias_name])) {
         return $loadedClasses[$alias_name];
     }
     if (file_exists($filepath)) {
         //在plugin模式下,路由器不再使用,那么自动注册不会被执行,自动加载功能会失效,所以在这里再尝试加载一次,
         //如此一来就能满足两种模式
         CoreLoader::classAutoloadRegister();
         CoreLoader::includeOnce($filepath);
         if (class_exists($classname, FALSE)) {
             return $loadedClasses[$alias_name] = new $classname();
         } else {
             Fn::trigger404('Ccontroller Class:' . $classname . ' not found.');
         }
     } else {
         Fn::trigger404($filepath . ' not found.');
     }
 }