/** * Gets the localized title for the specified column. The column can be native or custom. * The custom fields must contain the 'custom_' prefix. * * @param string $p_column - The column name. * @return string The column localized name. * @access public */ function column_get_title($p_column) { $t_custom_field = column_get_custom_field_name($p_column); if ($t_custom_field !== null) { $t_field_id = custom_field_get_id_from_name($t_custom_field); if ($t_field_id === false) { $t_custom_field = '@' . $t_custom_field . '@'; } else { $t_def = custom_field_get_definition($t_field_id); $t_custom_field = lang_get_defaulted($t_def['name']); } return $t_custom_field; } $t_plugin_columns = columns_get_plugin_columns(); if (isset($t_plugin_columns[$p_column])) { $t_column_object = $t_plugin_columns[$p_column]; return $t_column_object->title; } switch ($p_column) { case 'attachment_count': return lang_get('attachments'); case 'bugnotes_count': return '#'; case 'category_id': return lang_get('category'); case 'edit': return ''; case 'handler_id': return lang_get('assigned_to'); case 'last_updated': return lang_get('updated'); case 'os_build': return lang_get('os_version'); case 'project_id': return lang_get('email_project'); case 'reporter_id': return lang_get('reporter'); case 'selection': return ''; case 'sponsorship_total': return sponsorship_get_currency(); case 'version': return lang_get('product_version'); case 'view_state': return lang_get('view_status'); default: return lang_get_defaulted($p_column); } }
/** * Add sort parameters to the query clauses * @param array &$p_filter Filter to sort. * @param boolean $p_show_sticky Whether to show sticky items. * @param array $p_query_clauses Array of query clauses. * @return array $p_query_clauses */ function filter_get_query_sort_data(array &$p_filter, $p_show_sticky, array $p_query_clauses) { # if sort is blank then default the sort and direction. This is to fix the # symptoms of #3953. Note that even if the main problem is fixed, we may # have to keep this code for a while to handle filters saved with this blank field. if (is_blank($p_filter[FILTER_PROPERTY_SORT_FIELD_NAME])) { $p_filter[FILTER_PROPERTY_SORT_FIELD_NAME] = 'last_updated'; $p_filter[FILTER_PROPERTY_SORT_DIRECTION] = 'DESC'; } $p_query_clauses['order'] = array(); $t_sort_fields = explode(',', $p_filter[FILTER_PROPERTY_SORT_FIELD_NAME]); $t_dir_fields = explode(',', $p_filter[FILTER_PROPERTY_SORT_DIRECTION]); $t_plugin_columns = columns_get_plugin_columns(); if (gpc_string_to_bool($p_filter[FILTER_PROPERTY_STICKY]) && null !== $p_show_sticky) { $p_query_clauses['order'][] = '{bug}.sticky DESC'; } $t_count = count($t_sort_fields); for ($i = 0; $i < $t_count; $i++) { $c_sort = $t_sort_fields[$i]; $c_dir = 'DESC' == $t_dir_fields[$i] ? 'DESC' : 'ASC'; if (!in_array($t_sort_fields[$i], array_slice($t_sort_fields, $i + 1))) { # if sorting by a custom field if (strpos($c_sort, 'custom_') === 0) { $t_custom_field = utf8_substr($c_sort, utf8_strlen('custom_')); $t_custom_field_id = custom_field_get_id_from_name($t_custom_field); $t_def = custom_field_get_definition($t_custom_field_id); $t_value_field = $t_def['type'] == CUSTOM_FIELD_TYPE_TEXTAREA ? 'text' : 'value'; $c_cf_alias = 'custom_field_' . $t_custom_field_id; # Distinguish filter table aliases from sort table aliases (see #19670) $t_cf_table_alias = 'cf_sort_' . $t_custom_field_id; $t_cf_select = $t_cf_table_alias . '.' . $t_value_field . ' ' . $c_cf_alias; # check to be sure this field wasn't already added to the query. if (!in_array($t_cf_select, $p_query_clauses['select'])) { $p_query_clauses['select'][] = $t_cf_select; $p_query_clauses['join'][] = 'LEFT JOIN {custom_field_string} ' . $t_cf_table_alias . ' ON {bug}.id = ' . $t_cf_table_alias . '.bug_id AND ' . $t_cf_table_alias . '.field_id = ' . $t_custom_field_id; } $p_query_clauses['order'][] = $c_cf_alias . ' ' . $c_dir; # if sorting by plugin columns } else { if (isset($t_plugin_columns[$t_sort_fields[$i]])) { $t_column_object = $t_plugin_columns[$t_sort_fields[$i]]; if ($t_column_object->sortable) { $t_clauses = $t_column_object->sortquery($c_dir); if (is_array($t_clauses)) { if (isset($t_clauses['join'])) { $p_query_clauses['join'][] = $t_clauses['join']; } if (isset($t_clauses['order'])) { $p_query_clauses['order'][] = $t_clauses['order']; } } } # standard column } else { $t_sort_col = '{bug}.' . $c_sort; # when sorting by due_date, always display undefined dates last if ('due_date' == $c_sort && 'ASC' == $c_dir) { $t_sort_due_date = $t_sort_col . ' = 1'; $p_query_clauses['select'][] = $t_sort_due_date; $t_sort_col = $t_sort_due_date . ', ' . $t_sort_col; } $p_query_clauses['order'][] = $t_sort_col . ' ' . $c_dir; } } } } # add basic sorting if necessary if (!in_array('last_updated', $t_sort_fields)) { $p_query_clauses['order'][] = '{bug}.last_updated DESC'; } if (!in_array('date_submitted', $t_sort_fields)) { $p_query_clauses['order'][] = '{bug}.date_submitted DESC'; } return $p_query_clauses; }
/** * Print the value of the custom field (if the field is applicable to the project of * the specified issue and the current user has read access to it. * see custom_function_default_print_column_title() for rules about column names. * @param string $p_column Name of field to show in the column. * @param BugData $p_bug Bug object. * @param integer $p_columns_target See COLUMNS_TARGET_* in constant_inc.php. * @return void */ function custom_function_default_print_column_value($p_column, BugData $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE) { if (COLUMNS_TARGET_CSV_PAGE == $p_columns_target) { $t_column_start = ''; $t_column_end = ''; $t_column_empty = ''; } else { $t_column_start = '<td class="column-%s">'; $t_column_end = '</td>'; $t_column_empty = ' '; } $t_custom_field = column_get_custom_field_name($p_column); if ($t_custom_field !== null) { printf($t_column_start, 'custom-' . $t_custom_field); $t_field_id = custom_field_get_id_from_name($t_custom_field); if ($t_field_id === false) { echo '@', $t_custom_field, '@'; } else { $t_issue_id = $p_bug->id; $t_project_id = $p_bug->project_id; if (custom_field_is_linked($t_field_id, $t_project_id)) { $t_def = custom_field_get_definition($t_field_id); print_custom_field_value($t_def, $t_field_id, $t_issue_id); } else { # field is not linked to project echo $t_column_empty; } } echo $t_column_end; } else { $t_plugin_columns = columns_get_plugin_columns(); if ($p_columns_target != COLUMNS_TARGET_CSV_PAGE) { $t_function = 'print_column_' . $p_column; } else { $t_function = 'csv_format_' . $p_column; } if (function_exists($t_function)) { if ($p_columns_target != COLUMNS_TARGET_CSV_PAGE) { $t_function($p_bug, $p_columns_target); } else { $t_function($p_bug); } } else { if (isset($t_plugin_columns[$p_column])) { $t_column_object = $t_plugin_columns[$p_column]; print_column_plugin($t_column_object, $p_bug, $p_columns_target); } else { printf($t_column_start, $p_column); if (isset($p_bug->{$p_column})) { echo string_display_line($p_bug->{$p_column}) . $t_column_end; } else { echo '@' . $p_column . '@' . $t_column_end; } } } } }
/** * Add sort parameters to the query clauses * @param array $p_filter * @param bool $p_show_sticky * @param array $p_query_clauses * @return array $p_query_clauses */ function filter_get_query_sort_data(&$p_filter, $p_show_sticky, $p_query_clauses) { $t_bug_table = db_get_table('bug'); $t_custom_field_string_table = db_get_table('custom_field_string'); # if sort is blank then default the sort and direction. This is to fix the # symptoms of #3953. Note that even if the main problem is fixed, we may # have to keep this code for a while to handle filters saved with this blank field. if (is_blank($p_filter[FILTER_PROPERTY_SORT_FIELD_NAME])) { $p_filter[FILTER_PROPERTY_SORT_FIELD_NAME] = 'last_updated'; $p_filter[FILTER_PROPERTY_SORT_DIRECTION] = 'DESC'; } $p_query_clauses['order'] = array(); $t_sort_fields = explode(',', $p_filter[FILTER_PROPERTY_SORT_FIELD_NAME]); $t_dir_fields = explode(',', $p_filter[FILTER_PROPERTY_SORT_DIRECTION]); $t_plugin_columns = columns_get_plugin_columns(); if (gpc_string_to_bool($p_filter[FILTER_PROPERTY_STICKY]) && NULL !== $p_show_sticky) { $p_query_clauses['order'][] = "{$t_bug_table}.sticky DESC"; } $t_count = count($t_sort_fields); for ($i = 0; $i < $t_count; $i++) { $c_sort = db_prepare_string($t_sort_fields[$i]); $c_dir = 'DESC' == $t_dir_fields[$i] ? 'DESC' : 'ASC'; if (!in_array($t_sort_fields[$i], array_slice($t_sort_fields, $i + 1))) { # if sorting by a custom field if (strpos($c_sort, 'custom_') === 0) { $t_custom_field = utf8_substr($c_sort, utf8_strlen('custom_')); $t_custom_field_id = custom_field_get_id_from_name($t_custom_field); $t_def = custom_field_get_definition($t_custom_field_id); $t_value_field = $t_def['type'] == CUSTOM_FIELD_TYPE_TEXTAREA ? 'text' : 'value'; $c_cf_alias = 'custom_field_' . $t_custom_field_id; $t_cf_table_alias = $t_custom_field_string_table . '_' . $t_custom_field_id; $t_cf_select = "{$t_cf_table_alias}.{$t_value_field} {$c_cf_alias}"; # check to be sure this field wasn't already added to the query. if (!in_array($t_cf_select, $p_query_clauses['select'])) { $p_query_clauses['select'][] = $t_cf_select; $p_query_clauses['join'][] = "LEFT JOIN {$t_custom_field_string_table} {$t_cf_table_alias} ON {$t_bug_table}.id = {$t_cf_table_alias}.bug_id AND {$t_cf_table_alias}.field_id = {$t_custom_field_id}"; } $p_query_clauses['order'][] = "{$c_cf_alias} {$c_dir}"; # if sorting by plugin columns } else { if (isset($t_plugin_columns[$t_sort_fields[$i]])) { $t_column_object = $t_plugin_columns[$t_sort_fields[$i]]; if ($t_column_object->sortable) { $t_clauses = $t_column_object->sortquery($c_dir); if (is_array($t_clauses)) { if (isset($t_clauses['join'])) { $p_query_clauses['join'][] = $t_clauses['join']; } if (isset($t_clauses['order'])) { $p_query_clauses['order'][] = $t_clauses['order']; } } } # standard column } else { if ('last_updated' == $c_sort) { $c_sort = "last_updated"; } $p_query_clauses['order'][] = "{$t_bug_table}.{$c_sort} {$c_dir}"; } } } } # add basic sorting if necessary if (!in_array('last_updated', $t_sort_fields)) { $p_query_clauses['order'][] = "{$t_bug_table}.last_updated DESC"; } if (!in_array('date_submitted', $t_sort_fields)) { $p_query_clauses['order'][] = "{$t_bug_table}.date_submitted DESC"; } return $p_query_clauses; }
/** * Gets the formatted value for the specified plugin column value. * @param $p_custom_field The plugin column name. * @param $p_bug The bug to print the column for (needed for the display function of the plugin column). * @returns The plugin column value. */ function excel_format_plugin_column_value($p_column, $p_bug) { $t_plugin_columns = columns_get_plugin_columns(); if (!isset($t_plugin_columns[$p_column])) { return excel_prepare_string(''); } else { $t_column_object = $t_plugin_columns[$p_column]; ob_start(); $t_column_object->display($p_bug, COLUMNS_TARGET_EXCEL_PAGE); $t_value = ob_get_clean(); return excel_prepare_string($t_value); } }
function custom_function_override_print_column_value($p_column, $p_bug, $p_columns_target = COLUMNS_TARGET_VIEW_PAGE) { if (COLUMNS_TARGET_CSV_PAGE == $p_columns_target) { $t_column_start = ''; $t_column_end = ''; $t_column_empty = ''; } else { $t_column_start = '<td class="center">'; $t_column_end = '</td>'; $t_column_empty = ' '; } $t_custom_field = column_get_custom_field_name($p_column); if ($t_custom_field !== null) { echo $t_column_start; $t_field_id = custom_field_get_id_from_name($t_custom_field); if ($t_field_id === false) { echo '@', $t_custom_field, '@'; } else { $t_issue_id = $p_bug->id; $t_project_id = $p_bug->project_id; if (custom_field_is_linked($t_field_id, $t_project_id)) { $t_def = custom_field_get_definition($t_field_id); if (strpos($p_column, 'custom_Deadline') === 0 && $t_def['type'] == CUSTOM_FIELD_TYPE_DATE) { $deadline_date = custom_field_get_value($t_field_id, $t_issue_id); if ($p_issue_row['status'] < 80) { $current_date = strtotime(date("Y-m-d")); if ($current_date >= $deadline_date) { echo '<b><font color="red">'; print_custom_field_value($t_def, $t_field_id, $t_issue_id); echo '</font></b>'; } else { print_custom_field_value($t_def, $t_field_id, $t_issue_id); } } elseif ($deadline_date) { if (lang_get_current() == 'german') { echo '<b>ERLEDIGT!</b>'; } else { echo '<b>DONE!</b>'; } } } else { print_custom_field_value($t_def, $t_field_id, $t_issue_id); } } else { // field is not linked to project echo $t_column_empty; } } echo $t_column_end; } else { $t_plugin_columns = columns_get_plugin_columns(); if ($p_columns_target != COLUMNS_TARGET_CSV_PAGE) { if ($p_column == 'summary') { $t_function = 'print_column_summary_BFE'; } else { $t_function = 'print_column_' . $p_column; } } else { $t_function = 'csv_format_' . $p_column; } if (function_exists($t_function)) { if ($p_columns_target != COLUMNS_TARGET_CSV_PAGE) { $t_function($p_bug, $p_columns_target); } else { $t_function($p_bug); } } else { if (isset($t_plugin_columns[$p_column])) { $t_column_object = $t_plugin_columns[$p_column]; print_column_plugin($t_column_object, $p_bug, $p_columns_target); } else { if (isset($p_bug->{$p_column})) { echo $t_column_start . string_display_line($p_bug->{$p_column}) . $t_column_end; } else { echo $t_column_start . '@' . $p_column . '@' . $t_column_end; } } } } }