对禅道框架有初步的了解后就可以开始进行二次开发了,不需要完全搞懂zentaoPHP框架,可以在开发过程中学习。本文记录一下我进行禅道二次开发的其中一个小功能的实现过程。

注:本文基于禅道开源版16.4进行二次开发,禅道16.5+版本升级了扩展机制,具体请参考官方文档:https://devel.easycorp.cn/book/extension-new/intro-52.html 。

目录

  • 新建用例页面扩展
    • 1. 定位扩展模块
    • 2. view 扩展
      • 覆盖扩展
    • 3. lang扩展
    • 4. control方法扩展
    • 5. model方法扩展
      • 覆盖扩展
      • 钩子扩展
  • 用例浏览页面扩展
  • 用例编辑页面扩展
    • view方法钩子扩展
    • js/css/lang/config 扩展

对禅道进行扩展主要在module目录下进行,在需要扩展的模块下对model、control、view方法以及css、js、lang等进行扩展。下面介绍如何在用例模块中新增一个字段,了解禅道是如何进行扩展的。

需求是对测试用例新增字段【测试方式】,选项为手工或者自动化,新建用例页面的效果如下:

下面介绍具体扩展步骤。

新建用例页面扩展

对禅道的二次开发一般在对应模块下的 ext 目录中进行扩展,不需要对禅道源码进行修改。先来介绍新建用例页面新增【测试方式】字段的步骤。

1. 定位扩展模块

第一步需要定位到要扩展页面的模块名和方法名。

点击进入新建用例页面,可以看到URL地址为:http://192.168.30.9:8080/zentao/testcase-create-1-all-0.html

通过URL地址可以得到如下信息:

  • 模块名为testcase
  • 方法名为create,可以在\module\testcase\control.php 中找到create方法。
  • \module\testcase\model.php 文件中存放control可以调用的Model方法。
  • 对应的view模板文件为 \module\testcase\view\create.html.php
  • 后面的1-all-0是create方法的参数,这里的1表示产品ID,具体含义需要查看代码。

通过这个URL我们知道要扩展testcase模块下的create方法。

2. view 扩展

对 view 方法的扩展有两种方式:覆盖扩展和钩子扩展。

覆盖扩展

覆盖扩展就是对原来的方法进行重写,直接在 \module\testcase\ext\view 目录下创建与要扩展方法同名的文件 create.html.php,复制 \module\testcase\view 目录下 create.html.php 代码,新增【测试方式】相关前端代码。下面直接给出代码(部分关键代码):

<td><div class='table-row'><div class='table-col' id='stageBox'><div class='input-group'><span class='input-group-addon w-80px'><?php echo $lang->testcase->stage;?></span><?php echo html::select('stage[]', $lang->testcase->stageList, $stage, "class='form-control chosen' multiple='multiple'");?></div></div><div class='table-col' id='exectypeBox'><div class='input-group'><span class='input-group-addon fix-border'><?php echo $lang->testcase->execType;?></span><?php echo html::select('execType', $lang->testcase->execTypeList, $execType, "class='form-control chosen' ");?></div></div></div>
</td>

由于我要将它放在【适用阶段】字段后面,因此对【适用阶段】相关代码也进行了修改。

我们知道,view模板是由于向用户展现数据的,相关数据是通过control方法获取的。通过参考其它字段,【测试方式】字段需要 $lang->testcase->execType$lang->testcase->execTypeList$execType 这三个数据。前两个变量需要扩展lang文件,最后一个变量需要扩展control层中的create方法。

view模板的钩子扩展方法稍后介绍。

3. lang扩展

ext/lang 目录下创建zh-cn文件夹(其它语言类似),然后在zh-cn目录下创建zh-cn.php文件(任意文件名):

<?php
$lang->testcase->execType             = '测试方式';/* Define the execution types. */
$lang->testcase->execTypeList['']            = '';
$lang->testcase->execTypeList['manual']      = '手工';
$lang->testcase->execTypeList['auto']        = '自动化';

4. control方法扩展

接下来扩展 testcase 的control方法里面的 create 方法,在\module\testcase\ext 目录下创建一个control目录,然后在control 目录下创建create.php文件(注意:创建的文件名要小写。),参数和control.php中的create方法一样:

