進行禪道二次開發前有必要學習一下禪道使用的框架,本文將簡單介紹zentaoPHP框架以及禪道的目錄結構。
zentaoPHP框架
禪道項目使用zentaoPHP框架,基於b/s架構開發。
基本原理
zentaoPHP框架支持MVC(Model-View-Controller)軟件架構模式,把軟件系統分為三個基本部分:
- 模型(Model):實現程序的功能、數據管理和數據庫設計。對數據庫的增刪改查可以放在這一層。
- 控制器(Controller):負責轉發用戶請求,對請求進行處理,組織各種業務邏輯,准備數據。
- 視圖(View):負責渲染數據,圖形界面設計,通過HTML方式呈現給用戶。
zentaoPHP框架的基本原理:
- 通過apache服務將請求轉交給index.php(
\zentao\app\htdocs\index.php
),由它來進行資源調度。 - index.php加載框架文件,初始化應用,解析URI請求,得到請求對應對模塊名、方法和參數。比如URL:
<zentao-url>/zentao/testcase-browse-1.html
模塊名為testcase,方法名為browse,1為參數。 - 然后加載相應模塊的control方法,model方法,然后渲染模板(view文件)、呈獻給用戶。
數據庫操作
zentaoPHP框架提供了用於操作數據庫的對象類DAO,在\lib\dao\dao.class.php
中定義,加載框架時會自動生成 $this->dao
對象,可以在control, model,view層直接使用 $this->dao
來執行各種方法。
查詢數據庫使用 fetch
系列方法,增刪改相關方法使用 exec()
方法。
比如禪道中查詢所有用例:
$this->dao->select('*')->from(TABLE_CASE)
->where('deleted')->eq(0)
->fetchAll('id');
插入用例:
$this->dao->insert(TABLE_CASE)->data($case)->autoCheck()->exec();
更新用例:
$this->dao->update(TABLE_CASE)->data($case)->autoCheck()->where('id')->eq((int)$caseID)->exec();
刪除用例:
$this->dao->delete()->from(TABLE_CASE)->where('id')->eq($Caseid)->exec();
數據驗證
zentaoPHP將數據驗證放在了model層,提供了數據過濾的方法,包括了數據修正和數據驗證。過濾方法在 \lib\filter\filter.class.php
文件中定義。
數據修正以禪道testcase模塊創建用例方法為例,查看\module\testcase\model.php
中的create方法:
$case = fixer::input('post')
->add('status', $status)
->add('version', 1)
->add('fromBug', $bugID)
->setDefault('openedBy', $this->app->user->account)
->setDefault('openedDate', $now)
->setIF($this->config->systemMode == 'new' and $this->app->tab == 'project', 'project', $this->session->project)
->setIF($this->app->tab == 'execution', 'execution', $this->session->execution)
->setIF($this->post->story != false, 'storyVersion', $this->loadModel('story')->getVersion((int)$this->post->story))
->remove('steps,expects,files,labels,stepType,forceNotReview')
->setDefault('story', 0)
->cleanInt('story,product,branch,module')
->join('stage', ',')
->get();
- 首先調用fixer類的input方法,參數post表示是從
$_POST
這個變量中獲取數據。 add()
方法是向數據中增加變量。setDefault()
方法表示當這個變量沒有傳值的時候,設成默認值。setIF()
方法第一個參數是判斷條件,后面兩個分別是key和value。當條件為true時,設置$key = $value
。remove()
方法用於刪除不需要的字段。cleanInt()
將變量轉換為int類型。join('stage', ',')
將stage使用,
連接起來。- get方法返回一個經過修正的數據集合。
數據驗證使用check相關方法:
$this->dao->insert(TABLE_CASE)->data($case)
->autoCheck()
->batchCheck($this->config->testcase->create->requiredFields, 'notempty')
->exec();
data方法將修正過的數據傳遞給dao對象,然后通過autoCheck()對其進行自動檢查。batchCheck()方法會對一批字段進行非空的驗證。
使用dao::isError()
判斷是否有錯誤,dao::getError()
方法獲取報錯信息。
分頁
以測試用例瀏覽頁面為例,在testcase模塊的control文件中的browse方法完成分頁的功能,相關代碼如下:
public function browse($recTotal, $recPerPage, $pageID)
{
/* Load pager. */
$this->app->loadClass('pager', $static = true);
$pager = new pager($recTotal, $recPerPage, $pageID);
$sort = common::appendOrder($orderBy);
/* Get test cases. */
$cases = $this->testcase->getTestCases($productID, $branch, $browseType, $browseType == 'bysearch' ? $queryID : $suiteID, $moduleID, $sort, $pager);
if(empty($cases) and $pageID > 1)
{
$pager = pager::init(0, $recPerPage, 1);
$cases = $this->testcase->getTestCases($productID, $branch, $browseType, $browseType == 'bysearch' ? $queryID : $suiteID, $moduleID, $sort, $pager);
}
}
分頁相關的參數主要包括recTotal, recPerPage和pageID這三個參數。
在model中定義的getTestCases
方法,接收pager
對象,並在dao查詢的時候,調用pager($pager)
方法來生成分頁語句,返回用例數據:
public function getTestCases($pager)
{
return $this->dao->select(*)->from(TABLE_PROJECTCASE)->page($pager)->fetchAll();
}
然后將pager對象和用例數據賦值給view模板:
public function browse($recTotal, $recPerPage, $pageID)
{
/* Load pager. */
/* Get test cases. */
/* 賦值到模板。*/
$this->view->pager = $pager;
$this->view->cases = $cases;
}
在view模板中調用show()方法顯示分頁鏈接:
<?php $pager->show('right', 'pagerjs');?>
其它
zentaoPHP還提供了一些方法,比如生成鏈接方法createLink()
,重定向locate()
,加載指定模塊loadModel()
等。
還提供了html,js和css類,其中html類可用於生成html標簽:
html::a($href, $title, $target, $misc)
,生成超鏈接。html::input($name, $value, $attr)
生成文本框。html::select($name, $options, $selected, $attr)
,生成select標簽。- ......
JS類提供了一些js方法,比如:
js::alert($message)
:生成一個警告框。js::locate($url, $target)
:頁面跳轉。js::reload($window)
:窗口重載。
上面僅對zentaoPHP框架進行了簡單介紹,更詳細內容可參考官方文檔,
下面介紹禪道的基本目錄結構。
禪道目錄結構
在禪道二次開發(一):開發環境配置中介紹了在Linux中安裝禪道的方法,這里介紹一下它的主要目錄結構。
頂級目錄
進入/opt/zbox/app/zentao
目錄,禪道目錄結構如下:
.
├── api
├── bin
├── config
├── db
├── doc
├── framework
├── lib
├── module
├── sdk
├── tmp
└── www
api
:接口目錄。bin
:存放禪道的一些命令行腳本。config
:存放禪道運行的主配置文件和數據庫配置文件。db
:歷次升級的數據庫腳本和完整的建庫腳本。doc
:文檔。framework
:框架核心目錄,禪道php框架的核心類文件,里面包含了router, control, model和helper的定義文件。lib
:常用的類。比如html,js和css類、數據庫DAO類、數據驗證fixer類等。module
:模塊目錄,存放具體的功能模塊。sdk
:PHP sdk類。tmp
:存放禪道程序運行時的臨時文件。www
:存放各種樣式表文件,js文件,圖片文件,以及禪道的入口程序index.php
。
config目錄
config
目錄存放禪道配置文件。
.
├── config.php
├── ext
├── filter.php
├── index.html
├── my.php
├── routes.php
├── timezones.php
└── zentaopms.php
config.php
:ZenTaoPHP的config文件ext
:擴展目錄filter.php
:數據過濾規則文件my.php
:可以覆蓋config.php中的配置routes.php
:API路由timezones.php
:時區zentaopms.php
:配置文件,存放了數據庫的定義。
www目錄
.
├── api.php
├── checktable.php
├── data
├── favicon.ico
├── index.php
├── init.php
├── js
├── ok.txt
├── robots.txt
├── theme
├── tip4japanese.html
└── x.php
data
:上傳附件所在的目錄。js
:存放js腳本文件,禪道用到的各種jquery插件和相應的功能函數。theme
:主題文件,包含了css文件和圖片文件。.htaccess
:apache下面使用的url重寫規則文件。favicon.ico
:禪道圖標文件index.php
:整個禪道的入口程序,所有的請求都是通過index.php來進行轉發。
module目錄
module目錄下面的模塊分別對應了禪道里面的某一個功能模塊。整個禪道的功能,就是由這些模塊組合而成。部分功能模塊:
.
├── bug
├── caselib
├── common
├── execution
├── task
├── qa
├── testcase
├── testreport
├── testsuite
└── testtask
testcase模塊
以測試用例模塊testcase為例,目錄結構如下:
.
├── config.php
├── control.php
├── css
├── ext
├── js
├── lang
├── model.php
└── view
config.php
:存放當前模塊的配置項,也可以覆蓋全局性的配置。control.php
:模塊對應的控制器類文件。是整個testcase模塊所有頁面的入口。也就是說,testcase相關的頁面瀏覽都可以在這個文件里面找到相應的方法定義。model.php
:模塊對應的業務邏輯類文件,提供testcase相關數據庫操作方法。view
:存放的各個方法的視圖文件。比如testcase瀏覽頁面,對應的模板就是browse.html.php。css
:testcase模塊的樣式表文件。js
:testcase模塊的Javascript腳本文件。lang
:存放testcase模塊的語言文件。zh-cn對應中文簡體,zh-tw中文繁體,以此類推。如果需要修改禪道里面某些字段的名稱或者配置,修改相應的文件即可。ext
:二次開發文件存放目錄
common公用模塊
common公用模塊里面存儲的是禪道的公用功能,比如公用的語言文件、模板文件、model文件等。
common/model.php
提供了其他模塊都有可能用到的一些方法。比如權限檢查hasPriv()
,菜單打印printMainMenu()
等功能。common/view
目錄提供了公用的模板。比如header.html.php
是模板公用的頭文件;footer.html.php
是模板公用的頁腳文件;error.html.php
則是公用的出錯信息提示的模板文件。還包含了各種jquery插件的初始化代碼模板,比如colorbox.html.php
。common/lang
設置了公用的語言項。lang/zh-ch.php
存儲公用的語言文件。
參考資料:
- zentaoPHP框架:https://devel.easycorp.cn/book/zentaophphelp/about-10.html
- https://www.zentao.net/book/zentaopmshelp/40.html
給時光以生命,而不是給生命以時光。——帕斯卡