pixmicat

Subversion Repositories:
Compare Path: Rev
With Path: Rev
/PMC2Prototype/ @ 388  →  /PMC2Prototype/ @ 389
/PMC2Prototype/readme.txt
@@ -1,13 +1,14 @@
Pixmicat!2 Development Frame:
Last Modified: 2007/4/10 20:12
Pixmicat!2 Development Frame: Last Modified: 2007/4/15 19:02
 
* GPLv2 License
* XHTML 1.0 Transitional 化 (1.1 太嚴格不合用)
* 從原本的 PHP 小程式變成 Web Application 的概念,架構一個全新框架
* PHPDoc Comments
* JavaScript + CSS + XHTML + 圖片資源
* 使用 jQuery 作為預設 JavaScript Library,以其作為基礎來寫需要的函式,維護上比較便利
* 盡量不要重複程式碼 (Don't Repeat Yourself),增加維護難度不是一件好事
* 將各個架構以資料夾分明便於分辨及維護
預定資料夾結構:
 
___ pmc2
\_ pixmicat.php [主控制程式]
\_ action [動作控制區塊]
@@ -26,7 +27,6 @@
\_ module [擴充模組]
\_ resource [版面會用到的資源 (*.js, *.css)]
\_ tmp [暫存檔,例如 sizecache.dat]
 
* 本體直接支援多設定檔、多版面設定
* 頁面從 1 開始,不再從 0
* 導入 REST (Representational State Transfer) 架構風格
@@ -45,7 +45,6 @@
* PUT pixmicat.php/comic/posts/589 : 修改 No.589 文章屬性
GET pixmicat.php/comic/module/mod_XXX : 使用 mod_XXX 模組
一類的 (需要制定完整以因應未來可擴充性) * 使用到較為特殊的方式,需考慮相容性
 
* 活用 $_SERVER['PATH_INFO'], $_SERVER['HTTP_METHOD'], $_SERVER['HTTP_ACCEPT']
和 mod_rewrite。記住沒人強制一定要 100% RESTful,只要開發、維護及使用上便利就好
* 將各動作控制區塊分開,取代以往的巨型框架。需要時再取用
/PMC2Prototype/action/module.php
@@ -9,8 +9,16 @@
 
if(!defined('ENV_RUNTIME')) exit('ACCESS DENIED');
 
function module($args){
echo 'Hello, this is action controller "module"';
if($args) var_dump($args);
function module($loadModuleName){
global $PMS;
 
$PMS = PMCCore_loadLibrary('pms');
if(is_string($loadModuleName) && $PMS->init($loadModuleName)){ // 檢查是否有載入這個模組
if(array_search($loadModuleName, $PMS->hookPoints['ModulePage'])!==false){
$PMS->moduleInstance[$loadModuleName]->ModulePage();
return;
}
}
echo '{"status":"Error"}';
}
?>
/PMC2Prototype/pixmicat.php
@@ -19,11 +19,11 @@
*/
 
require('./lib/lib_core.php'); // Class PMCCore
if(version_compare(PHP_VERSION,"5.0.0")>=0)
if(version_compare(PHP_VERSION, '5.0.0', '>=')){ // PHP5+
set_error_handler('PMCCore_errorHandler', E_ERROR | E_WARNING | E_USER_ERROR); // Handle Errors
else // PHP < 5.0.0
set_error_handler('PMCCore_errorHandler'); // Handle Errors
 
}else{
set_error_handler('PMCCore_errorHandler');
}
// Start the buffer if supported
if($Encoding = PMCCore_checkGZipSupport()){ ob_start(); ob_implicit_flush(0); }
 
New file

Property changes:

Name: svn:keywords
+ Id Date Author

/PMC2Prototype/lib/lib_pms.php
@@ -0,0 +1,19 @@
<?php
/**
* Pixmicat! Module System Dispatcher
*
* 設定環境變數並初始化物件以供使用
*
* @package PMCLibrary
* @version $Id$
* @date $Date$
*/
 
$PMSEnv = array( // PMS 環境常數
'MODULE.PATH' => './module/',
'MODULE.PAGE' => PMCCore_getConfig('ENV.PHP_SELF').'/module/',
'MODULE.LOADLIST' => PMCCore_getConfig('MODULE_LOAD')
);
require('./lib/pms.php');
$returnOBJECT = new PMS($PMSEnv);
?>
New file

Property changes:

Name: svn:keywords
+ Id Date Author

/PMC2Prototype/lib/pms.php
@@ -0,0 +1,96 @@
<?php
/**
* Pixmicat! Module System
*
* 增加掛載點供函式掛上並在需要時依序呼叫以動態改變內容或達成各種效果
*
* @package PMCLibrary
* @version $Id$
* @date $Date$
*/
 
class PMS{
var $ENV;
var $moduleInstance, $moduleLists;
var $hookPoints;
 
/* Constructor */
function PMS($ENV){
$this->ENV = $ENV; // 環境變數
// 掛載點
$this->hookPoints = array(
'Head'=>array(), 'Toplink'=>array(), 'PostInfo'=>array(),
'ThreadFront'=>array(), 'ThreadRear'=>array(),
'ThreadPost'=>array(), 'ThreadReply'=>array(),
'Foot'=>array(), 'ModulePage'=>array()
);
$this->moduleInstance = array(); // 存放各模組實體
$this->moduleLists = array(); // 存放各模組類別名稱
}
 
// 模組載入相關
/* 進行初始化 */
function init($specificModule=false){
if($specificModule!==false){ // 有指定載入模組
// 搜尋載入模組列表有沒有,沒有就直接取消程式
if(array_search($specificModule, $this->ENV['MODULE.LOADLIST'])===false) return false;
}
$this->loadModules($specificModule); $this->autoHookMethods();
return true;
}
 
/* 載入擴充模組 */
function loadModules($specificModule=false){
$loadlist = $specificModule ? array($specificModule) : $this->ENV['MODULE.LOADLIST'];
foreach($loadlist as $f){
$mpath = $this->ENV['MODULE.PATH'].$f.'.php';
if(is_file($mpath)){
include($mpath);
$this->moduleInstance[$f] = new $f();
$this->moduleLists[] = $f;
}
}
}
 
/* 取得載入模組列表 */
function getLoadedModules(){
return $this->moduleLists;
}
 
/* 取得特定模組方法列表 */
function getModuleMethods($module){
return array_search($module, $this->moduleLists)!==false ? get_class_methods($module) : array();
}
 
// 提供給模組的取用資訊
/* 取得模組註冊獨立頁面之網址 */
function getModulePageURL($name){
return $this->ENV['MODULE.PATH'].$name;
}
 
// 模組掛載與使用相關
/* 自動掛載相關模組方法於掛載點 */
function autoHookMethods(){
foreach(array_keys($this->hookPoints) as $h){
foreach($this->moduleLists as $m)
if(method_exists($this->moduleInstance[$m], 'autoHook'.$h)){
$this->hookModuleMethod($h, array(&$this->moduleInstance[$m], 'autoHook'.$h));
}
}
}
 
/* 將模組方法掛載於特定掛載點 */
function hookModuleMethod($hookPoint, $methodObject){
if(isset($this->hookPoints[$hookPoint])) $this->hookPoints[$hookPoint][] = $methodObject;
}
 
/* 使用模組方法 */
function useModuleMethods($hookPoint, $parameter){
$imax = count($this->hookPoints[$hookPoint]);
for($i = 0; $i < $imax; $i++){
call_user_func_array($this->hookPoints[$hookPoint][$i], $parameter);
}
}
}
?>