禅道WINDOWS一键安装包版(Xampp版)的软件在创建bug时,选择指派人员的时候,会把系统中的所有用户全部列出来,随着公司禅道使用人员日益增多,每次新增、修改、指派BUG,选择指派人员时只能按首字母排序,比较麻烦。因此,采取局部修改代码的方式,替换原有的部分安装文件,来解决此问题,实践证明,该方法可行性高,已在公司上线实施,得到同事们的高度认可。
下面将解决方法和思路作个总结:
1.解决方法
选择指派人员时,只选择某个项目中的团队成员,选择了项目模块,显示该模块对应的的负责人。将选择人员的范围缩小。
2.修改代码
2.1 修改dao代码
路径: zentao\lib\dao\dao.class.php (数据库访问)
这里增加代码:
public function fetchPairsBySql($sql)
{
$stmt = $this->dbh->query($sql);
while($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
if(!$ready)
{
if(empty($keyField)) $keyField = key($row);
if(empty($valueField))
{
end($row);
$valueField = key($row);
}
$ready = true;
}
$pairs[$row[$keyField]] = $row[$valueField];
}
return $pairs;
}
这个代码就是根据传入的SQL语句,查询需要的数据,这个比他自己提供的方法来的简单,直接传入sql就好了。
2.2 增加根据产品ID和项目ID查询团队成员的方法。
代码路径 zentao\module\user\model.php
// 根据产品ID获取团队成员
public function getByProductId($productId = '')
{
$sql="SELECT DISTINCT c.account,c.realname from zt_projectproduct a,zt_team b,zt_user c where a.project=b.project and b.account=c.account and a.product=$productId ";
$users = $this->dao->fetchPairsBySql($sql);
foreach($users as $account => $realName)
{
$firstLetter = ucfirst(substr($account, 0, 1)) . ':';
$users[$account] = $firstLetter . ($realName ? $realName : $account);
}
return $users;
}
// 根据项目获取项目成员。
public function getByProjectId($projectId = '')
{
$sql="SELECT DISTINCT c.account,c.realname from zt_team b,zt_user c where b.account=c.account and b.project=$projectId ";
$users = $this->dao->fetchPairsBySql($sql);
foreach($users as $account => $realName)
{
$firstLetter = ucfirst(substr($account, 0, 1)) . ':';
$users[$account] = $firstLetter . ($realName ? $realName : $account);
}
return $users;
}
3.3 界面修改
3.3.1 bug 创建页面
代码路径
zentao\module\bug\control.php 控制器,通过控制器找视图
方法:
//判断产品ID是否为空,为空则取全部人员
// 不为空则获取 产品 的团队成员。
public function create($productID, $extras = '')
{
//$this->view->users = $this->user->getPairs('nodeleted');
if (empty($productID)) {
$this->view->users = $this->user->getPairs('nodeleted');
}
else{
$this->view->users = $this->user->getByProductId($productID);
};
// 根据项目ID获取人员
public function getByProjectId($projectId = ''){
$users=$this->user->getByProjectId($projectId);
echo json_encode($users);
}
代码路径
zentao\module\bug\view\create.html.php
增加代码
这里是为了在项目改变时,重选选择项目团队成员。
这个代码的源码为:
代码路径 zentao\www\js\util.js
//这个使用js给人员选择框填充数据。
function setOpinion(obj,url){
obj.empty();
$.post(url,function(data){
var json=eval("(" + data + ")");
for(var key in json){
obj.append(""+json[key]+"");
}
});
}
zentao\module\bug\js\create.js
修改方法:
function loadProjectRelated(projectID)
{
if(projectID)
{
loadProjectTasks(projectID);
loadProjectStories(projectID);
loadProjectBuilds(projectID);
//增加的代码
loadMemberByProject(projectID);
}
//根据项目加载人员
function loadMemberByProject(projectId_){
var obj=$("#assignedTo");
var url="/zentao/bug-getByProjectId-"+projectId_+".html";
setOpinion(obj,url);
}
3.3.2 编辑bug页面
public function edit($bugID, $comment = false)
在这里修改
$users=$this->user->getByProjectId($projectID);
$this->view->users = $this->user->appendDeleted($users, "$bug->assignedTo,$bug->resolvedBy,$bug->closedBy");
视图页面路径
zentao\module\bug\view\edit.html.php
增加代码:
js代码
代码路径 zentao\module\bug\js\edit.js
function loadMemberByProject(projectId_){
var obj=$("#assignedTo");
var url="/zentao/bug-getByProjectId-"+projectId_+".html";
setOpinion(obj,url);
}
3.3.3 指派bug 人员
代码路径 zentao\module\bug\control.php
修改代码:
public function assignTo($bugID)
$projectID = $bug->project;
//修改获取项目团队。
$users=$this->user->getByProjectId($projectID);
3.3.4 后台数据权限修改
前面新增的按项目组成员取值的方法,在页面调用时,会受到后台权限控制的影响,后台权限页面对应的代码修改比较麻烦,暂做的硬处理,用的直接在数据库添加group的项目组成员的取值方法。
操作如下:
在zt_grouppriv表,根据group 授权,找到对应的group 数据,然后在数据库添加group权限即可。
如为group 1添加按项目组成员取值的方法:
Insert into zt_grouppriv(company, group, module, method) values (1,1,'bug','getByProjectId');