禪道二次開發(二):禪道框架介紹


進行禪道二次開發前有必要學習一下禪道使用的框架,本文將簡單介紹zentaoPHP框架以及禪道的目錄結構。

zentaoPHP框架

禪道項目使用zentaoPHP框架,基於b/s架構開發。

基本原理

zentaoPHP框架支持MVC(Model-View-Controller)軟件架構模式,把軟件系統分為三個基本部分:

  • 模型(Model):實現程序的功能、數據管理和數據庫設計。對數據庫的增刪改查可以放在這一層。
  • 控制器(Controller):負責轉發用戶請求,對請求進行處理,組織各種業務邏輯,准備數據。
  • 視圖(View):負責渲染數據,圖形界面設計,通過HTML方式呈現給用戶。

zentaoPHP框架的基本原理:

  1. 通過apache服務將請求轉交給index.php(\zentao\app\htdocs\index.php),由它來進行資源調度。
  2. index.php加載框架文件,初始化應用,解析URI請求,得到請求對應對模塊名、方法和參數。比如URL:<zentao-url>/zentao/testcase-browse-1.html 模塊名為testcase,方法名為browse,1為參數。
  3. 然后加載相應模塊的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存儲公用的語言文件。

參考資料:

  1. zentaoPHP框架:https://devel.easycorp.cn/book/zentaophphelp/about-10.html
  2. https://www.zentao.net/book/zentaopmshelp/40.html
--THE END--

給時光以生命,而不是給生命以時光。——帕斯卡


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM