| [ Index ] |
PHP Cross Reference of Drupal 6 (gatewave) |
[Summary view] [Print] [Text view]
1 <?php 2 // $Id: issue.inc,v 1.354 2009/06/18 03:28:55 dww Exp $ 3 4 5 /** 6 * JS callback method to return updated elements on the issue form. 7 * This function is called when someone changes the "Project" selector. 8 */ 9 function project_issue_update_project() { 10 $form_state = array('storage' => NULL, 'submitted' => FALSE, 'rebuild' => TRUE); 11 $form_build_id = $_POST['form_build_id']; 12 $form = form_get_cache($form_build_id, $form_state); 13 $args = $form['#parameters']; 14 $form_id = array_shift($args); 15 $form_state['post'] = $form['#post'] = $_POST; 16 $form['#programmed'] = $form['#redirect'] = FALSE; 17 18 drupal_process_form($form_id, $form, $form_state); 19 20 // Rebuild the form and cache it again. 21 $form = drupal_rebuild_form($form_id, $form_state, $args, $form_build_id); 22 23 // These used to be path arguments. Now they arrive via form element. 24 $issue_nid = $form['nid']['#value']; 25 $pid = $form_state['values']['project_info']['pid']; 26 $rid = isset($form_state['values']['project_info']['rid']) ? $form_state['values']['project_info']['rid'] : 0; 27 $cid = $form_state['values']['cid']; 28 $assigned_uid = $form_state['values']['project_info']['assigned']; 29 30 $project_info = $form['original_issue']['project_info']; 31 32 // Only generate release stuff if the project_release module is enabled. 33 if (module_exists('project_release')) { 34 35 $project->nid = $pid; 36 if ($releases = project_release_get_releases($project, 0)) { 37 $old_version = db_result(db_query("SELECT version FROM {project_release_nodes} WHERE nid = %d", $rid)); 38 $releases = array(t('<none>')) + $releases; 39 // Since the value of releases is by nid, try to match release 40 // based on the label instead. 41 $default = 0; 42 foreach ($releases as $key => $label) { 43 if ($old_version == $label) { 44 $default = $key; 45 } 46 } 47 // Element is tree'd here to match the original form layout. 48 $project_info['#tree'] = TRUE; 49 $project_info['rid']['#options'] = $releases; 50 $project_info['rid']['#disabled'] = FALSE; 51 if (!empty($default)) { 52 $project_info['rid']['#value'] = $default; 53 $project_info['rid']['#default_value'] = $default; 54 } 55 } 56 else { 57 $project_info['rid']['#disabled'] = TRUE; 58 $project_info['rid']['#options'] = array(); 59 } 60 } 61 62 // Assigned. 63 if (is_numeric($issue_nid)) { 64 $issue = node_load(array('nid' => $issue_nid, 'type' => 'project_issue')); 65 } 66 else { 67 // @TODO: This case should not ever be hit until 68 // http://drupal.org/node/197281 lands. 69 $issue = new stdClass; 70 } 71 $issue->project_issue['pid'] = $pid; 72 $assigned_choices = project_issue_assigned_choices($issue); 73 74 $project_info['assigned']['#default_value'] = $assigned_uid; 75 $project_info['assigned']['#options'] = $assigned_choices; 76 77 // Components. 78 $project = db_fetch_object(db_query('SELECT * FROM {project_issue_projects} WHERE nid = %d', $pid)); 79 $components = array(); 80 if ($project->components) { 81 $components = array(t('<none>')); 82 foreach (unserialize($project->components) as $component) { 83 $component = check_plain($component); 84 $components[$component] = $component; 85 } 86 } 87 88 $project_info['component']['#default_value'] = $cid; 89 $project_info['component']['#options'] = $components; 90 91 // Build the HTML output for the component select. 92 $output = theme('status_messages') . drupal_render($project_info); 93 drupal_json(array('status' => TRUE, 'data' => $output)); 94 exit; 95 } 96 97 /** 98 * Build an array of users to whom an issue may be assigned. 99 * 100 * @param $issue 101 * The fully loaded issue node object. 102 * @return 103 * A keyed array in the form uid => name containing users 104 * to whom an issue may be assigned. 105 */ 106 function project_issue_assigned_choices($issue) { 107 // Setup the array of choices for who the issue is assigned to. 108 $assigned = array(); 109 foreach (module_implements('project_issue_assignees') as $module) { 110 $function = "{$module}_project_issue_assignees"; 111 $function($assigned, $issue); 112 } 113 natcasesort($assigned); 114 $assigned = array(0 => empty($issue->project_issue['assigned']) ? t('Unassigned') : t('Unassign')) + $assigned; 115 return $assigned; 116 } 117 118 /** 119 * Implementation of hook_project_issue_assignees(). 120 * 121 * This hook is used to modify the list of 'Assigned' users when creating or 122 * commenting on an issue. 123 * 124 * @param $assigned 125 * An array of key => value pairs in the format of uid => name that represents 126 * the list of users that the issue may be assigned to. This parameter 127 * is passed by reference so the hook may make changes, such as adding or 128 * removing elements. 129 * @param $node 130 * The node object for the issue. 131 */ 132 function project_issue_project_issue_assignees(&$assigned, $node) { 133 global $user; 134 if ($user->uid) { 135 if (isset($node->project_issue['assigned']) && $user->uid != $node->project_issue['assigned']) { 136 // Assigned to someone else, add the currently assigned user. 137 $account = user_load(array('uid' => $node->project_issue['assigned'])); 138 $assigned[$node->project_issue['assigned']] = $account->name; 139 } 140 // Always let the person replying assign it to themselves. 141 $assigned[$user->uid] = $user->name; 142 } 143 144 if (user_access('assign and be assigned project issues')) { 145 // All users are included if either anon or auth user has the perm. 146 if (db_result(db_query("SELECT rid FROM {permission} WHERE perm LIKE '%%%s%%' AND rid IN(%d, %d)", 'assign and be assigned project issues', DRUPAL_ANONYMOUS_RID, DRUPAL_AUTHENTICATED_RID))) { 147 $result = db_query("SELECT uid, name FROM {users}"); 148 } 149 else { 150 $result = db_query("SELECT u.uid, u.name FROM {users} u INNER JOIN {users_roles} ur ON u.uid = ur.uid INNER JOIN {role} r ON ur.rid = r.rid INNER JOIN {permission} p ON p.rid = r.rid WHERE p.perm LIKE '%%%s%%'", 'assign and be assigned project issues'); 151 } 152 153 while ($assignee = db_fetch_object($result)) { 154 $assigned[$assignee->uid] = $assignee->name; 155 } 156 } 157 } 158 159 // Support stuff 160 161 /** 162 * Return information about project issue state values. 163 * 164 * @param $sid 165 * Integer state id to return information about, or 0 for all states. 166 * @param $restrict 167 * Boolean to determine if states should be restricted based on the 168 * permissions of the current user or $account if that parameter 169 * is provided. 170 * @param $is_author 171 * Boolean that indicates if the current user is the author of the 172 * issue, which can potentially grant a wider selection of states. 173 * @param $current_sid 174 * The current integer state id for the issue. 175 * @param $defaults 176 * Boolean to request the states used for default issue queries. 177 * @param $account 178 * Account of a user to pass to user_access() for access checking. 179 * This parameter will have no effect unless $restrict is also 180 * set to TRUE. 181 * 182 * @return 183 * An array of states (sid as key, name as value) that match the 184 * given filters, or the name of the requested state. 185 * NOTE: The state name returned is raw text, and should be filtered via 186 * check_plain() or filter_xss() before being printed as HTML output. 187 */ 188 function project_issue_state($sid = 0, $restrict = false, $is_author = false, $current_sid = 0, $defaults = false, $account = NULL) { 189 static $options; 190 191 if (!$options) { 192 $result = db_query('SELECT * FROM {project_issue_state} ORDER BY weight'); 193 while ($state = db_fetch_object($result)) { 194 $options[] = $state; 195 } 196 } 197 198 foreach($options as $state) { 199 if ($restrict) { 200 // Check if user has access, 201 // or if status is default status and therefore available to all, 202 // or if user is original issue author and author has access, 203 // or if the issue is already in a state, even if the user doesn't have 204 // access to that state themselves. 205 if (user_access('set issue status '. str_replace("'", "", $state->name), $account) 206 || user_access('administer projects', $account) 207 || ($state->sid == variable_get('project_issue_default_state', 1)) 208 || ($state->author_has && $is_author) 209 || ($state->sid == $current_sid) ) { 210 $states[$state->sid] = $state->name; 211 } 212 } 213 else if ($defaults) { 214 if ($state->default_query) { 215 $states[$state->sid] = $state->name; 216 } 217 } 218 else { 219 $states[$state->sid] = $state->name; 220 } 221 } 222 223 return $sid ? $states[$sid] : $states; 224 } 225 226 /** 227 * Return an array of state ids that should be used for default queries. 228 */ 229 function project_issue_default_states() { 230 static $defaults; 231 if (empty($defaults)) { 232 $states = project_issue_state(0, false, false, 0, true); 233 $defaults = !empty($states) ? array_keys($states) : array(1, 2, 4); 234 } 235 return $defaults; 236 } 237 238 function project_issue_priority($priority = 0) { 239 $priorities = array(1 => t('critical'), t('normal'), t('minor')); 240 return $priority ? $priorities[$priority] : $priorities; 241 } 242 243 function project_issue_category($category = 0, $plural = 1) { 244 if ($plural) { 245 $categories = array('bug' => t('bug reports'), 'task' => t('tasks'), 'feature' => t('feature requests'), 'support' => t('support requests')); 246 } 247 else { 248 $categories = array('bug' => t('bug report'), 'task' => t('task'), 'feature' => t('feature request'), 'support' => t('support request')); 249 } 250 return $category ? $categories[$category] : $categories; 251 } 252 253 function project_issue_count($pid) { 254 $state = array(); 255 $result = db_query('SELECT p.sid, count(p.sid) AS count FROM {node} n INNER JOIN {project_issues} p ON n.nid = p.nid WHERE n.status = 1 AND p.pid = %d GROUP BY p.sid', $pid); 256 while ($data = db_fetch_object($result)) { 257 $state[$data->sid] = $data->count; 258 } 259 return $state; 260 } 261 262 /** 263 * Return the HTML to use for the links at the top of issue query pages. 264 * 265 * @param $links 266 * Array of links, indexed by the action ('create', 'search', etc). 267 * 268 * @see project_issue_query_result() 269 * @see theme_links() 270 */ 271 function theme_project_issue_query_result_links($links) { 272 return theme('links', $links); 273 } 274 275 /** 276 * Provide an array of project issue summary fields. 277 * @param $context 278 * The context in which the fields will be displayed. 279 * 'web' for project_issue node and comment summary tables. 280 * 'email' for project_issue notification e-mail messages. 281 */ 282 function project_issue_field_labels($context) { 283 284 if ($context == 'web') { 285 $labels = array('title' => t('Title')); 286 } 287 else { 288 $labels = array(); 289 } 290 291 $labels += array( 292 'pid' => t('Project'), 293 'rid' => t('Version'), 294 'component' => t('Component'), 295 'category' => t('Category'), 296 'priority' => t('Priority'), 297 'assigned' => t('Assigned to'), 298 'sid' => t('Status'), 299 ); 300 301 if ($context == 'email') { 302 $labels += array( 303 'name' => t('Reported by'), 304 'updator' => t('Updated by'), 305 ); 306 } 307 return $labels; 308 } 309 310 /** 311 * Provide the text displayed to a user for a specific metadata field. 312 * 313 * @param $field 314 * Name of the field. 315 * @param $value 316 * Value of the field. 317 * 318 * @return 319 * Text to display to user. NOTE: This is unfiltered text! If this output is 320 * being sent over the web, you must use check_plain(). 321 */ 322 function project_issue_change_summary($field, $value) { 323 switch ($field) { 324 case 'pid': 325 $project = node_load(array('nid' => $value, 'type' => 'project_project')); 326 return $project->title; 327 case 'category': 328 return $value ? project_issue_category($value, 0) : t('<none>'); 329 case 'priority': 330 return $value ? project_issue_priority($value) : t('<none>'); 331 case 'rid': 332 if ($value) { 333 $release->nid = $value; 334 if (module_exists('project_release')) { 335 $release = project_release_load($release); 336 } 337 else { 338 $release->project_release['version'] = t('Unknown'); 339 } 340 return $release->project_release['version']; 341 } 342 return t('<none>'); 343 case 'assigned': 344 $user = user_load(array('uid' => $value)); 345 return (int) $value === 0 ? variable_get('anonymous', t('Anonymous')) : $user->name; 346 case 'sid': 347 return $value ? project_issue_state($value) : t('<none>'); 348 default: 349 return $value; 350 } 351 } 352 353 function theme_project_issue_create_forbidden($uri = '') { 354 global $user; 355 if ($user->uid) { 356 return ''; 357 } 358 359 // We cannot use drupal_get_destination() because these links sometimes appear on /node and taxo listing pages. 360 $destination = "destination=". drupal_urlencode("node/add/project-issue/$uri"); 361 362 if (variable_get('user_register', 1)) { 363 return t('<a href="@login">Login</a> or <a href="@register">register</a> to create an issue', array('@login' => url('user/login', array('query' => $destination)), '@register' => url('user/register', array('query' => $destination)))); 364 } 365 else { 366 return t('<a href="@login">Login</a> to create an issue', array('@login' => url('user/login', array('query' => $destination)))); 367 } 368 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated: Thu Mar 24 11:18:33 2011 | Cross-referenced by PHPXref 0.7 |