禅道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
增加代码
这里是为了在项目改变时,重选选择项目团队成员。
<script src='/zentao/js/util.js' type='text/javascript'></script>
这个代码的源码为:
代码路径 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("<option value='"+key+"'>"+json[key]+"</option>"); } }); } 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
增加代码:
<script src='/zentao/js/util.js' type='text/javascript'></script>
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');