UNIX艺术

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

公司使用的质量管理系统(评审活动、缺陷跟踪和文档库)中,需要与CodeStriker互动,开发如下类实现基本功能。

 

View Code
  1 <?php
  2 
  3 /*
  4  * 与codestriker的交互类,主要方法如下:
  5  * GetTopic(id):根据id查询CI的话题
  6  * 2013.1.27:
  7  * 目前hardcode了参数:codestriker链接、数据库服务器、端口、
  8  * 数据库用户名、密码,需要改为可配置参数。
  9  */
 10 
 11 /**
 12  * Description of CodeStriker
 13  *
 14  * @author Administrator
 15  */
 16 class CodeStriker {
 17     public static $url='http://xxxxxx/codestriker/codestriker.pl';
 18     private $mysqlInstance; // mysql 实例
 19     private $cfg=array(); // 配置信息
 20     private function __construct() {
 21         ;
 22     }
 23 
 24     /*
 25      * 查询一个topic的属性,返回数组,内容如下:
 26      * array(
 27      *      id: topic id
 28      *      author: 作者,email全写,假设与QMS一致
 29      *      title: 标题
 30      *      description:说明
 31      *      document: 
 32      *      state: 状态
 33      *      creation_ts: 创建时间
 34      *      modified_ts: 修改时间
 35      *      version: 版本
 36      *      start_tag:
 37      *      end_tag:
 38      *      module:
 39      *      repository:
 40      *      projectid:
 41      * )
 42      */
 43     static function GetTopic($id) {
 44         $param = array();
 45         $param['id'] = $id;
 46         $topiclist = self::Get('topic', $param);
 47         if($topiclist == null || count($topiclist) != 1)  {
 48             return null;
 49         }
 50         return $topiclist[0];
 51     }
 52     
 53     static function GetComment($id, $email=null) {
 54         $param = array();
 55         $param['id'] = $id;
 56         $param['author'] = $email;
 57 
 58         $commentlist = self::Get('commentnumber', $param);
 59         if($commentlist == null || count($commentlist) <= 0)  {
 60             return null;
 61         }
 62         return $commentlist;
 63     }
 64     
 65     /*
 66      * 根据命令查询codestrikerdb
 67      */
 68     public static function Get($cmd, $param=null) {
 69         $instance = new CodeStriker();
 70         
 71         if(! $instance->init()) {
 72             return false;
 73         }
 74 
 75         return $instance->handleRequest($cmd, $param);
 76     }
 77     
 78     private function handleRequest($cmd, $param) {
 79         $ret = null;
 80         switch($cmd) {
 81             case 'topic':
 82                 // 查询话题信息,参数$param为id
 83                 $sql = "select * from topic where id=".$param['id'];
 84                 $ret = $this->mysqlInstance->runQuery($sql);
 85                 break;
 86             case 'commentnumber':
 87                 $where = ' where st.id=data.commentstateid and m.id=st.id and '.
 88                     'st.topicid='.$param['id'];
 89                 if(isset($param['author']) && $param['author'] != null) {
 90                     $where .= ' and data.author="'.$param['author'].'"';
 91                 } 
 92                 $sql = 'select st.id as id, st.state as state, st.version as version,'.
 93                         'data.commentfield as comment, data.author as author, m.value as metric'.
 94                     ' from commentdata data,commentstate st, commentstatemetric m' . $where;
 95                 $ret = $this->mysqlInstance->runQuery($sql);
 96                 break;
 97             default:
 98                 break;
 99         }
100         return $ret;
101     }
102     
103     private function init() {
104         $this->mysqlInstance = MySQLInstance::instance();
105         $this->cfg = $this->SetCfg();
106         $ret = $this->mysqlInstance->init(
107                 $this->cfg['user'],
108                 $this->cfg['password'],
109                 $this->cfg['database'],
110                 $this->cfg['host']
111                 );
112         if($ret != 0) {
113             return $ret;
114         }
115         return true;
116     }
117 
118     public static function AjaxQuery($table, $uk, $query_field, $query_value, 
119             $initshow,
120             $selectedval = null, $selectmode = 1, $orderby = null, 
121             $init_condition = null, $output_fields = null, $displayfield = null, 
122             $number = 10, $page = 1) {
123 
124         $instance = new CodeStriker();
125         if(! $instance->init()) {
126             return null;
127         }
128 
129         if (empty($output_fields))
130             $output_fields = "*";
131 
132         $output = null;
133 
134         $condition = null;
135         if (isset($query_value) && !empty($query_value)) {
136             $field_array = explode(',', $query_field);
137             $condition = '(';
138             foreach ($field_array as $idx => $fieldname) {
139                 if ($idx > 0) {
140                     $condition .= ' or ';
141                 }
142                 $condition .= '(' . $fieldname . ' like "%' . $query_value . '%")';
143             }
144             $condition .= ')';
145         }
146         if (isset($init_condition) && !empty($init_condition)) {
147             if (strlen($condition) > 0) {
148                 $condition .= ' and ';
149             }
150             $condition .= ' (' . $init_condition . ') ';
151         }
152         if (!empty($selectedval)) {
153             $str = QmsHelper::convertStr2DoubleQuoted($selectedval);
154             if (!empty($condition)) {
155                 $condition .= " or ";
156             }
157             $condition .= "(" . $uk . ' in (' . $str . '))';
158         }
159 
160         if(empty($condition) && $initshow==0) {
161             // 如果关闭了默认不显示initshow,且没有查询条件,则不显示
162             $condition = "1=2"; 
163         }
164 
165         $sql = 'select count(*) as record_num from ' . $table;
166         if(!empty($condition)) {
167             $sql .= ' where ' . $condition;
168         }
169         $dataReader = $instance->mysqlInstance->runQuery($sql);
170         $total_number = 0;
171         foreach ($dataReader as $row) {
172             $total_number = $row['record_num'];
173         }
174 
175         if ($total_number <= 0) {
176             return "查询结果为空";
177         }
178         // 设置最小分页和最大分页
179         if ($number > 0) {
180             if ($number < 10)
181                 $number = 10;
182             else if ($number > 20)
183                 $number = 20;
184         }
185         else {
186             $number = 0;
187         }
188         $left = 0;
189         $pages = 0;
190         $limit_str = null;
191         if ($number > 0) {
192             if ($total_number / $number > self::MAX_RECORD_PER_PAGE) {
193                 return "查询结果超过10页,请重新查询";
194             }
195 
196             // 组装页码
197             $left = $total_number % $number;
198             $pages = round($total_number / $number);
199             $output .= '<div class="pagination">共' . $total_number . '条记录,分页<ul>';
200             for ($i = 1; $i <= $pages; $i++) {
201                 $output .= '<li><span class="page_number" value="' . $i . '">' . $i . '</li>';
202             }
203             $output .= '</ul></div>';
204 
205             if ($page <= 1)
206                 $page = 1;
207             else if ($page > self::MAX_PAGE_NUMBER)
208                 $page = self::MAX_PAGE_NUMBER;
209             $limit_str = ' limit ' . ( ($page - 1) * $number) . ',' . $number;
210         } // end of $number > 0
211         else {
212             $output .= '<span class="pagination">共' . $total_number . '条记录</span>';
213         }
214 
215         $sql = 'select * from ' . $table;
216         if(!empty($condition)) {
217             $sql .= ' where ' . $condition;
218         }
219         $orderby_sql = ' order by ' . $uk;
220         if (isset($orderby) && !empty($orderby)) {
221             $orderby_sql = ' order by ' . $orderby;
222         }
223         $sql .= $orderby_sql . $limit_str;
224 
225         $dataReader = $instance->mysqlInstance->runQuery($sql);
226         $fields = explode(',', $output_fields);
227         $output .= '<table class="query_result_table">';
228         foreach ($dataReader as $row) {
229             // 判断当前是否已经被选择
230             $flag = strpos($selectedval, $row[$uk]);
231             $checked = null;
232             if ($flag!==false) {
233                 $checked = "checked=true";
234             }
235             if ($selectmode == 2) {
236                 $select_field = '<input class="query_result_checkbox_button" ' . $checked .
237                         ' type="checkbox" name="checkboxgroup" value="' . $row[$uk] . '"';
238             } else if ($selectmode == 1) {
239                 $select_field = '<input class="query_result_radio_button" ' .
240                         'type="radio" name="radiogroup" value="' . $row[$uk] . '" ' .
241                         $checked;
242             }
243             $output .= '<tr>';
244             $output .= '<td>' .
245                     '<input id="display_' . $row[$uk] . '" type="hidden" value="' . $row[$displayfield] . '">' . // 显示字段
246                     $select_field .
247                     '</td>';
248             foreach ($fields as $key => $fieldname) {
249                 $fieldname = ltrim(rtrim($fieldname));
250                 $output .= '<td>' . $row[$fieldname] . '</td>';
251             }
252             $output .= '</tr>';
253         }
254         $output .= '</table>';
255 
256         $output .= '<input type="hidden" id="ajax_query_selected">';
257         return $output;
258     }
259     private function SetCfg() {
260         return array(
261             'user' => 'dbuser',
262             'password' => 'password',
263             'database' => 'codestrikerdb',
264             'host' => '1.2.3.4',
265             'port' => '3306',
266         );
267     }
268     
269     public static function GetTopicUrl($id) {
270         return self::$url . '?action=view&topic=' . $id . '&mode=1';
271     }
272 }
273 
274 ?>

 

posted on 2013-02-17 11:02  jinhuawang76  阅读(422)  评论(0编辑  收藏  举报