Difference between revisions of "DisplayCustomFieldsInTicketSearch"

From Request Tracker Wiki
Jump to navigation Jump to search
Line 195: Line 195:
         },
         },
     },
     },
Follow Graham's instructions above for editing the CSS to your liking.
In RT, Naivgate to Tools -> Configuration -> Tools -> Theme and edit the Custom CSS in the advanced box. Use the div class name scheme from Graham above.


= Bugs =
= Bugs =

Revision as of 17:39, 29 April 2013

Custom Fields in Ticket Search Results

4.0

Use __CustomField.{NAME}__ as field name to display custom field values in search results.

Example: '__Status__', '__CustomField.{customerid}__', '__OwnerName__',

Older

/* Note: this section "custom fields in ticket search results" doesn't seem to apply to RT 3.6 and above ... */

Copy [=rt/share/html/Search/Elements/TicketRow] and [=rt/share/html/Search/Elements/TicketHeader] to your rt/local/html directory. Be sure to duplicate the directory structure.

In TicketRow add the following to include the value of the "SubQueue" custom field:

[=$Ticket->FirstCustomFieldValue('SubQueue')]

You can replace an existing column or add a new column. In either case, you'll need to adjust the column headings in [=rt/local/html/Search/Elements/TicketHeader] appropriately. Here's another example

<TD><small><%$Ticket->FirstCustomFieldValue('Department')%>
<%$Ticket->Requestors->MemberEmailAddressesAsString%></small></td>

Customizing the Ticket Search Results

See the DefaultSearchResultFormat option in the etc/RT_Config.pm configuration file for ways to customize the ticket search results page. If you edit this setting, you should do so in the SiteConfig file.

Ensuring Custom Fields are sortable in the !TicketHeader

/todo/

Custom Fields in the "At a Glance" Ticket Summary

RT 3.6.3

See ChangeDefaultRTAtAGlance

RT 3.4.x

If you would like to add custom fields to the opening ticket summary page, then copy [=rt/share/html/Elements/MyTickets] to [=rt/local/html/Elements/MyTickets] and edit MyTickets in a similar fashion.

A novice user writes: In my small experience with RT 3.2.x, the key line in [=MyTickets] to examine and edit is the "Format = >" line. This is the line that controls what appears in the listing. Values are comma-separated and any text you want to to be used in the Title bar should be prefaced with "/Title:". In my case, I wanted to insert the value of a custom field called "SupportLevel" into the "At A Glance" Ticket Summary. The specific text I inserted into the Format line was simply: [='CustomField.SupportLevel /TITLE:Level']. To make this consistant on the entire "At A Glance" page I made the same edit to the [=MyRequests] file.

Note: I had to learn the hard way, that for RT3.4.x at least, the syntax is "CustomField.{CustomFieldName}", e.g., for the above example you would enter [='CustomField.{SupportLevel}/TITLE:Level']. Many thanks to Filip Jonckers for finally enlightening me.

*

To display other columns, you can lookup the names of the ones that come with RT3.4 here: cat RTROOT/share/html/Elements/RT__Ticket/ColumnMap.

*

Once you've made these changes, you may have to restart your webserver software. For example, with Apache you would run 'apachectl graceful'.

Display Custom Fields with Custom Formatting

by Graham Briggs

Unlike normal fields where you can easily override the subroutine that displays the field in ColumnMap, altering the formatting of a custom field is a little more awkward as far as I can see.

How I did it is as follows:

First step was to override the ColumnMap file. Copy the file from:

$RT_HOME/share/html/Elements/RT__Ticket/ColumnMap

into

$RT_HOME/local/html/Elements/RT__Ticket/ColumnMap

I added the following subroutine:

