ThinkPHP後臺治理具有項目自動建立的功能,首先確保後臺治理項目運行正常。
自動建立的做用是根據節點治理裏面添加的項目名稱自動建立項目的目錄結構、進口文件、配置文件等,免往了手動建立衆多目錄和文件的麻煩。
要使用自動建立功能,請確認你的網站根目錄具備可寫權限。
而後,在後臺的節點治理添加項目節點,添加成功後,在列表的操縱部分點擊建立鏈接,系統就會自動建立項目目錄結構,並把後臺治理的配置文件複製到添加的項目中,假如須要修改,請手動進行修改。
留意:
爲了安全,在後臺刪除項目並不會刪除項目目錄結構,假如須要,請手動對目錄結構進行刪除操縱。
爲了安全,在後臺刪除項目並不會刪除項目目錄結構,假如須要,請手動對目錄結構進行刪除操縱。
模塊自動天生
ThinkPHP後臺治理具有自動天生模塊的功能,條件是你已經爲模塊建立好了相應的符合配置要求的數據表。
這一功能比較適合功能單一的模塊操縱,Action類、Dao類和Vo類均使用同名數據表。
要自動建立模塊,請首先在節點治理裏面添加模塊節點,而後點擊建立鏈接自動建立模塊。
模塊自動天生的文件包括,項目的Action類(沒有任何操縱方法)、Dao類(沒有任何方法,直接繼續Dao類)和Vo類(已經包含數據表對應字段的屬性定義),以及模版的模塊目錄。
請放心,假如已經存在建立好的項目類庫文件,系統不會再次從新天生。
表單驗證類表單驗證類
ThinkPHP內置了表單驗證類來提供對錶單提交的數據進行驗證,這裏指的是後臺驗證,而不是客戶真個驗證,客戶端驗證請參考Js類庫的CheckForm類。
表單驗證類位於ORG.Text.Validation,經過正則的方式對數據進行驗證,並定義了一些經常使用的驗證規則。
包括:
包括:
1. require 字段必須
2. email 郵箱
3. phone 電話號碼
4. mobile 手機號碼
5. url URL地址
6. currency 貨幣
7. number 數字
8. zip 郵政編碼
9. qq QQ號碼
10. integer 整數
11. double 浮點數
12. english 英文
13. chinese 中文
14. username 用戶名
15. password 密碼
驗證類的使用方法:
複製PHP內容到剪貼板 PHP代碼:import(ORG.Text.Validation);
複製PHP內容到剪貼板 PHP代碼:import(ORG.Text.Validation);
$validation = Validation: :getInstance();
if(!$validation->check($_POST[\'username\'],\’username\’)) {
$this->error(\’用戶名不符合規範!\’);
}
使用自定義的正則式驗證 複製PHP內容到剪貼板 PHP代碼:if(!$validation->check($_POST[\'name\'],\’/^[a-z]w{4,}$/i\’)) {
$this->error( \’用戶名必須是以字母打頭,且5位以上!\’);
}
在ThinkPHP框架中,你還能夠單獨定義一個_validation方法,用來對錶單數據進行驗證。
系統在執行操縱以前,會檢查該模塊是否存在_validation方法,假如存在,會自動調用進行驗證。
一個典型的_validation方法定義以下,當驗證沒有經過的時候,系統會返回$this->error信息給客戶端。
複製PHP內容到剪貼板 PHP代碼:function _validation()
複製PHP內容到剪貼板 PHP代碼:function _validation()
{
$validation = Validation: :getInstance();
//對全部須要驗證的數據進行驗證
if(isset($_POST[\'name\'])) {
if(!$validation->check($_POST[\'name\'],\’require\’)) {
$this->error = \’用戶名必須\’;
return false;
}
}
if(isset($_POST[\'password\']) ) {
if(!$validation->check($_POST[\'password\'],\’require\’)) {
$this->error = \’密碼有誤\’;
return false;
}
}
return true;
}
Vo自動驗證ThinkPHP還支持Vo自動驗證,能夠無需定義_validation方法來進行驗證,只須要在Vo類定義的時候使用_validation屬性定義須要驗證的屬性,在表單提交的時候系統會完成自動驗證過程。
Vo類的_validation屬性定義格式以下:
複製PHP內容到剪貼板 PHP代碼:var $_validate = array(
複製PHP內容到剪貼板 PHP代碼:var $_validate = array(
array(content,require,內容不能爲空),
array(email,email,Email格式錯誤),
array(userId,/^d+$/,必須是數字),
);
_validate 屬性是一個二維數組,每一個元素定義了一個驗證因子,由三個元素組成且必須,第一個元素是要驗證的屬性名,第二個元素是驗證規則,支持定義規則和正則,第三個元素是出錯提示信息。
系統會在根據表單提交數據建立Vo對象的時候自動對_validate 定義的內容進行驗證。
例如:
複製PHP內容到剪貼板 PHP代碼:$dao = D(Blog);
例如:
複製PHP內容到剪貼板 PHP代碼:$dao = D(Blog);
$vo = $dao->createVo();
if(false === $vo) {
$this->error($dao->error);
}
Vo自動填充在Vo類定義 $_auto 屬性,能夠完成Vo自動填充功能,用來處理默認值和其餘系統寫進字段。
定義方法:
複製PHP內容到剪貼板 PHP代碼:var $_auto = array (
定義方法:
複製PHP內容到剪貼板 PHP代碼:var $_auto = array (
array(\’status\’,\’1\’,\’ADD\’),
array(\’mTime\’,\’time\’,\’UPDATE\’),
array(\’type\’,\’0\’,\’ALL\’),
);
每一個自動填充項是一個數組,依次表明 字段名稱、填充值和填充類型(ALL 始終 ADD 新增時填充 UPDATE 更新時填充)。
填充類型留空默認表示ADD。
填充類型留空默認表示ADD。
在使用Dao的CreateVo方法建立Vo對象的時候,假如存在_auto定義,就會進行自動填充。
填充值假如是函數就填充函數返回值,不然就按照字符串填充。
PS:
該自動填充可能會覆蓋表單提交項目。
其目的是爲了防止表單非法提交字段。
前置和後置操縱通用前置和後置操縱
該自動填充可能會覆蓋表單提交項目。
其目的是爲了防止表單非法提交字段。
前置和後置操縱通用前置和後置操縱
在ThinkPHP中,你能夠給任何一個操縱定義前置和後置操縱方法。
前置操縱的定義就是在當前操縱方法的前面添加_before_前綴,然後置操縱的定義就是在當前操縱方法的前面添加_after_前綴。
例如,咱們已經給UserAction定義了一個del操縱方法,咱們能夠定義:
_before_del() 在del操縱以前執行
_after_del() 在del操縱以後執行(del操縱正常執行完畢)
內置前置和後置操縱
另外,假如使用系統內置的insert和update操縱的話,會首先檢查是否存在_operation方法,這個方法是系統在表單提交時候的默認前置操縱。
_operation方法沒有任何參數,主要是用來檢測表單的提交數據。
在insert或者update執行完畢後,系統會檢查是否存在_trigger方法,這個方法是系統默認的數據更新觸發器方法。
_trigger方法只有一個參數,也就是要保存的Vo對象。
列表過濾方法
假如你使用系統內置的index方法,系統還會檢查_filter方法,該方法負責對列表數據進行過濾,當你的列表須要針對不一樣的用戶進行斷定和過濾的時候,這個方法很是有效。
分頁類使用ThinkPHP內置了分頁類,位於 ORG.Util.Page ,使用舉例:
複製PHP內容到剪貼板 PHP代碼:$dao = D(\’User\’);
複製PHP內容到剪貼板 PHP代碼:$dao = D(\’User\’);
$count = $dao->getCount();
import(ORG.Util.Page);
if(!empty($_REQUEST[\'listRows\'])) {
$listRows = $_REQUEST[\'listRows\'];
}else{
$listRows=4;
}
$p= new Page($count,$listRows);
$list=$dao->findAll(\’\',\’\',\’*\’,\’id asc\’,$p->firstRow.\’,\’.$p->listRows);
$page= $p->show();
$this->assign(page,$page);
$this->assign(userList,$list);
在模版文件中,使用標籤 複製PHP內容到剪貼板 PHP代碼:{$page}
就可用輸出分頁
顯示效果
其中每頁顯示的記錄數、頁數等信息都可以修改。
假如須要定製分頁的顯示,可使用下面的方式輸出分頁 複製PHP內容到剪貼板 PHP代碼:$page= $p->show(true);
$this->assign(page,$page);
而後,在模版文件裏面本身添加下面的變量
1. $page[\'totalRows\'] // 總的記錄數
2. $page[\'upPage\'] // 上一頁連接
3. $page[\'downPage\'] // 下一頁連接
4. $page[\'totalPages\'] // 總頁數
5. $page[\'firstPage\'] // 第一頁連接
6. $page[\'endPage\'] // 最後一頁連接
7. $page[\'nextPages\'] //下一個連接頁(好比說設置每頁顯示5頁連接,這裏指的是下一個5頁)
8. $page[\'prePages\'] // 上一個連接頁
9. $page[\'linkPages\'] // 當前連接頁
10. $page[\'nowPage\'] // 當前頁
不過,目前這種方式仍是存在必定不足,更好的方式是本身擴展一個Page類來定製輸出。
關聯查詢操縱關於ThinkPHP的關聯查詢支持。
關聯查詢操縱關於ThinkPHP的關聯查詢支持。
目前支持的表間關聯方式包括三種:
一、ONE_TO_ONE ( 包括HAS_ONE 和 BELONGS_TO )
二、ONE_TO_MANY( 包括HAS_MANY 和 BELONGS_TO)
三、MANY_TO_MANY
Dao類增長了一個xfind() 方法用於直接獲取帶關聯記錄的返回結果,而 getRelation() 方法用於獲取已經返回記錄的關聯記錄(集)。
xfind的參數和find方法保持不變,區別在於xfind方法會一塊兒返回關聯記錄,而find方法默認不返回關聯記錄。
find方法最後增長了一個relation參數,用以控制是否進行關聯查詢。
xfind方法僅僅是find方法的一個引用。
relation參數支持false(不進行關聯查詢)、true(進行全部關聯查詢)和array(只查詢某個關聯)。
xfind方法僅僅是find方法的一個引用。
relation參數支持false(不進行關聯查詢)、true(進行全部關聯查詢)和array(只查詢某個關聯)。
舉例:
複製PHP內容到剪貼板 PHP代碼:$dao->find(id=2); // 返回id爲2的記錄
複製PHP內容到剪貼板 PHP代碼:$dao->find(id=2); // 返回id爲2的記錄
$dao->xfind(id=2); // 返回id爲2的記錄,並同時返回其關聯記錄(假若有定義)
假如不是使用find方法進行查詢,能夠配合getRelation方法進行關聯記錄的查詢。
例如:
複製PHP內容到剪貼板 PHP代碼:$user = $dao->getById($id);
複製PHP內容到剪貼板 PHP代碼:$user = $dao->getById($id);
$user = $dao->getRelation($user);
// 或者使用下面的方法
$user = $dao->getById($id,\’\',\’*\’,\’\',true);
一樣,增長了xFindAll方法進行關聯查詢(返回Volist對象),而findAll方法默認不進行關聯查詢。
例如:
複製PHP內容到剪貼板 PHP代碼:$list = $dao->findAll(type=1); //查詢type爲1的用戶
複製PHP內容到剪貼板 PHP代碼:$list = $dao->findAll(type=1); //查詢type爲1的用戶
$list = $dao->xFindAll(type=1); // 查詢並返回關聯記錄
關聯查詢須要Vo類定義_link 屬性配合,例如UserVo中定義以下關聯信息:
複製PHP內容到剪貼板 PHP代碼:var $_link = array(
複製PHP內容到剪貼板 PHP代碼:var $_link = array(
// 每一個用戶都有一個我的檔案
array( \’mapping_type\’=>HAS_ONE,
\’class_name\’=>\’Profile\’,
\’foreign_key\’=>\’userId\’,
\’mapping_name\’=>\’profile\’,
),
// 每一個用戶有多個文章
array( \’mapping_type\’=>HAS_MANY,
\’class_name\’=>\’Article\’,
\’foreign_key\’=>\’userId\’,
\’mapping_name\’=>\’articles\’,
\’mapping_order\’=>\’cTime desc\’),
// 每一個用戶都屬於一個部分
array( \’mapping_type\’=>BELONGS_TO,
\’class_name\’=>\’Dept\’,
\’foreign_key\’=>\’userId\’,
\’mapping_name\’=>\’dept\’),
// 每一個用戶能夠屬於多個組,每一個組能夠有多個用戶
array( \’mapping_type\’=>MANY_TO_MANY,
\’class_name\’=>\’Group\’,
\’mapping_name\’=>\’groups\’,
\’foreign_key\’=>\’userId\’,
\’relation_foreign_key\’=>\’goupId\’,
\’relation_table\’=>\’think_gourpUser\’)
);
而getRelation方法,則用於獲取已經查詢到的Vo對象的某個關聯記錄 複製PHP內容到剪貼板 PHP代碼:$vo = $dao->getRelation($vo,HAS_MANY,\’articles\’);
關於映射關係的定義,還有一些高級默認規則,除了mapping_type、class_name 和mapping_name 三個屬性必須外,其餘都是可選的。
另外,還能夠包括mapping_order、condition、mapping_limit等高級屬性。
另外,還能夠包括mapping_order、condition、mapping_limit等高級屬性。
默認規則
外鍵的默認規則是當前Vo對象名稱+id,例如:
UserVo對應的多是表think_user (留意:
think只是一個表前綴,能夠隨意配置)
think只是一個表前綴,能夠隨意配置)
那麼think_user表的外鍵默覺得 user_id,假如不是,就必須在定義表間映射關係的時候定義 foreign_key 。
一樣的道理,對於多對多的狀況,relation_foreign_key 的規則相同。
多對多的中間表默認表規則以下:
假如think_user 和 think_group 存在一個對應的中間表,默認的表名應該是
假如是由group來操縱關聯表,中間表應該是 think_group_user,假如是從user表來操縱,那麼應該是think_user_group,也就是說,多對多關聯的設置,必須有一個Vo類裏面須要顯式定義中間表,不然雙向操縱會出錯。
中間表無需另外的id主鍵(可是這並不影響中間表的操縱),一般只是由 user_id 和 group_id 構成。
另一個潛規則,因爲表間映射關係能夠定義condition屬性,一般都是經過外鍵來獲取關聯數據,可是假如你定義了condition屬性,那麼就會從新使用condition的條件來獲取關聯表的數據。
在HAS_MANY 和MANY_TO_MANY狀況下,可使用mapping_order 和 mapping_limit 進行記錄的排序和獲取部分數據。
HAS_ONE 和 BELONGS_TO 永遠都只會返回最多一條記錄。
HAS_ONE 和 BELONGS_TO 永遠都只會返回最多一條記錄。
另外除了MANY_TO_MANY以外,其餘映射關係可使用 mapping_fields 來返回你須要的關聯表字段。
關於自引用關聯
假如Vo類的_link屬性裏面對於 class_name 爲自身的狀況就屬於自引用關聯。
一般用於從屬關係的關聯,例如,某個用戶是另一個用戶的領導,某個節點下面有多個子節點這樣的應用狀況。
對於這樣的狀況,ThinkPHP增長了一個parent_key屬性來定義,該屬性在自引用方式下面有效。
例如NodeVo中有以下定義:
複製PHP內容到剪貼板 PHP代碼://每一個節點具備多個子節點
例如NodeVo中有以下定義:
複製PHP內容到剪貼板 PHP代碼://每一個節點具備多個子節點
var $_link = array(
array( \’mapping_type\’=>HAS_MANY,
\’class_name\’=>\’Node\’,
\’foreign_key\’=>\’id\’,
\’parent_key\’=>\’pid\’,
\’mapping_name\’=>\’sub\’,
\’mapping_order\’=>\’seqNo asc\’),
);
parent_key 默認名稱爲parent_id,假如不是則須要指定。
權限控制ThinkPHP以基於Spring的Acegi安全系統做爲參考原型,並作了簡化,以適合目前的ThinkPHP結構,提供了一個多層的、可定製的安全體系來爲應用開發提供安全控制。
安全體系中主要有:
權限控制ThinkPHP以基於Spring的Acegi安全系統做爲參考原型,並作了簡化,以適合目前的ThinkPHP結構,提供了一個多層的、可定製的安全體系來爲應用開發提供安全控制。
安全體系中主要有:
安全攔截器
認證治理器
決策訪問治理器
運行身份治理器
安全攔截器
安全攔截器就好比一道道門,在系統的安全防禦系統中可能存在不少不一樣的安全控制環節,一旦某個環節你未經過安全體系認證,那麼安全攔截器就會實施攔截。
認證治理器
防禦體系的第一道門就是認證治理器,認證治理器負責決定你是誰,通常它經過驗證你的主體(一般是一個用戶名)和你的憑證(一般是一個密碼),或者更多的資料來作到。
更簡單的說,認證治理器驗證你的身份是否在安全防禦體系受權範圍以內。
更簡單的說,認證治理器驗證你的身份是否在安全防禦體系受權範圍以內。
訪問決策治理
當然經過了認證治理器的身份驗證,可是並不表明你能夠在系統裏面肆意妄爲,因爲你還須要經過訪問決策治理這道門。
訪問決策治理器對用戶進行受權,經過考慮你的身份認證信息和與受保護資源關聯的安全屬性決定是是否能夠進進系統的某個模塊,和進行某項操縱。
訪問決策治理器對用戶進行受權,經過考慮你的身份認證信息和與受保護資源關聯的安全屬性決定是是否能夠進進系統的某個模塊,和進行某項操縱。
例如,安全規則規定只有主管才答應訪問某個模塊,而你並無被授予主管權限,那麼安全攔截器會攔截你的訪問操縱。
決策訪問治理器不能單獨運行,必須首先依靠認證治理器進行身份確認,所以,在加載訪問決策過濾器的時候已經包含了認證治理器和決策訪問治理器。
爲了知足應用的不一樣須要,ThinkPHP在進行訪問決策治理的時候採用兩種模式:
登陸模式和即時模式。
登陸模式和即時模式。
登陸模式,系統在用戶登陸的時候讀取改用戶所具有的受權信息到Session,下次再也不從新獲取受權信息。
也就是說即便治理員對該用戶進行了權限修改,用戶也必須在下次登陸後才能生效。
也就是說即便治理員對該用戶進行了權限修改,用戶也必須在下次登陸後才能生效。
即時模式就是爲了解決上面的題目,在每次訪問系統的模塊或者操縱時候,進行即便驗證該用戶是否具備該模塊和操縱的受權,從更高程度上保障了系統的安全。
運行身份治理器
運行身份治理器的用處在大多數應用系統中是有限的,例如某個操縱和模塊須要多個身份的安全需求,運行身份治理器能夠用另外一個身份替換你目前的身份,從而答應你訪問應用系統內部更深處的受保護對象。
這一層安全體系目前的RBAC插件中還沒有實現。
這一層安全體系目前的RBAC插件中還沒有實現。
早先RBAC組件是集成在ThinkPHP框架中的,從0.9版本引進了插件機制後,已經把RBAC組件轉換成插件使用,以方便用戶替換或者擴展,並且在調用接口上也更加方便。
要啓用RBAC插件,請在項目配置文件_appConfig.php(請留意:
項目配置文件名是以App命名的支持多種格式,運行時候系統會自動天生一個定義文件,最新的版本中自動天生的定義文件名是_appConfig.php ,請留意更新) 中設置
項目配置文件名是以App命名的支持多種格式,運行時候系統會自動天生一個定義文件,最新的版本中自動天生的定義文件名是_appConfig.php ,請留意更新) 中設置
USER_AUTH_ON 爲True
並設置認證類型USER_AUTH_TYPE
1 普通認證(認證一次)
2 高級認證(實時認證)
不設置默覺得1
認證識別名USER_AUTH_KEY 是用於檢查用戶是否通過身份認證的標識,一旦用戶通過系統認證,系統會把該用戶編號保存在$_SESSION[USER_AUTH_KEY]中
爲了知足應用系統的須要,RBAC插件中能夠設置
REQUIRE_AUTH_MODULE 須要認證的模塊
NOT_AUTH_MODULE 無需認證的模塊
多個模塊之間用逗號分割
假如某個模塊須要認證,可是用戶尚未通過身份認證,就會跳轉到
USER_AUTH_GATEWAY 認證網關,例如 /Public/login
驗證地址就是:
項目進口文件URL地址/Public/login
項目進口文件URL地址/Public/login
假設認證網關的驗證操縱地址是/Public/CheckLogin,能夠在public模塊的checkLogin操縱中採用以下方式進行認證:
<?php
// 天生認證Map條件
// 這裏使用用戶名、密碼和狀態的方式進行認證
$map = new HashMap();
$map->put(name,$_POST[\'name\']);
$map->put(password,$_POST[\'password\']);
$map->put(status,1);
$authInfo = RBAC: : authenticate($map);
if(false === $authInfo) {
$this->assign(\’error\’,\’登陸失敗,請檢查用戶名和密碼是否有誤!\’);
}else {
// 設置認證識別名
Session: :set(USER_AUTH_KEY,$authInfo->id);
//獲取並保存用戶訪問權限列表
RBAC: :saveAccessList();
// 登陸成功,頁面跳轉
$this->assign(message,\’登陸成功!\’);
$this->assign(jumpUrl,\’http://www.topthink.com.cn\’);
}
$this->forward();
?>
RBAC的委託認證方法
authenticate($map,$dao=\’UserDao\’,$provider=USER_AUTH_PROVIDER)
方法是靜態方法,支持三個參數,其中第一個認證條件$map是必須的,能夠靈活地控制須要認證的字段。
第二個參數是進行認證的Dao類,默認是UserDao類
第三個參數是委託方式 由 USER_AUTH_PROVIDER 設置委託認證治理器的委託方式,目前支持的是 DaoAuthentictionProvider 經過數據庫進行認證。
在應用系統的開發過程當中,只須要設置相關的配置項和添加上面的認證方法,其餘的認證和決策訪問就由RBAC插件的AccessDecision方法自動完成了。
系統會在執行某個模塊的操縱時候,首先斷定該模塊是否須要認證,假如須要認證而且已經登陸,就會獲取當前用戶的權限列表斷定是否具備當前模塊確當前操縱權限,並進行相應的提示。
接下來就是在框架總後臺設置相關項目的模塊和操縱權限了。
首先,在總治理後臺(ThinkPHP自帶的Admin項目)的節點治理添加相關項目、模塊和操縱,做爲權限治理的節點。
假如須要設置公共的操縱,可使用Public模塊,全部屬於Public模塊的操縱對全部模塊都有效。
添加完成項目治理節點後,就在權限治理裏面對某個用戶組設置相關權限(包括項目權限、模塊權限和操縱權限)
之後須要受權就把用戶添加到某個權限組就能夠了,同一個用戶能夠屬於多個權限組。
受權和認證功能涉及到四個數據表,DB_PREFIX爲配置文件中設置的數據庫前綴
DB_PREFIX_group 權限組表
DB_PREFIX_groupuser 組-用戶關聯表
DB_PREFIX_access 訪問權限表
DB_PREFIX_node 權限節點表
ThinkPHP後臺治理的權限受權圖示:
標籤:方法,模塊,定義,剪貼板,系統,項目,權限,節點,表單,用戶,屬性,內容,安全,你的,代碼,時候,就會,多個,數據,方式
關鍵字:
thinkphp,thinkphp 驗證碼,thinkphp 分頁,thinkphp 文件上傳,thinkphp session,thinkphp success,thinkphp搭建cms,thinkphp1.5,thinkphp基礎,thinkphp 特性
相關資訊:
ThinkPHP開發指南(二) 高級特性 – PHPChina 9條回覆-發帖時間:2007年5月25日本篇主要用於添加一些ThinkPHP的高級開發特性,爲了避免影響閱讀,把每一個小主題單獨列出來,比較清晰一 些,有興趣的依次往下面看了,呵呵~1樓 項目自動建立和模塊自動生
關鍵字:
thinkphp,thinkphp 驗證碼,thinkphp 分頁,thinkphp 文件上傳,thinkphp session,thinkphp success,thinkphp搭建cms,thinkphp1.5,thinkphp基礎,thinkphp 特性
相關資訊:
ThinkPHP開發指南(二) 高級特性 – PHPChina 9條回覆-發帖時間:2007年5月25日本篇主要用於添加一些ThinkPHP的高級開發特性,爲了避免影響閱讀,把每一個小主題單獨列出來,比較清晰一 些,有興趣的依次往下面看了,呵呵~1樓 項目自動建立和模塊自動生
使用thinkPHP作註冊程序的實例
數據庫和數據表的結構
具體的操做步驟以下:
第一步:入口文件index.php內容 (此文件基本是屬於固定的格式)
<?php
define(\’THINK_PATH\’,\’./ThinkPHP/\’);
define(\’APP_NAME\’,\’MyApp\’);
define(\’APP_PAHT\’,\’./MyApp/\’);
require_once THINK_PATH.\’ThinkPHP.php\’;
$app=new App();
$app->run();
?>
define(\’THINK_PATH\’,\’./ThinkPHP/\’);
define(\’APP_NAME\’,\’MyApp\’);
define(\’APP_PAHT\’,\’./MyApp/\’);
require_once THINK_PATH.\’ThinkPHP.php\’;
$app=new App();
$app->run();
?>
第二步:Active文件夾中的IndexAction.class.php文件內容
<?php
class IndexAction extends Action
{
public function Index()
{
$this->display();//渲染到模板index.html
}
class IndexAction extends Action
{
public function Index()
{
$this->display();//渲染到模板index.html
}
// 生成驗證碼
public function verify()//這是一個固定的格式
{
import(\」ORG.Util.Image\」);
Image::buildImageVerify();
}
public function verify()//這是一個固定的格式
{
import(\」ORG.Util.Image\」);
Image::buildImageVerify();
}
//檢驗驗證碼是否正確
public function verifyCheck()
{
if (md5($_POST[\'verifyTest\']) != Session::get(\’verify\’))
{
die(\’驗證碼錯誤\’); //若是驗證碼不對就退出程序
}
}
public function verifyCheck()
{
if (md5($_POST[\'verifyTest\']) != Session::get(\’verify\’))
{
die(\’驗證碼錯誤\’); //若是驗證碼不對就退出程序
}
}
function insert()
{
header(\’Content-Type:text/html; charset=utf-8\’);//防止出現亂碼
$this->verifyCheck();//調用本類的函數,
$Pagemodel = D(\」user\」);
$vo = $Pagemodel->create();
if(false === $vo) die($Pagemodel->getError());
$topicid = $Pagemodel->add(); //add方法會返回新添加的記錄的主鍵值
if($topicid) echo \」數據庫添加成功\」;
else throw_exception(\」數據庫添加失敗\」);
}
}
?>
{
header(\’Content-Type:text/html; charset=utf-8\’);//防止出現亂碼
$this->verifyCheck();//調用本類的函數,
$Pagemodel = D(\」user\」);
$vo = $Pagemodel->create();
if(false === $vo) die($Pagemodel->getError());
$topicid = $Pagemodel->add(); //add方法會返回新添加的記錄的主鍵值
if($topicid) echo \」數據庫添加成功\」;
else throw_exception(\」數據庫添加失敗\」);
}
}
?>
第三步:寫模板文件,也就是寫LIB文件夾中的HTML文件
<!DOCTYPE html PUBLIC \」-//W3C//DTD XHTML 1.0 Transitional//EN\」 \」
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\」>
<html xmlns=\」 http://www.w3.org/1999/xhtml\」>
<head>
<meta http-equiv=\」Content-Type\」 content=\」text/html; charset=utf-8\」 />
<title>無標題文檔</title>
<style type=\」text/css\」>
#form1
{
width:250px;
height:250px;
margin:20px auto;
border:1px #039 solid;
padding:20px 20px;
}
</style>
<script type=\’text/javascript\’>
function freshVerify()
{
document.getElementByIdx(\’verifyImg\’).src=\’__URL__/verify/\’+Math.random();
}
</script>
</head>
<body>
<form name=\」form1\」 method=\」post\」 action=\」__URL__/insert\」>
註冊賬號:<br /><br />
賬號:<input maxlength=\」16\」 /><br /><br />
密碼:<input type=\」password\」 maxlength=\」16\」 /><br /><br />
Q Q:<input type=\」text\」 maxlength=\」16\」 /><br /><br />
<html xmlns=\」 http://www.w3.org/1999/xhtml\」>
<head>
<meta http-equiv=\」Content-Type\」 content=\」text/html; charset=utf-8\」 />
<title>無標題文檔</title>
<style type=\」text/css\」>
#form1
{
width:250px;
height:250px;
margin:20px auto;
border:1px #039 solid;
padding:20px 20px;
}
</style>
<script type=\’text/javascript\’>
function freshVerify()
{
document.getElementByIdx(\’verifyImg\’).src=\’__URL__/verify/\’+Math.random();
}
</script>
</head>
<body>
<form name=\」form1\」 method=\」post\」 action=\」__URL__/insert\」>
註冊賬號:<br /><br />
賬號:<input maxlength=\」16\」 /><br /><br />
密碼:<input type=\」password\」 maxlength=\」16\」 /><br /><br />
Q Q:<input type=\」text\」 maxlength=\」16\」 /><br /><br />
驗證碼:<input type=\’text\’ name=\’verifyTest\’ size=\」5\」>
<img style=\’cursor:pointer\’ title=\’刷新驗證碼\’ src=\’__URL__/verify\’ id=\’verifyImg\’ onClick=\’freshVerify()\’/> <br /><br />
<img style=\’cursor:pointer\’ title=\’刷新驗證碼\’ src=\’__URL__/verify\’ id=\’verifyImg\’ onClick=\’freshVerify()\’/> <br /><br />
<input type=\」submit\」 value=\」提交\」 />
<input value=\」重置\」 />
</form>
</body>
</html>
注意:
<input value=\」重置\」 />
</form>
</body>
</html>
注意:
一、也就是一個form,action=\」__URL__/insert\」表示提交到當前Action類(即IndexAction.class.php文件中)的insert函數;
二、此模板(靜態網頁)中的各個name要與user數據表的各個字段是同樣的名字,不然在insert函數中數據不能自動進庫。
三、驗證碼的刷新由靜態網頁負責。值相等由IndexAction類的verifyCheck()負責。
第四步:寫Model類,在model目錄中,文件名爲:UserModel.class.php
<?php
class UserModel extends Model
{
var $_validate=array
(
array(\’user\’,\’require\’,\’帳號不能爲空\’,1),
array(\’qq\’,\’number\’,\’QQ號必須是數字,註冊失敗!\’,2),
array(\’user\’,\’\',\’此賬號己經存在!\’,0,\’unique\’,\’add\’)
);
class UserModel extends Model
{
var $_validate=array
(
array(\’user\’,\’require\’,\’帳號不能爲空\’,1),
array(\’qq\’,\’number\’,\’QQ號必須是數字,註冊失敗!\’,2),
array(\’user\’,\’\',\’此賬號己經存在!\’,0,\’unique\’,\’add\’)
);
var $_auto=array
(
array(\’password\’,\’md5\’,\’add\’,\’function\’),
//array(\’create_time\’,\’time\’,\’add\’,\’function\’), 此句只能填充時間戳
array(\’create_time\’,\’zhongguo_time\’,\’add\’,\’callback\’) //填充年月日時分秒只能用callback,不能用function
);
(
array(\’password\’,\’md5\’,\’add\’,\’function\’),
//array(\’create_time\’,\’time\’,\’add\’,\’function\’), 此句只能填充時間戳
array(\’create_time\’,\’zhongguo_time\’,\’add\’,\’callback\’) //填充年月日時分秒只能用callback,不能用function
);
function zhongguo_time() //此函數只能放在本模塊中,不然調用不到
{
return date(\」Y-m-d H:i:s\」);
}
}
?>
{
return date(\」Y-m-d H:i:s\」);
}
}
?>
註解:
一、文件名,類名必須用user,由於數據庫中對應的是user表;
二、其實只要寫一個框架就好了:
class UserModel extends Model
{
{
}
但爲何還要var $_validate=array()和var $_auto=array()呢?那是由於:
var $_validate=array()是自動驗證的意思,var $_auto=array()是自動填充的意思。
自動驗證就是驗證數據的格式是否正確,自動填充就是你不輸入的值,它自動給你灌進去,好比\’create_time\’創建時間,咱們在模板中沒有這個,但這裏它就自動進庫了。