RT 4.0.13
[freeside.git] / rt / share / html / Elements / ColumnMap
index 878950b..7b127e9 100644 (file)
@@ -2,7 +2,7 @@
 %#
 %# COPYRIGHT:
 %#
-%# This software is Copyright (c) 1996-2012 Best Practical Solutions, LLC
+%# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
 %#                                          <sales@bestpractical.com>
 %#
 %# (Except where explicitly superseded by other copyright notices)
@@ -96,24 +96,34 @@ my $COLUMN_MAP = {
         attribute => sub { return shift @_ },
         title     => sub { return pop @_ },
         value     => sub {
+            # Cache the CF object on a per-request basis, to avoid
+            # having to load it for every row
+            my $key = join("-","CF",
+                           $_[0]->CustomFieldLookupType,
+                           $_[0]->CustomFieldLookupId,
+                           $_[-1]);
+
+            my $cf = $m->notes($key);
+            unless ($cf) {
+                $cf = $_[0]->LoadCustomFieldByIdentifier($_[-1]);
+                $m->notes($key, $cf);
+            }
+
             # Display custom field contents, separated by newlines.
             # For Image custom fields we also show a thumbnail here.
 
-            my $object = shift;
-            my $cfname = pop;
-            my $values = $object->CustomFieldValues( $cfname );
+            my $values = $cf->ValuesForObject( $_[0] );
             return if $values->Count == 0;
             my @values;
             # it is guaranteed to be the same type for all fields, right?
             my $v = $values->First;
-            my $cftype = $v->CustomFieldObj->Type;
 
             do {
-                if ($cftype eq 'Image') {
+                if ($v->Type eq 'Image') {
                     push @values, 
                         \($m->scomp( '/Elements/ShowCustomFieldImage',
                                       Object => $v ));
-                } elsif ( $cftype eq 'Date' or $cftype eq 'DateTime' ) {
+                } elsif ( $v->Type eq 'Date' or $v->Type eq 'DateTime' ) {
                     # then actually return the date object;
                     # ProcessColumnMapValue will stringify it
                     my $DateObj = RT::Date->new( $session{'CurrentUser'} );
@@ -186,8 +196,10 @@ $m->callback( COLUMN_MAP => $COLUMN_MAP, CallbackName => 'Once', CallbackOnce =>
 $m->callback( COLUMN_MAP => $COLUMN_MAP );
 
 # first deal with class specific things
-my $class_map = $m->comp("/Elements/$Class/ColumnMap", Attr => $Attr, Name => $Name );
-return $class_map if defined $class_map;
+if (RT::Interface::Web->ComponentPathIsSafe($Class) and $m->comp_exists("/Elements/$Class/ColumnMap")) {
+    my $class_map = $m->comp("/Elements/$Class/ColumnMap", Attr => $Attr, Name => $Name );
+    return $class_map if defined $class_map;
+}
 return GetColumnMapEntry( Map => $COLUMN_MAP, Name => $Name, Attribute => $Attr );
 
 </%INIT>