<?php
include '../../control.php';class myTestcase extends testcase
{/*** Create a test case.* @param        $productID* @param string $branch* @param int    $moduleID* @param string $from* @param int    $param* @param int    $storyID* @param string $extras* @access public* @return void*/public function create($productID, $branch = '', $moduleID = 0, $from = '', $param = 0, $storyID = 0, $extras = ''){/* Init vars. */$execType    = 'manual'; // 测试方式,manual:手工, auto: 自动的$this->view->execType        = $execType;        parent:: create($productID, $branch = '', $moduleID = 0, $from = '', $param = 0, $storyID = 0, $extras = '');}
}

新增的两行代码会自动扩展到control.php中的create方法中。也可以复制源码,在源码中修改,如果全部复制过来就不要用parent方法了。

由于新增了一个字段,需要对case表新增一个字段execType:

ALTER TABLE `zentao`.`zt_case`
ADD COLUMN `execType` CHAR(30) NOT NULL DEFAULT 'manual' AFTER `lastRunResult`;

目前不需要对model方法进行扩展,到这里已经完成了对新建用例页面的扩展。

这里介绍一下model方法扩展方式。

5. model方法扩展

\testcase\ext 目录下创建model目录。然后在\testcase\ext\model 目录下进行model方法扩展,主要有3种扩展方式:

  • 覆盖扩展:创建*.php文件
  • 钩子扩展:创建hook目录,在hook目录下创建 扩展方法名.扩展名.php 文件
  • class目录:加密使用的方式

覆盖扩展

model方法扩展直接写要扩展的方法名即可,不用像control方法扩展那样新声明类,在\testcase\ext\model 目录下创建test.php:

<?php/*** Create a case.** @param int $bugID* @access public* @return void*/
function create($bugID)
{parent::create($bugID)
}

钩子扩展

\testcase\ext\model\hook 目录下创建 扩展方法名.扩展名.php ,框架会把扩展方法的所有钩子代码合并到最终的代码中。

\testcase\ext\model\hook\目录下创建create.test.php文件

<?php
// 直接编写代码逻辑
die("6666");

查看效果:创建用例,点击保存

用例浏览页面扩展

在创建用例页面新增了【测试方式】字段之后,如果想在用例浏览页面查看每条用例的测试方式,需要对browse页面进行扩展。

具体步骤不介绍了,思路和新建用例页面扩展一样。效果如下图:

用例编辑页面扩展

用例编辑页面也要添加【测试方式】字段,这里介绍一下view方法的钩子扩展方式。

view方法钩子扩展

将【测试方式】字段放到【适用阶段】后面:

文件命名方式:方法名.扩展名.html.hook.php,钩子的内容会追加到主干对应view文件末尾。在\module\testcase\ext\view 目录下创建 create.test.html.hook.php 文件:

<?php
// 测试方式
$html   = '<tr>';
$html  .= '<th>';
$html  .= $lang->testcase->execType;
$html  .= '</th>';
$html  .= '<td>';
$html  .= html::select('execType', (array)$lang->testcase->execTypeList, $case->execType, "class='form-control chosen' ");
$html  .= '</td>';
$html  .= '</tr>';
?><script>var item1 = $('div.side-col table tbody tr')[4];    $('#dataform').find( item1 ).after(<?php echo json_encode($html); ?>);
</script>

效果:

js/css/lang/config 扩展

有时候需要对js、css、lang和config文件进行扩展,前面介绍了对lang的扩展。js 和 css 扩展方法和lang一样。

  • ext/js 目录下创建和方法名同名的目录create,进入create目录,创建test.js文件

  • ext/css 目录下创建和方法名同名的目录create,进入create目录,创建test.css文件

config扩展是在ext/config 目录下创建php文件即可。

关于禅道二次开发相关笔记就写到这里了,文章仅介绍了禅道扩展的一个简单示例,更多用法可以阅读源码,欢迎交流讨论。

参考资料:

  1. https://www.zentao.net/publicclass/80237.html
  2. https://www.zentao.net/book/zentaopmshelp/225.html

--THE END--

弱小和无知不是生存的障碍,傲慢才是。——刘慈欣《三体3:死神永生》

禅道二次开发(三):二次开发实例相关推荐

  1. Android 蓝牙开发(三) -- 低功耗蓝牙开发

    Android 蓝牙开发(一) – 传统蓝牙聊天室 Android 蓝牙开发(三) – 低功耗蓝牙开发 项目工程BluetoothDemo 前面已经学习了经典蓝牙开发,学习了蓝牙的配对连接和通信,又通 ...

  2. 一起学WP7 XNA游戏开发(三.二 Sprite Texture Font)

    Sprite Texture Font 对于XNA的字体,除了之前的SpriteFont外还有一种是SpriteTextureFont,其实就是生成的字体bitmap图片,也就是说可以用bitmap类 ...

  3. java二维数组三种初始化方法(实例)

    初始化方法: 1.使用大括号直接赋值,适合已经确定知道数组元素的情况 2.给定二维数组的大小 3.数组第二维的长度可变化,未改变 代码举例如下: public class NewArray {publ ...

  4. java二维数组的赋值_java二维数组三种初始化方法(实例)

    初始化方法: 1.使用大括号直接赋值,适合已经确定知道数组元素的情况 2.给定二维数组的大小 3.数组第二维的长度可变化,未改变 代码举例如下: public class NewArray { pub ...

  5. 二〇二三-三-二十七

    用户新增.修改.删除 删除操作实现 删除逻辑: 点击删除按钮需要对其进行监听 对于重要信息删除应该给用户提示 通过ajax调用后台 更具后台传回的信息进行逻辑处理 新增表单 监听提交按钮 将值传给后台 ...

  6. 二〇二三-三-二十九

    产品增加 "添加商品"按钮事件 <div class="layui-card-header"><button class="layu ...

  7. 二〇二三-三-二十三

    问题描述: 前一天因为原项目服务器问题,无法访问部分servlet,遂将原项目代码全部复制到了一个新的maven空项目中,成功解决部分servlet无法访问(404)以及实例化问题. 但是启动tomc ...

  8. 边缘计算开源框架EdgeXFoundry的部署应用开发(三)设备服务开发

    边缘计算开源框架EdgeXFoundry的部署应用开发(三)设备服务开发 使用SDK开发真实设备接入服务 着手编写一个温湿度设备接入 准备相关文件及目录 脚本可选,用于单文件编译测试 编写温湿度设备接 ...

  9. ESP32开发三_蓝牙开发

    蓝牙开发 交流QQ: 1048272975             QQ交流群: 636564526 蓝牙是一种不断创新发展的无线通信技术标准,采用了2.4G ISM频段,在音频传输.数据传输.位置服 ...

  10. linux安装meb工具,linux-docker下安装禅道全部

    友情提示:按照步骤走,99%的人会安装成功,1%的人可以咨询度娘 64位电脑安装禅道,满足发送邮件功能 第一步: docker ps 查看docker中的容器是否有禅道(docker ps -a    ...

最新文章

  1. [转]Linux 的多线程编程的高效开发经验
  2. 浅析新站SEO和老站优化推广有哪些区别?
  3. python怎么读文件夹下的文件夹-python2.7读取文件夹下所有文件名称及内容的方法...
  4. linux 内核源代码漫游,Linux内核源代码漫游——
  5. 内存泄漏和内存溢出有什么区别
  6. svn: Can't convert string from 'UTF-8' to native encoding
  7. Pandas多层级索引的数据分析案例,超干货的!
  8. Android开发之选项菜单(optinosMenu)
  9. Python中的Dask数组
  10. Rabin-Karp字符串查找算法学习:poj1200
  11. centos 安装git_在Centos8上安装Git的方法
  12. 分布式系统关注点(6)——「负载均衡」到底该如何实施?
  13. 如何借助OpenStack命令行工具管理虚拟机?
  14. 羊皮卷的故事-第十七章-羊皮卷之十
  15. cmd命令将web项目打成jar包_首发!JDK14之jpackage命令尝鲜
  16. 26 伪造ICMP数据包
  17. 软件测试师的工作流程是什么?
  18. 自部署IPA在线安装服务源码
  19. tomcat启动一直卡在Root WebApplicationContext: initialization completed
  20. 火线 零线 中线 地线

热门文章

  1. 使用dd命令测试裸盘性能评测
  2. Failed to start LSB: Kurento Media Server daemon. kurento-media-server 启动失败的解决办法
  3. 样本量重要,还是测序深度重要?
  4. 用Python算带有进度条的圆周率
  5. cv2.imread不能正常读取gif格式图片
  6. 谷歌浏览器设置跨域方法集合
  7. 2.数据分析-面板数据变系数模型
  8. 什么鬼,脂肪填充脸能维持几年?这是能说的吗
  9. 铁道部网站扩容投诉与建议
  10. 如何推广自己的新网站