sub _compress {
  my $field = shift;
  my $ticket = shift;
  my $tring = "<div class=\"" . lc $field;

  if ($ticket->CustomFieldObj->Type eq "Select") {
    my $foo = lc $ticket->Content;
    $foo =~ s/[\W]//g;
    $tring .= $foo;
  }

  $tring .= "\">";

  if ($ticket->CustomFieldObj->Type eq 'Image') {
    $tring .= $m->scomp( '/Elements/ShowCustomFieldImage', Object => $ticket );
  } else {
    $tring .= $ticket->Content;
  }

  $tring .= "</div>";
  return $tring;
}

and edited the code within sub ColumnMap:

elsif ( $attr eq 'value' ) {
  return sub {
    my $values = $_[0]->CustomFieldValues($field);
    return map {
      \(_compress($field, $_)),
    } @{ $values->ItemsArrayRef };
  };
}

this alters the output to show <div class="fieldfoofoo">Foo Foo</div> instead of just "Foo Foo".

For a custom field named "Progress" and content "Pending Design Review" this will be <div class="progresspendingdesignreview">Pending Design Review</div>

Then you override the CSS file webrt.css - create a file called:

$RT_HOME/local/html/Callbacks/MyCallbacks/NoAuth/webrt.css/Default

and add in the CSS into that file. For example:

.progressnew {
  background-color: #ffffff;
}

.progressintegrationtesting {
  background-color: #00ff00;
}

.progresscompleted {
  background-color: #888888;
}

Which assigned pretty background colours to each status when printed, which is exactly what I wanted.

You can also redefine CSS elements in the rest of the page in this file, if you want to.


UPDATE for Display Custom Fields with Custom Formatting by Graham Briggs for RT 4.0.8:

By Daniel Farst

Use file: $RT_HOME/share/html/Elements/ColumnMap

instead of the one listed above.

Copy it to: $RT_HOME/local/html/Elements/ColumnMap

I edited the subroutine from Graham to also have binary file custom fields (Upload One File, Upload Multiple Files) display as links to the actual file rather than just a file name (much more useful in my opinion). Remove the elsif Type eq Binary stanza if you don't want it:

sub _compress {
  my $field = shift;
  my $ticket = shift;
  my $tring = "<div class=\"" . lc $field;

  if ($ticket->CustomFieldObj->Type eq "Select") {
    my $foo = lc $ticket->Content;
    $foo =~ s/[\W]//g;
    $tring .= $foo;
  }

  $tring .= "\">";

  if ($ticket->CustomFieldObj->Type eq 'Image') {
    $tring .= $m->scomp( '/Elements/ShowCustomFieldImage', Object => $ticket );
  } elsif ($ticket->CustomFieldObj->Type eq 'Binary') {
    $tring .= $m->scomp( '/Elements/ShowCustomFieldBinary', Object => $ticket );
  } else {
    $tring .= $ticket->Content;
  }
  
  $tring .= "</div>";
  return $tring;
}

Copy and paste the above sub into the ColumnMap file immediately before

my $COLUMN_MAP = {

Replace the CustomField => { section of the map with the following:

    CustomField => {
        attribute => sub { return shift @_ },
        title     => sub { return pop @_ },
        value     => sub {
            # Display custom field contents, separated by newlines.
            # For Image custom fields we also show a thumbnail here.

            my $values = $_[0]->CustomFieldValues( $_[-1] );
            my @values = map {
		(
		    \(_compress( $_[-1] , $_ ))
		),
		\'
',
            } @{ $values->ItemsArrayRef };
            pop @values; # Remove that last 

            return @values;
        },
    },

In RT, Naivgate to Tools -> Configuration -> Tools -> Theme and edit the Custom CSS in the advanced box. Use the div class name scheme from Graham above.

Bugs

At least RT version 3.0.9 has a bug which prevents the above from working. Instead of the custom field name, only the custom field id will work. So [=$Ticket->FirstCustomFieldValue('SubQueue')] would become [=$Ticket->FirstCustomFieldValue('2')]. RT 3.0.10 fixes this though.

A nasty (nasty because without the counter it keeps looping, and also nasty because I have no knowledge of RT guts and hadn't even read this page when I wrote this) hack for 3.0.9 involves making a hash of field names with id numbers so that the names can be used: