![](/theme/default/default/images/main/icon-menu.png)
![](/theme/default/default/images/main/icon-close-2x.png)
![](https://cdn.easycorp.cn/web/data/upload/zentao/202402/f_0c7d40c83be2425f404dc4bd5ee778cb.png)
- 1 禅道二次开发简介
- 2. 禅道扩展开发
- 2.1 禅道扩展机制简介
- 2.2. 新增独立模块
- 2.2.1 基本的代码组织
- 2.2.2 新增控制层(control/zen)
- 2.2.3 新增模型层(model/tao)
- 2.2.4 新增视图层(view/ui)
- 2.2.5 新增语言项lang和配置项config
- 2.2.6 新增前端样式CSS和JavaScript
- 2.3. 修改已有模块
- 2.3.1 对控制层(control/zen)扩展
- 2.3.2 对模型层(model/tao)扩展
- 2.3.3 对视图层(ui)扩展
- 2.3.4 对样式表CSS和JavaScript进行扩展
- 2.3.5 对多语言和配置进行扩展
- 2.4. 常用类库
- 3. 禅道API
- 3.1 API机制简介
- 3.2 需要登录验证的API调用
- 4 命令行调用
禅道扩展机制简介 分享链接
禅道软件的定制开发离不开对已有代码进行修改,或者增加新的功能逻辑。市面上大部分开源软件,只要做过二次开发就只能停留在某一个版本,如果要适配新的版本就只能在新版本代码基础上进行重新开发。一些知名软件比如wordpress, dupral等为了应对二开版本兼容性问题,开发了hook扩展机制。但这种扩展机制基于动作或者事件,只能对原有的系统做局部的修改,限制性比较强,没有办法对系统做比较深入的修改。带着这个问题,我们在设计禅道的时候特别注意框架的扩展性,实现了深入彻底的扩展机制,为开发者带来更高的自由度。
禅道的功能都是由一个个的模块组成的,每个模块会对应到module下面的一个目录,比如project、user等模块。每个模块下按照MVC进行组织划分,有自己的control(控制层)、 model(模型层)和view/ui(视图层)。同时我们还补充了其他几个辅助的概念:config(配置)、lang(语言)、 css(样式)、js(js脚本)、zen(控制层子层)、tao(模型层子层)。
通过禅道完善的扩展机制,可以增加新的功能模块,或者对已有模块进行任一层的二次修改。
打开禅道的代码目录会发现有一个extension目录,该目录用于存放禅道官方插件或用户自定义的代码。extension的子目录比如biz,max,ipd对应禅道的企业版、旗舰版和ipd版本代码,还有一个custom目录是专门用于二次开发的,后续我们所有的定制代码都会维护在extension/custom这里。
定制开发通常分为新增模块和修改已有模块,我们来看下代码分别是怎么组织的:
1. 比如新增一个oa模块,所有代码都需要在extension/custom/oa目录下编写:
extension/custom/oa/control.php extension/custom/oa/model.php extension/custom/oa/view/{metho1.html.php, method2.html.php, ...} extension/custom/oa/config/config.php extension/custom/oa/css/{method1.css, method2.css, common.css, ...} extension/custom/oa/js/{method1.js, method2.js, common.js, ...}
2. 修改禅道已有的user模块,扩展代码的目录结构如下:
extension/custom/user/ext/control/{method1.php, method2.php, ...} extension/custom/user/ext/model/{extend1.php, extend2.php, ...} extension/custom/user/ext/view/{method1.html.php, method2.html.php, ...} extension/custom/user/ext/config/{config1.php, config2.php, ...} extension/custom/user/ext/lang/zh-cn/{lang1.php, lang2.php, ...} extension/custom/user/ext/lang/en/{lang1.php, lang2.php, ...} extension/custom/user/ext/css/method1/{1.css, 2.css, ...} extension/custom/user/ext/js/method1/{1.js, 2.js, ...}
可以看到,这两种方式代码结构的主要区别有两点:
1. 修改旧模块需要在模块的ext子目录下进行修改;
2. 修改旧模块的方法是在单独的文件或目录里进行,新模块的所有方法都在一个文件或目录里。
开发者只要遵循系统的扩展机制,把相应的扩展代码部署到对应的目录,即可实现对现有功能的重新定义或者新增功能。因为扩展代码和主干代码在物理上是分离的,所以就不用担心主干代码升级时会覆盖扩展代码。就可以做到放心的升级。