r67: - Upping template system to use ISSO
[bugdar.git] / search.php
1 <?php
2 /*=====================================================================*\
3 || ################################################################### ||
4 || # BugStrike [#]version[#]
5 || # --------------------------------------------------------------- # ||
6 || # Copyright ©2002-[#]year[#] by Iris Studios, Inc. All Rights Reserved. # ||
7 || # This file may not be reproduced in any way without permission. # ||
8 || # --------------------------------------------------------------- # ||
9 || # User License Agreement at http://www.iris-studios.com/license/ # ||
10 || ################################################################### ||
11 \*=====================================================================*/
12
13 $fetchtemplates = array(
14 'search',
15 'search_results',
16 'search_results_bit'
17 );
18
19 require_once('./global.php');
20
21 if (!can_perform('cansearch'))
22 {
23 echo 'no permission';
24 exit;
25 }
26
27 define('MODE', intval($_POST['mode']));
28 define('MODE_ANY', iff(MODE == 1, 1, 0));
29 define('MODE_ALL', iff(MODE == 2, 1, 0));
30 define('MODE_RAW', iff(MODE == 3, 1, 0));
31
32 define('SEARCH_WORD_MIN', 3);
33
34 // ###################################################################
35
36 if (empty($_REQUEST['do']))
37 {
38 $_REQUEST['do'] = 'search';
39 }
40
41 // ###################################################################
42
43 if ($_REQUEST['do'] == 'results')
44 {
45 sanitize(array(
46 'summary' => STR, // done
47 'reporter' => STR, // done
48 'pcv_select' => STR, // done
49 'severity' => INT, // done
50 'priority' => INT, // done
51 'status' => INT, // done
52 'resolution' => INT, // done
53 'assignedto' => INT, // done
54 'date' => INT, // done
55 'sortby' => STR,
56 'orderby' => STR)
57 );
58
59 // -------------------------------------------------------------------
60 // parse out our product/component/version
61 $vars['pcv'] = parse_pcv_select($vars['pcv_select']);
62
63 // -------------------------------------------------------------------
64 // handle keywords
65 if ($vars['summary'])
66 {
67 $keywords = preg_split('#\s+#', $vars['summary']);
68
69 // #*# need to have some str to bool conversions
70
71 foreach ($keywords AS $word)
72 {
73 if (strlen($word) < SEARCH_WORD_MIN)
74 {
75 continue;
76 }
77
78 if (MODE_ALL)
79 {
80 $querybuild['text'] .= " +$word";
81 }
82 else
83 {
84 $querybuild['text'] .= " $word";
85 }
86
87 if (!preg_match('#-(.+?)#', trim($word)))
88 {
89 $hilight .= " $word";
90 }
91 }
92
93 $hilight = preg_replace('#[^0-9a-zA-Z_ ]#', '', $hilight);
94 $hilight = trim($hilight);
95 $hilight = preg_replace('#\s#', '+', $hilight);
96
97 $temp = trim($querybuild['text']);
98
99 if (MODE_ALL OR MODE_RAW)
100 {
101 $bool_flag = ' IN BOOLEAN MODE';
102 }
103
104 $querybuild['text'] = "AND\n\t\t\t(\n\t\t\t\tMATCH (bug.summary) AGAINST ('$temp'$bool_flag)\n\t\t\t\tOR MATCH (comment.comment) AGAINST ('$temp'$bool_flag)\n\t\t\t)";
105 }
106
107 // -------------------------------------------------------------------
108 // reporter
109 if ($vars['reporter'])
110 {
111 // force email or name?? make a distinction?
112 // more elegant way to do this? probably
113 $user = $db->query_first("SELECT * FROM user WHERE email = '$vars[reporter]' OR MATCH (displayname) AGAINST ('$vars[reporter]')");
114 if ($user['userid'])
115 {
116 $querybuild['reporter'] = "AND bug.userid = $user[userid] OR comment.userid = $user[userid]";
117 }
118 }
119
120 // -------------------------------------------------------------------
121 // product/component/version stuff
122 if (is_array($vars['pcv']))
123 {
124 $querybuild['pcv'] = "AND bug.productid = {$vars['pcv']['product']} AND bug.componentid = {$vars['pcv']['component']} AND bug.versionid = {$vars['pcv']['version']}";
125 }
126
127 // -------------------------------------------------------------------
128 // severity, priority, status, resolution, assignedto
129
130 // severity
131 if ($vars['severity'])
132 {
133 $querybuild['severity'] = "AND bug.severity = $vars[severity]";
134 }
135
136 // priority
137 if ($vars['priority'])
138 {
139 $querybuild['priority'] = "AND bug.priority = $vars[priority]";
140 }
141
142 // status
143 if ($vars['status'])
144 {
145 $querybuild['status'] = "AND bug.status = $vars[status]";
146 }
147
148 // resolution
149 if ($vars['resolution'])
150 {
151 $querybuild['resolution'] = "AND bug.resolution = $vars[resolution]";
152 }
153
154 // assignment
155 if ($vars['assignedto'])
156 {
157 $querybuild['assignedto'] = "AND bug.assignedto = $vars[assignedto]";
158 }
159
160 // -------------------------------------------------------------------
161 // date
162 if ($vars['date'])
163 {
164 // now - (seconds/day * number of days)
165 $dateline = time() - ($vars['date'] * 3600);
166 $querybuild['date'] = "AND bug.dateline >= $dateline";
167 }
168
169 // -------------------------------------------------------------------
170 // sort by
171 $sortby = array('bugid', 'severity', 'priority', 'status', 'resolution', 'dateline');
172 $orderby = array('ASC', 'DESC');
173 $vars['orderby'] = strtoupper($vars['orderby']);
174 if (in_array($vars['sortby'], $sortby) AND in_array($vars['orderby'], $orderby))
175 {
176 $sortclause = "ORDER BY $vars[sortby] $vars[orderby]";
177 }
178 else if ($vars['sortby'] == 'relevance')
179 {
180 $sortclause = '';
181 }
182 else
183 {
184 echo 'bad sort';
185 exit;
186 }
187
188 // -------------------------------------------------------------------
189 // do the search
190 $search = $db->query("
191 SELECT bug.*, comment.commentid,
192 user1.displayname AS firstreport,
193 user2.displayname AS lastpost
194 FROM " . TABLE_PREFIX . "bug AS bug
195 LEFT JOIN " . TABLE_PREFIX . "comment AS comment
196 ON (bug.bugid = comment.bugid)
197 LEFT JOIN user AS user1
198 ON (bug.userid = user1.userid)
199 LEFT JOIN user AS user2
200 ON (bug.lastpostby = user2.userid)
201 WHERE bug.bugid <> 0
202 " . implode("\n\t\t\t", $querybuild) . "
203 $sortclause"
204 );
205
206 $numrows = $db->num_rows($search);
207
208 if ($numrows < 1)
209 {
210 echo 'no results found';
211 exit;
212 }
213
214 while ($bug = $db->fetch_array($search))
215 {
216 $bug['product'] = $bugsys->datastore['product']["$bug[productid]"]['title'];
217 $bug['version'] = $bugsys->datastore['version']["$bug[versionid]"]['version'];
218 $bug['status'] = $bugsys->datastore['status']["$bug[status]"]['status'];
219 $bug['resolution'] = $bugsys->datastore['resolution']["$bug[resolution]"]['resolution'];
220 $bug['lastpostinfo'] = datelike('standard', $bug['lastposttime']) . ' by ' . $bug['lastpost'];
221 $bug['urladd'] = "&amp;hilight=$hilight";
222 eval('$bugs .= "' . $template->fetch('trackerhome_bits') . '";');
223 }
224
225 eval('$template->flush("' . $template->fetch('search_results') . '");');
226
227 // print_r($querybuild);
228 }
229
230 // ###################################################################
231
232 if ($_REQUEST['do'] == 'search')
233 {
234 $pcv_select = construct_pcv_select('radio', '--');
235
236 $blankselect = '<option value="0">- Choose -</option>';
237
238 $select['severity'] = $blankselect;
239 foreach ($bugsys->datastore['severity'] AS $severity)
240 {
241 $value = $severity['severityid'];
242 $label = $severity['severity'];
243 eval('$select[severity] .= "' . $template->fetch('selectoption') . '";');
244 }
245
246 $select['priority'] = $blankselect;
247 foreach ($bugsys->datastore['priority'] AS $priority)
248 {
249 $value = $priority['priorityid'];
250 $label = $priority['priority'];
251 eval('$select[priority] .= "' . $template->fetch('selectoption') . '";');
252 }
253
254 $select['status'] = $blankselect;
255 foreach ($bugsys->datastore['status'] AS $status)
256 {
257 $value = $status['statusid'];
258 $label = $status['status'];
259 eval('$select[status] .= "' . $template->fetch('selectoption') . '";');
260 }
261
262 $select['resolution'] = $blankselect;
263 foreach ($bugsys->datastore['resolution'] AS $resolution)
264 {
265 $value = $resolution['resolutionid'];
266 $label = $resolution['resolution'];
267 eval('$select[resolution] .= "' . $template->fetch('selectoption') . '";');
268 }
269
270 $select['dev'] = $blankselect;
271 foreach ($bugsys->datastore['assignto'] AS $dev)
272 {
273 $value = $dev['userid'];
274 $label = construct_user_display($dev, false);
275 eval('$select[dev] .= "' . $template->fetch('selectoption') . '";');
276 }
277
278 eval('$template->flush("' . $template->fetch('search') . '");');
279 }
280
281 /*=====================================================================*\
282 || ###################################################################
283 || # $HeadURL$
284 || # $Id$
285 || ###################################################################
286 \*=====================================================================*/
287 ?>