原生PHP語法來渲染頁面,同時提供了widget功能
-
/**
- * 取得和設定組態參數支援批次定義
- * 如果$key是關聯型數組,則會以K-V的形式寫入配置
- * 如果$key是數字索引數組,則傳回對應的配置陣列
- * @param string|array $key 設定變數
- * @param array|null $value 設定值
- * @return array|null
- */
- function C($key,$value=null){
- static $_config = array( );
- $args = func_num_args();
- if($args == 1){
- if(is_string($key)){ //如果傳入的key是字串
- return isset($_config[$key])?$_config[$key]:null;
- }
- if(is_array($key)){
- if(array_keys($key) !== range( 0, count($key) - 1)){ //如果傳入的key是關聯數組
- $_config = array_merge($_config, $key);
- }else{
- $ret = array ();
- foreach ($key as $k) {
- $ret[$k] = isset($_config[$k])?$_config[$k]:null;
- }
- return $ret;
- }
- }
- }else{
- if(is_string($key)){
- $_config[$key] = $value;
- }else{
- halt('傳入參數不正確');
- }
- }
- return null;
- }
- /**
- * 呼叫Widget
- * @param string $name widget名
- * @param array $data 傳遞給widget的變數列表,key為變數名,value為變數值
- * @return void
- */
- function W($ name, $data = array()){
- $fullName = $name.'Widget';
- if(!class_exists($fullName)){
- halt('Widget '.$name.'不存在');
- }
- $widget = new $fullName();
- $widget->invoke($data);
- }
- /**
- * 終止程式執行
- * @param string $str 終止原因
- * @param bool $display 是否顯示呼叫堆疊,預設不顯示
- * @return void
- */
- >function halt($str, $display=false){
- Log::fatal($str.' debug_backtrace:'.var_export(debug_backtrace(), true));
- header("Content-Type:text /html; charset=utf-8");
- if($display){
- echo "
- debug_print_backtrace();
- echo "";
- }
- echo $str;
- exit;
- }
- /**
- * 取得資料庫執行個體
- * @return DB
- */
- function M(){
- $dbConf = C(array('DB_HOST' ,'DB_PORT','DB_USER','DB_PWD','DB_NAME','DB_CHARSET'));
- return DB::getInstance($dbConf);
- }
- /**
- * 如果檔案存在就include進來
- * @param string $path 檔案路徑
- * @return void
- * /
- function includeIfExist($path){
- if(file_exists($path)){
- include $path;
- }
- }
- /**
- * 總控類
- */
- class SinglePHP {
- /**
- * 控制器
- * @var string
- */
- private $c;
- /**
- * 操作
- * @var string
- */
- private $a;
- /**
- * 單例
- * @var SinglePHP
- */
- private static $_instance;
- /**
- * 建構函數,初始化配置
- * @param array $conf
- */
- private function __construct($conf){
- C($conf);
- }
- private function>private function>private function>private function>private function> __clone(){}
- /**
- * 取得單例
- * @param array $conf
- * @return SinglePHP
- */
- public static function getInstance($conf){
- if(!(self::$_instance instanceof self)){
- self: :$_instance = new self($conf);
- }
- return self::$_instance;
- }
- /**
- * 執行應用程式實例
- * @access public
- * @return void
- */
- public function run(){
- if(C('USE_SESSION') == true){
- session_start();
- }
- C('APP_FULL_PATH', getcwd().'/'.C('APP_PATH'). '/');
- includeIfExist( C('APP_FULL_PATH').'/common.php');
- $pathMod = C('PATH_MOD');
- $pathMod = empty($pathMod)? 'NORMAL':$pathMod;
- spl_autoload_register(array('SinglePHP', 'autoload'));
- if(strcmp(strtoupper($pathMod),'NORMAL') === 0 !isset(|| $_SERVER['PATH_INFO'])){
- $this->c = isset($_GET['c'])?$_GET['c']:'Index';
- $this->a = isset($_GET['a'])?$_GET['a']:'Index';
- }else{
- $pathInfo = isset($_SERVER['PATH_INFO'])?$_SERVER[ 'PATH_INFO']:'';
- $pathInfoArr = explode('/',trim($pathInfo,'/'));
- if(isset($pathInfoArr[0]) && $pathInfoArr[0] !== ''){
- $this->c = $pathInfoArr[0];
- }else{
- $this->c = 'Index';
- }
- if( isset($pathInfoArr[1])){
- $this->a = $pathInfoArr[1];
- }else{
- $this->a = 'Index';
- }
- }
- if(!class_exists($this->c.'Controller')){
- halt('控制器'.$this->c.'不存在');
- }
- $controllerClass = $this->c.'Controller';
- $controller = new $controllerClass();
- if(!method_exists($controller, $this->a.'Action')){
- halt('方法'.$this->a.'不存在');
- }
- call_user_func(array($controller,$this->a.'Action'));
- }
- /**
- * 自動載入函數
- * @param string $class 類別名稱
- */
- public static function autoload($class){
- if(substr($class,-10)=='Controller'){
- includeIfExist(C( 'APP_FULL_PATH').'/Controller/'.$class.'.class.php');
- }elseif(substr($class,-6)=='Widget'){
- includeIfExist(C( 'APP_FULL_PATH').'/Widget/'.$class.'.class.php');
- }else{
- includeIfExist(C('APP_FULL_PATH').'/Lib/'.$class.'.class.php');
- }
- }
- }
- /**
- * 컨트롤러 클래스
- */
- 클래스 컨트롤러 {
- /**
- * 인스턴스 보기
- * @var 보기
- */
- private $_view;
- /**
- * 생성자, 뷰 인스턴스 초기화, 후크 호출
- */
- public 함수 __construct(){
- $this->_view = new View();
- $this->_init();
- }
- /**
- * 프리훅
- */
- 보호된 함수 _init(){}
- /**
- * 템플릿 렌더링 및 출력
- * @param null|string $tpl 템플릿 파일 경로
- * 매개변수는 앱/뷰/파일에 대한 상대 경로이며 다음과 같은 접미사 이름을 포함하지 않습니다. index/index
- * 매개변수가 비어 있는 경우 기본값은 $controller/$action.php
- * 매개변수에 "/"가 포함되어 있지 않으면 기본값은 $controller/$tpl
- * @ 무효 반환
- */
- 보호된 함수 표시($tpl=''){
- if($tpl === ''){
- $trace = debug_backtrace();
- $controller = substr($trace[1]['class'], 0, -10);
- $action = substr($trace[1]['function'], 0 , -6);
- $tpl = $컨트롤러 . '/' . $action;
- }elseif(strpos($tpl, '/') === false){
- $trace = debug_backtrace();
- $controller = substr($trace[1]['class '], 0, -10);
- $tpl = $controller . '/' . $tpl;
- }
- $this->_view->display($tpl);
- }
- /**
- * 뷰 엔진에 대한 템플릿 변수 설정
- * @param string $name 템플릿에서 사용할 변수 이름
- * @param mix $value 템플릿의 변수 이름에 해당하는 값
- * @ 반환 무효
- */
- 보호된 함수 할당($name, $value){
- $this->_view->할당($name,$value);
- }
- /**
- * 데이터를 json 형식으로 브라우저에 출력하고 코드 실행을 중지합니다
- * @param array $data 출력할 데이터
- */
- 보호된 함수 ajaxReturn($data) {
- echo json_encode($data);
- exit;
- }
- /**
- * 지정된 URL로 리디렉션
- * @param string $url 리디렉션할 URL
- * @param void
- */
- 보호된 함수 리디렉션($url){
- header("위치: $url");
- exit;
- }
- }
- /**
- * 수업 보기
- */
- 클래스 보기 {
- /**
- * 파일 디렉터리 보기
- * @var string
- */
- 비공개 $_tplDir;
- /**
- * 파일 경로 보기
- * @var string
- */
- 비공개 $_viewPath;
- /**
- * 변수 목록 보기
- * @var array
- */
- 비공개 $_data = array();
- /**
- * tplInclude용 변수 목록
- * @var array
- */
- 비공개 정적 $tmpData;
- /**
- * @param 문자열 $tplDir
- */
- 공용 함수 __construct($tplDir=''){
- if($tplDir == ''){
- $this->_tplDir = './'.C('APP_PATH').'/View/';
- }else{
- $this->_tplDir = $tplDir;
- }
- }
- /**
- * 뷰 엔진에 대한 템플릿 변수 설정
- * @param string $key 템플릿에서 사용할 변수 이름
- * @param mix $value 템플릿의 변수 이름에 해당하는 값
- * @ 반환 무효
- */
- 공용 함수 할당($key, $value) {
- $this->_data[$key] = $value;
- }
- /**
- * 템플릿 렌더링 및 출력
- * @param null|string $tplFile 앱/뷰/파일을 기준으로 한 템플릿 파일 경로에는 인덱스/인덱스와 같은 접미사 이름이 포함되지 않습니다.
- * @return void
- */
- 공용 함수 표시($tplFile) {
- $this->_viewPath = $this->_tplDir . $tpl파일 . '.php';
- unset($tplFile);
- extract($this->_data);
- include $this->_viewPath;
- }
- /**
- * 템플릿 파일에 다른 템플릿을 포함하는 데 사용됩니다.
- * @param string $path View 디렉터리에 대한 상대 경로
- * @param array $data 하위 템플릿에 전달되는 변수 목록, 키 은 변수 이름이고, value는 변수 값입니다
- * @return void
- */
- 공용 정적 함수 tplInclude($path, $data=array()){
- self::$tmpData = array(
- 'path' => C('APP_FULL_PATH') .' /보기/' . $path . '.php',
- 'data' => $data,
- );
- unset($path);
- unset($data);
- extract(self::$tmpData['data']);
- include self::$tmpData['path'];
- }
- }
- /**
- * 위젯 클래스
- * 사용 시 이 클래스를 상속받아서 Invoke 메소드를 오버라이드하고, Invoke 메소드에서 display
- 를 호출해야 합니다.*/
- 클래스 위젯 {
- /**
- * 인스턴스 보기
- * @var 보기
- */
- protected $_view;
- /**
- * 위젯명
- * @var string
- */
- protected $_widgetName;
- /**
- * 생성자, 뷰 인스턴스 초기화
- */
- 공용 함수 __construct(){
- $this->_widgetName = get_class($this);
- $dir = C('APP_FULL_PATH') . '/Widget/Tpl/';
- $this->_view = new View($dir);
- }
- /**
- * 처리 로직
- * @param 혼합 $data 매개변수
- */
- 공용 함수 호출($data) {}
- /**
- * 렌더 템플릿
- * @param string $tpl 템플릿 경로, 비어 있으면 클래스 이름을 템플릿 이름으로 사용
- */
- 보호된 함수 표시($tpl=''){
- if($tpl == ''){
- $tpl = $this-> ;_widgetName;
- }
- $this->_view->display($tpl);
- }
- /**
- * 뷰 엔진에 대한 템플릿 변수 설정
- * @param string $name 템플릿에서 사용할 변수 이름
- * @param mix $value 템플릿의 변수 이름에 해당하는 값
- * @ 반환 무효
- */
- 보호된 함수 할당($name, $value){
- $this->_view->할당($name,$value);
- }
- }
- /**
- * 데이터베이스 작업 클래스
- * 사용 방법:
- * DB::getInstance($conf)->query('select * from table');
- * 여기서 $conf는 연관 배열입니다. , 다음 키를 포함해야 합니다:
- * DB_HOST DB_USER DB_PWD DB_NAME
- * DB_PORT 및 DB_CHARSET을 사용하여 포트와 인코딩을 지정할 수 있으며 기본값은 3306 및 utf8입니다
- */
- 클래스 DB {
- /**
- * 데이터베이스 링크
- * @var 리소스
- */
- 비공개 $_db;
- /**
- * 마지막 sql 저장
- * @var string
- */
- 비공개 $_lastSql;
- /**
- * 마지막 SQL 문의 영향을 받은 행 수
- * @var int
- */
- 비공개 $_rows;
- /**
- * 마지막 SQL 실행 오류
- * @var string
- */
- 비공개 $_error;
- /**
- * 인스턴스 배열
- * @var 배열
- */
- 비공개 정적 $_instance = array();
- /**
- * 생성자
- * @param array $dbConf 구성 배열
- */
- 비공개 함수 __construct($dbConf){
- if(!isset($dbConf['DB_CHARSET']) ){
- $dbConf['DB_CHARSET'] = 'utf8';
- }
- $this->_db = mysql_connect($dbConf['DB_HOST'].':'.$dbConf['DB_PORT '],$dbConf['DB_USER'],$dbConf['DB_PWD']);
- if($this->_db === false){
- halt(mysql_error());
- }
- $selectDb = mysql_select_db($dbConf['DB_NAME'],$this->_db);
- if($selectDb === false){
- halt(mysql_error());
- }
- mysql_set_charset($dbConf['DB_CHARSET']);
- }
- 비공개 함수 __clone(){}
- /**
- * DB 클래스 가져오기
- * @param array $dbConf 구성 배열
- * @return DB
- */
- 정적 공개 함수 getInstance($ dbConf){
- if(!isset($dbConf['DB_PORT'])){
- $dbConf['DB_PORT'] = '3306';
- }
- $key = $dbConf[' DB_HOST'].':'.$dbConf['DB_PORT'];
- if(!isset(self::$_instance[$key]) || !(self::$_instance[$key] self) ){
- self::$_instance[$key] = new self($dbConf);
- }
- return self::$_instance[$key];
- }
- /**
- * 이스케이프된 문자열
- * @param string $str 이스케이프할 문자열
- * @return string 이스케이프된 문자열
- */
- 공용 함수 escape($str){
- return mysql_real_escape_string($str, $this->_db);
- }
- /**
- * select 문에 사용되는 쿼리
- * @param string $sql 쿼리할 sql
- * @return bool|array 쿼리가 성공하면 해당 배열을 반환하고, 실패하면 해당 배열을 반환하고, 거짓
- */
- 공용 함수 쿼리($sql){
- $this->_rows = 0;
- $this->_error = '';
- $this->_lastSql = $sql;
- $this->logSql();
- $res = mysql_query($sql,$this->_db);
- if($res === false){
- $this->_error = mysql_error($this->_db);
- $this->logError();
- false 반환;
- }else{
- $this->_rows = mysql_num_rows($res) ;
- $result = array();
- if($this->_rows >0) {
- while($row = mysql_fetch_array($res, MYSQL_ASSOC)){
- $result[ ] = $row;
- }
- mysql_data_seek($res,0);
- }
- return $result;
- }
- }
- /**
- * 삽입/업데이트/삭제 문에 사용되는 쿼리
- * @param string $sql 쿼리할 SQL
- * @return bool|int 쿼리가 성공하면 영향을 받은 레코드 수를 반환하고, 실패하면 false를 반환합니다
- */
- 공용 함수 실행($sql) {
- $this->_rows = 0;
- $this->_error = '';
- $this->_lastSql = $sql;
- $this->logSql();
- $result = mysql_query($sql, $this->_db) ;
- if ( false === $result) {
- $this-> ;_error = mysql_error($this->_db);
- $this->logError();
- false 반환;
- } else {
- $this->_rows = mysql_affected_rows($ this->_db);
- return $this->_rows;
- }
- }
- /**
- * 마지막 쿼리의 영향을 받은 레코드 수 가져오기
- * @return int 영향을 받은 레코드 수
- */
- 공용 함수 getRows(){
- return $this->_rows;
- }
- /**
- * 마지막 삽입 이후 생성된 자동 증가 ID 가져오기
- * @return int 자동 증가 ID
- */
- 공개 함수 getInsertId() {
- return mysql_insert_id($this->_db);
- }
- /**
- * 마지막 쿼리의 sql 가져오기
- * @return string sql
- */
- 공용 함수 getLastSql(){
- return $this->_lastSql;
- }
- /**
- * 마지막 쿼리의 오류 정보 가져오기
- * @return 문자열 오류 정보
- */
- 공용 함수 getError(){
- return $this->_error;
- }
- /**
- * SQL을 파일에 기록
- */
- 비공개 함수 logSql(){
- Log::sql($this- >_lastSql);
- }
- /**
- * 오류 로그를 파일에 기록
- */
- 비공개 함수 logError(){
- $str = '[SQL ERR]'.$this->_error.' SQL:'.$this->_lastSql;
- 로그::warn($str);
- }
- }
- /**
- * 로그 클래스
- * 사용 방법: Log::fatal('error msg');
- * 저장 경로는 App/Log, 날짜별로 저장됩니다.
- * Fatal 및 warning은 에 기록됩니다. .wf 파일의 .log
- */
- 클래스 로그{
- /**
- * 로그, SAE 환경 지원
- * @param string $msg 로그 내용
- * @param string $level 로그 수준
- * @param bool $wf 오류 로그 여부
- */
- 공용 정적 함수 write($msg, $level='DEBUG', $wf=false){
- if(function_exists('sae_debug')){ //如果是SAE, 则使用sae_debug函数打日志
- $msg = "[{$level}]".$msg;
- sae_set_display_errors(false);
- sae_debug(trim($msg));
- sae_set_display_errors (참);
- }else{
- $msg = date('[ Y-m-d H:i:s ]')."[{$level}]".$msg."rn";
- $logPath = C('APP_FULL_PATH').'/Log/'.date('Ymd').'.log';
- if($wf){
- $logPath .= '.wf';
- }
- file_put_contents($logPath, $msg, FILE_APPEND);
- }
- }
- /**
- * 列印fatal日誌
- * @param string $msg 日誌資訊
- */
- 公用靜態函數fatal($msg){
- self::write($msg, 'FATAL', true);
- }
- /**
- * 列印warning日誌
- * @param string $msg 日誌資訊
- */
- 公用靜態函數warn($msg){
- self::write($msg, 'WARN', true);
- }
- /**
- * 列印notice日誌
- * @param string $msg 日誌資訊
- */
- 公共靜態函數通知($msg) {
- self::write($msg, '注意');
- }
- /**
- * 列印debug日誌
- * @param string $msg 日誌資訊
- */
- 公用靜態函式debug($msg){
- self:: write($msg, 'DEBUG');
- }
- /**
- * 列印sql日誌
- * @param string $msg 日誌資訊
- */
- 公用靜態函數sql($msg){
- self::write($msg, 'SQL ');
- }
- }
- /**
- * ExtException類,記錄額外的異常資訊
- */
- class ExtException extends Exception{
- /**
- * @var 陣列
- */
- protected $extra;/**
- * @param string $message
- * @param array $extra
- * @param int $code
- * @param null $previous
- */
- public function __construct($message = "", $extra = array(), $code = 0, $previous = null){
- $this->extra = $ extra;
- parent::__construct($message, $code, $previous);
- }
- /**
- * 取得額外的異常資訊
- * @return array
- */
- public function getExtra(){
- return $this this this ->extra;
- }
- }
複製程式碼
|