核心文件
- 调度类 router.class.php,
- control类 control.class.php,
- model类 model.class.php
-
基本模型
一、router
router在zentaoPHP框架中通常表现为 index.php。通过apache的配置文件,将某一个域名下面所有的请求解析到这个index.php文件。然后由这个index.php来负责调度。
二、app
router会根据当前的请求来实例化一个具体的应用。比如demo应用的index.php代码如下:
include ‘./framework/router.class.php’;
include ‘./framework/control.class.php’;
include ‘./framework/model.class.php’;
include ‘./framework/helper.class.php’;
$app = router::createApp(‘demo’);三、config, lang, dbh
当应用实例化之后,它会加载该应用的配置文件,生成 $config对象。
然后会连接到数据库,生成 $dbh对象。
然后会加载common模块的语言文件,生成 $lang对象。四、URI,module,control, model and view
当应用加载完配置文件和语言文件之后,它会解析当前的请求,也就是 URI,得出要调用的模块及其方法、参数。
module就是应用的一个模块。模块由 control, model, view和 lang文件组成。
- control是 module的控制文件,由它来负责组织各种业务逻辑( model),然后展示相应的视图( view)文件。
比如demo应用里面的blog模块的control类,分别定义了index, view, del, edit, add等几个方法。
相应的model类则定义了getList, getInfo, delArticle, add等几个方法。
二开思路
- 修改lang
- 修改数据库
-
首先找到需要修改的文件
从url入手,一般来说形如
http://localhost:8888/zentaopms/www/bug-browse-1.html
这样的url是在全局config.php文件下配置了path-info之后访问路径会变成这样

之后进行拆解即可对应到具体的代码 bug-browse-1 ,bug 代表访问的模块,browse代表访问的方法
- 上例中,即访问的是 bug模块下的browse方法。

- view 为视图文件,命名规则为 方法名.html.php
-
control方法里面的调用
知道入口的函数在什么地方之后就可深入到具体的方法中去查看方法之间的调用与信息
修改数据库-修改model中操作db的方法-修改前端页面中涉及数据的操作。
二开实例
需求说明
- 禅道的bug状态太少,不足以适应公司的业务需求,现在需要对bug状态进行二次开发来满足业务需求
- 由原先的 激活,已解决,已关闭 三个状态扩展至 激活,再次激活,
- 步骤
- 首先对lang进行修改,这步主要影响的是页面上的显示
```php
<?php
$lang->bug->statusList[‘’] = ‘’;
$lang->bug->statusList[‘active’] = ‘激活’; # 原有
$lang->bug->statusList[‘reactive’] = ‘再次激活’; reactivedBy date $lang->bug->statusList[‘resolved’] = ‘已解决’; # 原有 关联表内 resolvedBy 字段 $lang->bug->statusList[‘in_process’] = ‘待验证’; in_processedBy date $lang->bug->statusList[‘rejected’] = ‘已拒绝’; rejectedBy date $lang->bug->statusList[‘postpone’] = ‘已延期’; postponedBy date $lang->bug->statusList[‘closed’] = ‘已关闭’; # 原有 关联表内 closeedBy 字段
- 首先对lang进行修改,这步主要影响的是页面上的显示
```php
<?php
$lang->bug->statusList[‘’] = ‘’;
$lang->bug->statusList[‘active’] = ‘激活’; # 原有
参考 zt_bug 这张表中的字段,然后进行拓展字段的关联关系 ,修改表结构
bug status 状态
by系列字段
date系列字段
修改方法,参考禅道标准sql来进行
CREATE TABLE IF NOT EXISTS zt_bug (
id mediumint(8) NOT NULL AUTO_INCREMENT,
product mediumint(8) unsigned NOT NULL DEFAULT ‘0’,
branch mediumint(8) unsigned NOT NULL DEFAULT ‘0’,
module mediumint(8) unsigned NOT NULL DEFAULT ‘0’,
project mediumint(8) unsigned NOT NULL DEFAULT ‘0’,
plan mediumint(8) unsigned NOT NULL DEFAULT ‘0’,
story mediumint(8) unsigned NOT NULL DEFAULT ‘0’,
storyVersion smallint(6) NOT NULL DEFAULT ‘1’,
task mediumint(8) unsigned NOT NULL DEFAULT ‘0’,
toTask mediumint(8) unsigned NOT NULL DEFAULT ‘0’,
toStory mediumint(8) NOT NULL DEFAULT ‘0’,
title varchar(255) NOT NULL,
keywords varchar(255) NOT NULL,
severity tinyint(4) NOT NULL DEFAULT ‘0’,
pri tinyint(3) unsigned NOT NULL,
type varchar(30) NOT NULL DEFAULT ‘’,
os varchar(30) NOT NULL DEFAULT ‘’,
browser varchar(30) NOT NULL DEFAULT ‘’,
hardware varchar(30) NOT NULL,
found varchar(30) NOT NULL DEFAULT ‘’,
steps text NOT NULL,
bug status ,可以看到是 枚举类型
status enum(‘active’,’resolved’,’closed’) NOT NULL DEFAULT ‘active’,
subStatus varchar(30) NOT NULL DEFAULT ‘’,
color char(7) NOT NULL,
confirmed tinyint(1) NOT NULL DEFAULT ‘0’,
activatedCount smallint(6) NOT NULL,
activatedDate datetime NOT NULL,
mailto text,
openedBy varchar(30) NOT NULL DEFAULT ‘’,
openedDate datetime NOT NULL,
openedBuild varchar(255) NOT NULL,
assignedTo varchar(30) NOT NULL DEFAULT ‘’,
assignedDate datetime NOT NULL,
deadline date NOT NULL,
resolvedBy varchar(30) NOT NULL DEFAULT ‘’,
resolution varchar(30) NOT NULL DEFAULT ‘’,
resolvedBuild varchar(30) NOT NULL DEFAULT ‘’,
resolvedDate datetime NOT NULL,
closedBy varchar(30) NOT NULL DEFAULT ‘’,
closedDate datetime NOT NULL,
duplicateBug mediumint(8) unsigned NOT NULL,
linkBug varchar(255) NOT NULL,
case mediumint(8) unsigned NOT NULL,
caseVersion smallint(6) NOT NULL DEFAULT ‘1’,
result mediumint(8) unsigned NOT NULL,
repo mediumint(8) unsigned NOT NULL,
entry varchar(255) NOT NULL,
lines varchar(10) NOT NULL,
v1 varchar(40) NOT NULL,
v2 varchar(40) NOT NULL,
repoType varchar(30) NOT NULL DEFAULT ‘’,
testtask mediumint(8) unsigned NOT NULL,
lastEditedBy varchar(30) NOT NULL DEFAULT ‘’,
lastEditedDate datetime NOT NULL,
deleted enum(‘0’,’1’) NOT NULL DEFAULT ‘0’,
PRIMARY KEY (id),
KEY product (product),
KEY project (project),
KEY status (status),
KEY plan (plan),
KEY story (story),
KEY case (case),
KEY assignedTo (assignedTo)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
$lang->bug->statusList[‘’] = ‘’;
$lang->bug->statusList[‘active’] = ‘激活’; # 原有
$lang->bug->statusList[‘reactive’] = ‘再次激活’; reactivedBy date
$lang->bug->statusList[‘resolved’] = ‘已解决’; # 原有 关联表内 resolvedBy 字段
$lang->bug->statusList[‘in_process’] = ‘待验证’; in_processedBy date
$lang->bug->statusList[‘rejected’] = ‘已拒绝’; rejectedBy date
$lang->bug->statusList[‘postpone’] = ‘已延期’; postponedBy date
$lang->bug->statusList[‘closed’] = ‘已关闭’; # 原有 关联表内 closeedBy 字段
ALTER table zt_bug modify column status ENUM (“active”,”resolved”,”closed”,”postpone”,”in_process”,”reactive”,”rejected”) default ‘active’;
ALTER table zt_bug add reactivedBy varchar(30) NOT NULL DEFAULT ‘’;
ALTER table zt_bug add in_processedBy varchar(30) NOT NULL DEFAULT ‘’;
ALTER table zt_bug add in_processedDate datetime NOT NULL;
ALTER table zt_bug add rejectedBy varchar(30) NOT NULL DEFAULT ‘’;
ALTER table zt_bug add rejectedDate datetime NOT NULL;
ALTER table zt_bug add postponedBy varchar(30) NOT NULL DEFAULT ‘’;
ALTER table zt_bug add postponedDate datetime NOT NULL;
<br />效果如上图,但此时并没有完成,之后还要完成,对数据库相关表进行修改--module 涉及的相关方法修改 -- 前端页面验证的修改 -- 之后进行bug状态扭转测试,bug编辑信息的反馈是否正常的测试。<a name="7VdQU"></a>## 涉及到的拓展层面以及二开规范- 考虑到以后系统的升级,为了不对以后升级产生障碍,所以按照禅道官方给出的扩展规范来进行二次开发扩展功能<a name="laJa2"></a>### 新增独立模块的情况- 新增对立模块的话直接新建,然后按照官方提出的实现路径去编写即可。但是对代码能力要求比较高- 新增模块是简单的。只需要按照zentaoPHP框架的结构,在module目录下面创建一个目录,比如叫做pay,然后按照zentaoPHP框架的约定,分别实现相应的control, model, view, css, js, lang等概念即可。在此就不再详述。大家可以参考我们框架的基本手册--引用至官网- [https://devel.easycorp.cn/book/extension/intro-45.html](https://devel.easycorp.cn/book/extension/intro-45.html)<a name="gCZ3r"></a>### 对 model 的扩展规则- model 层概述- model 为模型方法,主要用来处理各种数据的查询,更新,model的扩展分三种模式- 直接新增或者覆盖方法- 通过钩子来进行扩展- 通过类的方式来进行扩展<a name="KFGKh"></a>#### 直接新增或者覆盖方法- 在 ext/model/ 目录下面建立相应的以方法为名的文件- 例 比如打算对 bug 的model新增/覆盖 update 方法,你把么需要在 bug/ext/model/ 下建立 update.php```phppublic function update(){// here to codeing you want}
注意点
覆盖现有的方法
- 无论是覆盖现有方法,还是新增新的方法,扩展文件都是以方法名为名,保存在 /ext/control/目录下面。文件名都为小写,与model层的扩展规则有一些类似
- 下面为官方示例
- 比如以user模块为例,我们想重新定义它的注册逻辑,只需要在module/user/ext/control下面创建register.php,然后实现代码即可。如果我们想为user模块增加一个开放登录功能,
- 比如叫做oauth,只需要在module/user/ext/control下面创建oauth.php,然后实现代码即可
-
独立扩展代码
官方示例
最control层进行扩展的时候可以完全独立,也可以崇勇主干代码在control里面定义的方法, 继承之后重写,下例为继承后重写
class user extends control{public function register(){$this->view->header->title = 'getsid';$this->view->sid = session_id();$this->view->test = $this->misc->test();$this->display();}}
继承扩展
上面的例子是独立的扩展,但很多时候还想重用禅道原来的代码,则可以通过继承扩展的方式来实现。
include '../../control.php';class myUser extends user{public function register(){....$this->process() // process方法是在../../control.php里面定义}}
首先需要手工包含../../control.php,然后类名定义是 myUser(my + 模块名),从user类派生而来,这样就可以在register方法里面调用../../control.php里面定义的process方法了。
框架限制
由于框架加载机制的限制,control一个方法只能有一个扩展
对 view 层的扩展规则
完全覆盖
- 视图文件的覆盖可以通过完全覆盖的方式来重新定义。比如我对bug模块的create页面进行扩展。原来的视图文件是存放在module/bug/view/create.html.php。如果需要对其进行扩展,只需要将这个create.html.php拷贝到module/bug/ext/view/create.html.php,然后对这个网页进行修改就可以了。
- 注意!
- 需要** 注意 的 是 拷贝 过去 时候, 包含 路径 要 做 相应 的 **改动。
钩子机制来进行拓展
语言配置是 存在与 模块下 页面显示用的文字常量,通常如下面的代码形式 ```php <?php $lang->bug->browserList[‘maxthon’] = ‘傲游’; $lang->bug->browserList[‘uc’] = ‘UC’; $lang->bug->browserList[‘other’] = ‘其他’;
$lang->bug->typeList[‘’] = ‘’; $lang->bug->typeList[‘codeerror’] = ‘代码错误’; $lang->bug->typeList[‘config’] = ‘配置相关’; $lang->bug->typeList[‘install’] = ‘安装部署’; $lang->bug->typeList[‘security’] = ‘安全相关’; $lang->bug->typeList[‘performance’] = ‘性能问题’; $lang->bug->typeList[‘standard’] = ‘标准规范’; $lang->bug->typeList[‘automation’] = ‘测试脚本’; $lang->bug->typeList[‘designdefect’] = ‘设计缺陷’; $lang->bug->typeList[‘others’] = ‘其他’;
// FIXME 对bug状态进行扩展 reactive 重新激活。 postended 延期处理 in_process 待验证 rejected 拒绝 $lang->bug->statusList[‘’] = ‘’; $lang->bug->statusList[‘active’] = ‘激活’; $lang->bug->statusList[‘resolved’] = ‘已解决’; $lang->bug->statusList[‘closed’] = ‘已关闭’; ```
- 语言的扩展文件存放在ext/lang/目录下面。按照不同的语言建立相应的目录,比如zh-cn下面,可以有多个文件,zentaoPHP框架会自动加载该目录下面所有以.php结尾的文件。
比如扩展bug模块的语言文件,可以建立module/bug/ext/lang/zh-cn/1.php。
对 config 进行扩展规则
- 每个模块的根路径下存在config文件,通常存放该模块需要的各种配置信息

- 拓展规则: 每个模块的扩展文件存放在 ext/config/ 目录下面 ,可以有多个文件,zentaoPHP框架会自动加载该目录下面以config开头的.php文件。这样不同的扩展可以有自己的配置项,彼此之间不会冲突。
