<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://rt-wiki.bestpractical.com/index.php?action=history&amp;feed=atom&amp;title=DefaultCustomFieldValue</id>
	<title>DefaultCustomFieldValue - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://rt-wiki.bestpractical.com/index.php?action=history&amp;feed=atom&amp;title=DefaultCustomFieldValue"/>
	<link rel="alternate" type="text/html" href="https://rt-wiki.bestpractical.com/index.php?title=DefaultCustomFieldValue&amp;action=history"/>
	<updated>2026-08-23T16:13:33Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://rt-wiki.bestpractical.com/index.php?title=DefaultCustomFieldValue&amp;diff=904&amp;oldid=prev</id>
		<title>Admin: 7 revisions imported</title>
		<link rel="alternate" type="text/html" href="https://rt-wiki.bestpractical.com/index.php?title=DefaultCustomFieldValue&amp;diff=904&amp;oldid=prev"/>
		<updated>2016-04-06T20:08:48Z</updated>

		<summary type="html">&lt;p&gt;7 revisions imported&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;It is possible to have custom fields with default values showing up at edit time.&lt;br /&gt;
&lt;br /&gt;
This example assumes you are using select lists.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;First you need to add a callback.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
#Create the follow directory structure: &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;local/html/Callbacks/CustomFieldDefaultValues/Elements/EditCustomFields&amp;lt;/span&amp;gt;&lt;br /&gt;
#&amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;Inside, create the file: MassageCustomFields&amp;lt;/span&amp;gt;&lt;br /&gt;
#&amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;Add the following code to the file:&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;&amp;lt;%init&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 unless ($CustomFields) {&lt;br /&gt;
 &lt;br /&gt;
     return 1;&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 while (my $customField = $CustomFields-&amp;gt;Next) {&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     my $id          = $customField-&amp;gt;Id;&lt;br /&gt;
 &lt;br /&gt;
     my $key         = &amp;#039;Field-&amp;#039;. $id;&lt;br /&gt;
 &lt;br /&gt;
     my $cf_values   =  $customField-&amp;gt;ValuesClass;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     ( my $requireName = $cf_values . &amp;quot;.pm&amp;quot; ) =~ s{::}{/}g;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     require $requireName;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     if ($cf_values-&amp;gt;can(&amp;#039;DefaultValue&amp;#039;)) {&lt;br /&gt;
 &lt;br /&gt;
         $m-&amp;gt;notes($key, $cf_values-&amp;gt;DefaultValue());&lt;br /&gt;
 &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/%init&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;%ARGS&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
     $CustomFields =&amp;gt; undef&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/%ARGS&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;Second, you need to go to the custom fields values class, and add the method that will return the default value.&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
An example:&lt;br /&gt;
 package RT::CustomFieldValues::CUSTOM_FIELD_NAME;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 use strict;&lt;br /&gt;
 &lt;br /&gt;
 use warnings;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 use base qw(RT::CustomFieldValues::External);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 sub SourceDescription {&lt;br /&gt;
 &lt;br /&gt;
     return &amp;#039;Ticket distribution (public/private)&amp;#039;;&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 sub ExternalValues {&lt;br /&gt;
 &lt;br /&gt;
     return [&lt;br /&gt;
 &lt;br /&gt;
         {&lt;br /&gt;
 &lt;br /&gt;
             name        =&amp;gt; &amp;quot;private&amp;quot;,&lt;br /&gt;
 &lt;br /&gt;
             description =&amp;gt; &amp;#039;&amp;#039;,&amp;#039;&amp;#039;&lt;br /&gt;
 &lt;br /&gt;
             sortorder   =&amp;gt; 0&lt;br /&gt;
 &lt;br /&gt;
         },&lt;br /&gt;
 &lt;br /&gt;
         {&lt;br /&gt;
 &lt;br /&gt;
             name        =&amp;gt; &amp;quot;public&amp;quot;,&lt;br /&gt;
 &lt;br /&gt;
             description =&amp;gt; &amp;#039;&amp;#039;,&amp;#039;&amp;#039;&lt;br /&gt;
 &lt;br /&gt;
             sortorder   =&amp;gt; 1&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
     ];&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 sub DefaultValue {&lt;br /&gt;
 &lt;br /&gt;
     return &amp;quot;private&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 1;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;And thats it. All done.&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;If you want to read, why, please go on.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;If you open the file: /rt-4.2.1/share/html/Elements/EditCustomFields&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And read line 63: % my $default = $m-&amp;gt;notes(&amp;#039;Field-&amp;#039; . $CustomField-&amp;gt;Id);&lt;br /&gt;
&lt;br /&gt;
What that does, is to use a [http://search.cpan.org/~jswartz/HTML-Mason-1.54/lib/HTML/Mason/Request.pm mson key value store] , for the duration of the request. &lt;br /&gt;
&lt;br /&gt;
Now read line: 95: $m-&amp;gt;callback( %ARGS, CallbackName =&amp;gt; &amp;#039;MassageCustomFields&amp;#039;, $CustomFields =&amp;gt; $CustomFields );&lt;br /&gt;
&lt;br /&gt;
Since this line is inside the init block, you now have a clear path as to inject default values, to all your custom fields, with your own custom logic.&lt;br /&gt;
&lt;br /&gt;
Just write that callback with your (company) hearts desire.&lt;br /&gt;
&lt;br /&gt;
So in truth, RT is already trying to check for already existing defaults values, in the mason key store. &lt;br /&gt;
&lt;br /&gt;
And since its a simple key store, you can inject values there from wherever. &lt;br /&gt;
&lt;br /&gt;
But good practices to keep RT clean, tell me, to use the callback that comes with it.&lt;br /&gt;
==Another way==&lt;br /&gt;
Use this scrip to set some [[CustomField]] to some value by default.&lt;br /&gt;
&lt;br /&gt;
Note: Default values &amp;#039;&amp;#039;&amp;#039;do not&amp;#039;&amp;#039;&amp;#039; show up at edit time. You need to post the request to see the default values.&lt;br /&gt;
&lt;br /&gt;
Scrip can work with any condition(transaction), but some conditions make more sense then other:&lt;br /&gt;
&lt;br /&gt;
* On Create - use it if you want default only when people create tickets&lt;br /&gt;
* On Any Transaction - deprecates &amp;amp;lt;no value&amp;amp;gt; at all for particular CF, because when people set CF to &amp;amp;lt;no value&amp;amp;gt; and submit changes than scrip automatically would change value to default.&lt;br /&gt;
&lt;br /&gt;
 Description: Set &amp;amp;lt;CF name&amp;amp;gt; to &amp;amp;lt;XXX&amp;amp;gt; by default&lt;br /&gt;
 Action: User defined&lt;br /&gt;
 Custom action preparation code: return 1;&lt;br /&gt;
 Custom action cleanup code:&lt;br /&gt;
   my $CFName = &amp;#039;myCF&amp;#039;;&lt;br /&gt;
   my $DefaultValue = &amp;#039;myDefValue&amp;#039;;&lt;br /&gt;
   my $RecTransaction = 1;&lt;br /&gt;
 &lt;br /&gt;
   my $QueueObj = $self-&amp;amp;gt;TicketObj-&amp;amp;gt;QueueObj;&lt;br /&gt;
   my $CFObj = RT::CustomField-&amp;amp;gt;new( $QueueObj-&amp;amp;gt;CurrentUser );&lt;br /&gt;
   $CFObj-&amp;amp;gt;LoadByNameAndQueue( Name =&amp;amp;gt; $CFName, Queue =&amp;amp;gt; $QueueObj-&amp;amp;gt;id );&lt;br /&gt;
   unless( $CFObj-&amp;amp;gt;id ) {&lt;br /&gt;
     $CFObj-&amp;amp;gt;LoadByNameAndQueue( Name =&amp;amp;gt; $CFName, Queue =&amp;amp;gt; 0 );&lt;br /&gt;
     unless( $CFObj-&amp;amp;gt;id ) {&lt;br /&gt;
       $RT::Logger-&amp;amp;gt;warning(&amp;quot;custom field &amp;#039;$CFName&amp;#039; isn&amp;#039;t global or defined for queue &amp;#039;&amp;quot;. $QueueObj-&amp;amp;gt;Name .&amp;quot;&amp;#039;&amp;quot;);&lt;br /&gt;
       return undef;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   unless( $self-&amp;amp;gt;TicketObj-&amp;amp;gt;FirstCustomFieldValue( $CFObj-&amp;amp;gt;id ) ) {&lt;br /&gt;
     my( $st, $msg ) = $self-&amp;amp;gt;TicketObj-&amp;amp;gt;AddCustomFieldValue(&lt;br /&gt;
                                           Field =&amp;amp;gt; $CFObj-&amp;amp;gt;id,&lt;br /&gt;
                                           Value =&amp;amp;gt; $DefaultValue,&lt;br /&gt;
                                           RecordTransaction =&amp;amp;gt; $RecTransaction );&lt;br /&gt;
     unless( $st ) {&lt;br /&gt;
       $RT::Logger-&amp;amp;gt;warning( &amp;quot;Couldn&amp;#039;t set $DefaultValue as value for CF $CFName:&amp;quot;. $msg );&lt;br /&gt;
       return undef;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
   return 1;&lt;br /&gt;
 Template: Global template: Blank&lt;br /&gt;
&lt;br /&gt;
If you&amp;#039;d like to set deafults for a lot of [[CFs]]:&lt;br /&gt;
&lt;br /&gt;
 my %hash = (&lt;br /&gt;
        CF_fu =&amp;amp;gt; &amp;#039;default for CF_fu&amp;#039;,&lt;br /&gt;
        CF_baar =&amp;amp;gt; &amp;#039;default for CF_baar&amp;#039;,&lt;br /&gt;
        CF_City =&amp;amp;gt; &amp;#039;Alsobelatelep&amp;#039;,&lt;br /&gt;
 );&lt;br /&gt;
 &lt;br /&gt;
 while ( my ($CFName , $DefaultValue ) = each(%hash) ) {&lt;br /&gt;
 &lt;br /&gt;
  my $RecTransaction = 1;&lt;br /&gt;
 &lt;br /&gt;
  my $QueueObj = $self-&amp;amp;gt;TicketObj-&amp;amp;gt;QueueObj;&lt;br /&gt;
  my $CFObj = RT::CustomField-&amp;amp;gt;new( $QueueObj-&amp;amp;gt;CurrentUser );&lt;br /&gt;
  $CFObj-&amp;amp;gt;LoadByNameAndQueue( Name =&amp;amp;gt; $CFName, Queue =&amp;amp;gt; $QueueObj-&amp;amp;gt;id );&lt;br /&gt;
  unless( $CFObj-&amp;amp;gt;id ) {&lt;br /&gt;
    $CFObj-&amp;amp;gt;LoadByNameAndQueue( Name =&amp;amp;gt; $CFName, Queue =&amp;amp;gt; 0 );&lt;br /&gt;
    unless( $CFObj-&amp;amp;gt;id ) {&lt;br /&gt;
      $RT::Logger-&amp;amp;gt;warning(&amp;quot;custom field &amp;#039;$CFName&amp;#039; isn&amp;#039;t global or defined for queue &amp;#039;&amp;quot;. $QueueObj-&amp;amp;gt;Name .&amp;quot;&amp;#039;&amp;quot;);&lt;br /&gt;
      return undef;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  unless( $self-&amp;amp;gt;TicketObj-&amp;amp;gt;FirstCustomFieldValue( $CFObj-&amp;amp;gt;id ) ) {&lt;br /&gt;
    my( $st, $msg ) = $self-&amp;amp;gt;TicketObj-&amp;amp;gt;AddCustomFieldValue(&lt;br /&gt;
                                          Field =&amp;amp;gt; $CFObj-&amp;amp;gt;id,&lt;br /&gt;
                                          Value =&amp;amp;gt; $DefaultValue,&lt;br /&gt;
                                          RecordTransaction =&amp;amp;gt; $RecTransaction );&lt;br /&gt;
    unless( $st ) {&lt;br /&gt;
      $RT::Logger-&amp;amp;gt;warning( &amp;quot;Couldn&amp;#039;t set $DefaultValue as value for CF $CFName:&amp;quot;. $msg );&lt;br /&gt;
      return undef;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 return 1;&lt;br /&gt;
&lt;br /&gt;
== Simpler/Modern form ==&lt;br /&gt;
&lt;br /&gt;
Queue doesn&amp;#039;t seem to include [[CurrentUser]] (in modern [[RTs]]), so here&amp;#039;s a working action variant:&lt;br /&gt;
&lt;br /&gt;
 my $CFName = &amp;#039;myCF&amp;#039;;&lt;br /&gt;
 my $DefaultValue = &amp;#039;myDefValue&amp;#039;;&lt;br /&gt;
 my $RecTransaction = 1;&lt;br /&gt;
 &lt;br /&gt;
 unless( $self-&amp;amp;gt;TicketObj-&amp;amp;gt;FirstCustomFieldValue( $CFName ) ) {&lt;br /&gt;
   my( $st, $msg ) = $self-&amp;amp;gt;TicketObj-&amp;amp;gt;AddCustomFieldValue(&lt;br /&gt;
                                         Field =&amp;amp;gt; $CFName,&lt;br /&gt;
                                         Value =&amp;amp;gt; $DefaultValue,&lt;br /&gt;
                                         RecordTransaction =&amp;amp;gt; $RecTransaction );&lt;br /&gt;
   unless( $st ) {&lt;br /&gt;
     $RT::Logger-&amp;amp;gt;warning( &amp;quot;Couldn&amp;#039;t set $DefaultValue as value for CF $CFName:&amp;quot;. $msg );&lt;br /&gt;
     return undef;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 return 1;&lt;br /&gt;
&lt;br /&gt;
== Yet another way ==&lt;br /&gt;
Defaults that do show up at edit time and are set to the values picked in the last ticket created by this user.&lt;br /&gt;
*Use a specific keyword in the description of the customfields that you want memorized (e.g. &amp;quot;default&amp;quot;)&lt;br /&gt;
*Create a scrip as follows:&lt;br /&gt;
&lt;br /&gt;
 Description: On Create set custom field defaults&lt;br /&gt;
 Condition: On Create&lt;br /&gt;
 Action: User defined&lt;br /&gt;
 Custom action preparation code: return 1;&lt;br /&gt;
 Custom action cleanup code:&lt;br /&gt;
 &lt;br /&gt;
 #capture chosen values for custom fields in an attribute called &amp;quot;cf_defaults&amp;quot;&lt;br /&gt;
 # we get them in a hash of the form {customfield_id =&amp;gt; [one or more values]}&lt;br /&gt;
 &lt;br /&gt;
 my %cache;&lt;br /&gt;
 my $ticket = $self-&amp;gt;TicketObj;&lt;br /&gt;
 my $CustomFields = $ticket-&amp;gt;QueueObj-&amp;gt;TicketCustomFields();&lt;br /&gt;
 while (my $CustomField = $CustomFields-&amp;gt;Next()) {&lt;br /&gt;
    my $cfid = $CustomField-&amp;gt;Id;&lt;br /&gt;
    # only those that contain &amp;quot;default&amp;quot; in the description, all the others&lt;br /&gt;
    # won&amp;#039;t save defaults:&lt;br /&gt;
    next unless $CustomField-&amp;gt;Description =~ /default/i;&lt;br /&gt;
    my $vals = $ticket-&amp;gt;CustomFieldValues($cfid);&lt;br /&gt;
    while (my $cfval = $vals-&amp;gt;Next){&lt;br /&gt;
      push @{$cache{$cfid}}, $cfval-&amp;gt;Content;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 # finished populating %cache&lt;br /&gt;
 &lt;br /&gt;
 my $user = $self-&amp;gt;TransactionObj-&amp;gt;CreatorObj; &lt;br /&gt;
 &lt;br /&gt;
 if ( my $attr = ($user-&amp;gt;Attributes-&amp;gt;Named(&amp;#039;cf_defaults&amp;#039;))[0]){&lt;br /&gt;
     # I don&amp;#039;t want to touch the database if nothing&amp;#039;s been changed&lt;br /&gt;
     # so I need to compare %cache with the actual content&lt;br /&gt;
     require Storable; &lt;br /&gt;
     local $Storable::canonical = 1;&lt;br /&gt;
     if ( Storable::freeze(\%cache) ne Storable::freeze($attr-&amp;gt;Content) ){&lt;br /&gt;
         $attr-&amp;gt;SetContent(\%cache);&lt;br /&gt;
     }&lt;br /&gt;
 } else {&lt;br /&gt;
     $user-&amp;gt;AddAttribute( Name =&amp;gt; &amp;quot;cf_defaults&amp;quot;, Content =&amp;gt; \%cache);&lt;br /&gt;
 }&lt;br /&gt;
 return 1;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Copy .../share/html/Ticket/Elements/EditCustomFields to ../local/htmlTicket/Elements/EditCustomFields. Edit the copy and replace this:&lt;br /&gt;
 &amp;lt;%INIT&amp;gt;&lt;br /&gt;
 my $CustomFields;&lt;br /&gt;
 &lt;br /&gt;
 if ($TicketObj &amp;amp;&amp;amp; !$OnCreate) {&lt;br /&gt;
     $CustomFields = $TicketObj-&amp;gt;CustomFields();&lt;br /&gt;
     $NamePrefix .= &amp;quot;Object-RT::Ticket-&amp;quot;.$TicketObj-&amp;gt;Id.&amp;quot;-CustomField-&amp;quot;;&lt;br /&gt;
 } else {&lt;br /&gt;
     $CustomFields = $QueueObj-&amp;gt;TicketCustomFields();&lt;br /&gt;
     $NamePrefix .= &amp;quot;Object-RT::Ticket--CustomField-&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
with this:&lt;br /&gt;
 &amp;lt;%INIT&amp;gt;&lt;br /&gt;
 my $CustomFields;&lt;br /&gt;
 &lt;br /&gt;
 if ($TicketObj &amp;amp;&amp;amp; !$OnCreate) {&lt;br /&gt;
     $CustomFields = $TicketObj-&amp;gt;CustomFields();&lt;br /&gt;
     $NamePrefix .= &amp;quot;Object-RT::Ticket-&amp;quot;.$TicketObj-&amp;gt;Id.&amp;quot;-CustomField-&amp;quot;;&lt;br /&gt;
 } else {&lt;br /&gt;
     $CustomFields = $QueueObj-&amp;gt;TicketCustomFields();&lt;br /&gt;
     $NamePrefix .= &amp;quot;Object-RT::Ticket--CustomField-&amp;quot;;&lt;br /&gt;
     #Iulian&lt;br /&gt;
     my $me = $session{&amp;#039;CurrentUser&amp;#039;}-&amp;gt;UserObj;&lt;br /&gt;
     if(my $attr = ($me-&amp;gt;Attributes-&amp;gt;Named(&amp;#039;cf_defaults&amp;#039;))[0]){&lt;br /&gt;
       foreach my $cfid (keys %{$attr-&amp;gt;Content}){&lt;br /&gt;
         my @vals = @{$attr-&amp;gt;Content-&amp;gt;{$cfid}};&lt;br /&gt;
         $ARGS{&amp;quot;CustomField-&amp;quot;. $cfid } = @vals == 1 ? $vals[0] : \@vals;&lt;br /&gt;
       }&lt;br /&gt;
      }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now RT will remember the last chosen customfield values for every user.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://rt-wiki.bestpractical.com/index.php?title=DefaultCustomFieldValue&amp;diff=901&amp;oldid=prev</id>
		<title>193.1.228.82 at 11:23, 20 February 2014</title>
		<link rel="alternate" type="text/html" href="https://rt-wiki.bestpractical.com/index.php?title=DefaultCustomFieldValue&amp;diff=901&amp;oldid=prev"/>
		<updated>2014-02-20T11:23:00Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;It is possible to have custom fields with default values showing up at edit time.&lt;br /&gt;
&lt;br /&gt;
This example assumes you are using select lists.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;First you need to add a callback.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
#Create the follow directory structure: &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;local/html/Callbacks/CustomFieldDefaultValues/Elements/EditCustomFields&amp;lt;/span&amp;gt;&lt;br /&gt;
#&amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;Inside, create the file: MassageCustomFields&amp;lt;/span&amp;gt;&lt;br /&gt;
#&amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;Add the following code to the file:&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;&amp;lt;%init&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 unless ($CustomFields) {&lt;br /&gt;
 &lt;br /&gt;
     return 1;&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 while (my $customField = $CustomFields-&amp;gt;Next) {&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     my $id          = $customField-&amp;gt;Id;&lt;br /&gt;
 &lt;br /&gt;
     my $key         = &amp;#039;Field-&amp;#039;. $id;&lt;br /&gt;
 &lt;br /&gt;
     my $cf_values   =  $customField-&amp;gt;ValuesClass;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     ( my $requireName = $cf_values . &amp;quot;.pm&amp;quot; ) =~ s{::}{/}g;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     require $requireName;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     if ($cf_values-&amp;gt;can(&amp;#039;DefaultValue&amp;#039;)) {&lt;br /&gt;
 &lt;br /&gt;
         $m-&amp;gt;notes($key, $cf_values-&amp;gt;DefaultValue());&lt;br /&gt;
 &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/%init&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;%ARGS&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
     $CustomFields =&amp;gt; undef&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/%ARGS&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;Second, you need to go to the custom fields values class, and add the method that will return the default value.&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
An example:&lt;br /&gt;
 package RT::CustomFieldValues::CUSTOM_FIELD_NAME;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 use strict;&lt;br /&gt;
 &lt;br /&gt;
 use warnings;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 use base qw(RT::CustomFieldValues::External);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 sub SourceDescription {&lt;br /&gt;
 &lt;br /&gt;
     return &amp;#039;Ticket distribution (public/private)&amp;#039;;&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 sub ExternalValues {&lt;br /&gt;
 &lt;br /&gt;
     return [&lt;br /&gt;
 &lt;br /&gt;
         {&lt;br /&gt;
 &lt;br /&gt;
             name        =&amp;gt; &amp;quot;private&amp;quot;,&lt;br /&gt;
 &lt;br /&gt;
             description =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
 &lt;br /&gt;
             sortorder   =&amp;gt; 0&lt;br /&gt;
 &lt;br /&gt;
         },&lt;br /&gt;
 &lt;br /&gt;
         {&lt;br /&gt;
 &lt;br /&gt;
             name        =&amp;gt; &amp;quot;public&amp;quot;,&lt;br /&gt;
 &lt;br /&gt;
             description =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
 &lt;br /&gt;
             sortorder   =&amp;gt; 1&lt;br /&gt;
 &lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
     ];&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 sub DefaultValue {&lt;br /&gt;
 &lt;br /&gt;
     return &amp;quot;private&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 1;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;And thats it. All done.&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;If you want to read, why, please go on.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size:14px;&amp;quot;&amp;gt;If you open the file: /rt-4.2.1/share/html/Elements/EditCustomFields&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And read line 63: % my $default = $m-&amp;gt;notes(&amp;#039;Field-&amp;#039; . $CustomField-&amp;gt;Id);&lt;br /&gt;
&lt;br /&gt;
What that does, is to use a mson key value store, for the duration of the request. &lt;br /&gt;
&lt;br /&gt;
Now read line: 95: $m-&amp;gt;callback( %ARGS, CallbackName =&amp;gt; &amp;#039;MassageCustomFields&amp;#039;, $CustomFields =&amp;gt; $CustomFields );&lt;br /&gt;
&lt;br /&gt;
Since this line is inside the init block, you now have a clear path as to inject default values, to all your custom fields, with your own custom logic.&lt;br /&gt;
&lt;br /&gt;
Just write that callback with your (company) hearts deside.&lt;br /&gt;
&lt;br /&gt;
So in truth, RT is already trying to check for already existing defaults values, in the mason key store. &lt;br /&gt;
&lt;br /&gt;
And since its a simple key store, you can inject values there from wherever. &lt;br /&gt;
&lt;br /&gt;
But good practices to keep RT clean, tell me, to use the callback that comes with it.&lt;br /&gt;
==Another way==&lt;br /&gt;
Use this scrip to set some [[CustomField]] to some value by default.&lt;br /&gt;
&lt;br /&gt;
Note: Default values &amp;#039;&amp;#039;&amp;#039;do not&amp;#039;&amp;#039;&amp;#039; show up at edit time. You need to post the request to see the default values.&lt;br /&gt;
&lt;br /&gt;
Scrip can work with any condition(transaction), but some conditions make more sense then other:&lt;br /&gt;
&lt;br /&gt;
* On Create - use it if you want default only when people create tickets&lt;br /&gt;
* On Any Transaction - deprecates &amp;amp;lt;no value&amp;amp;gt; at all for particular CF, because when people set CF to &amp;amp;lt;no value&amp;amp;gt; and submit changes than scrip automatically would change value to default.&lt;br /&gt;
&lt;br /&gt;
 Description: Set &amp;amp;lt;CF name&amp;amp;gt; to &amp;amp;lt;XXX&amp;amp;gt; by default&lt;br /&gt;
 Action: User defined&lt;br /&gt;
 Custom action preparation code: return 1;&lt;br /&gt;
 Custom action cleanup code:&lt;br /&gt;
   my $CFName = &amp;#039;myCF&amp;#039;;&lt;br /&gt;
   my $DefaultValue = &amp;#039;myDefValue&amp;#039;;&lt;br /&gt;
   my $RecTransaction = 1;&lt;br /&gt;
 &lt;br /&gt;
   my $QueueObj = $self-&amp;amp;gt;TicketObj-&amp;amp;gt;QueueObj;&lt;br /&gt;
   my $CFObj = RT::CustomField-&amp;amp;gt;new( $QueueObj-&amp;amp;gt;CurrentUser );&lt;br /&gt;
   $CFObj-&amp;amp;gt;LoadByNameAndQueue( Name =&amp;amp;gt; $CFName, Queue =&amp;amp;gt; $QueueObj-&amp;amp;gt;id );&lt;br /&gt;
   unless( $CFObj-&amp;amp;gt;id ) {&lt;br /&gt;
     $CFObj-&amp;amp;gt;LoadByNameAndQueue( Name =&amp;amp;gt; $CFName, Queue =&amp;amp;gt; 0 );&lt;br /&gt;
     unless( $CFObj-&amp;amp;gt;id ) {&lt;br /&gt;
       $RT::Logger-&amp;amp;gt;warning(&amp;quot;custom field &amp;#039;$CFName&amp;#039; isn&amp;#039;t global or defined for queue &amp;#039;&amp;quot;. $QueueObj-&amp;amp;gt;Name .&amp;quot;&amp;#039;&amp;quot;);&lt;br /&gt;
       return undef;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   unless( $self-&amp;amp;gt;TicketObj-&amp;amp;gt;FirstCustomFieldValue( $CFObj-&amp;amp;gt;id ) ) {&lt;br /&gt;
     my( $st, $msg ) = $self-&amp;amp;gt;TicketObj-&amp;amp;gt;AddCustomFieldValue(&lt;br /&gt;
                                           Field =&amp;amp;gt; $CFObj-&amp;amp;gt;id,&lt;br /&gt;
                                           Value =&amp;amp;gt; $DefaultValue,&lt;br /&gt;
                                           RecordTransaction =&amp;amp;gt; $RecTransaction );&lt;br /&gt;
     unless( $st ) {&lt;br /&gt;
       $RT::Logger-&amp;amp;gt;warning( &amp;quot;Couldn&amp;#039;t set $DefaultValue as value for CF $CFName:&amp;quot;. $msg );&lt;br /&gt;
       return undef;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
   return 1;&lt;br /&gt;
 Template: Global template: Blank&lt;br /&gt;
&lt;br /&gt;
If you&amp;#039;d like to set deafults for a lot of [[CFs]]:&lt;br /&gt;
&lt;br /&gt;
 my %hash = (&lt;br /&gt;
        CF_fu =&amp;amp;gt; &amp;#039;default for CF_fu&amp;#039;,&lt;br /&gt;
        CF_baar =&amp;amp;gt; &amp;#039;default for CF_baar&amp;#039;,&lt;br /&gt;
        CF_City =&amp;amp;gt; &amp;#039;Alsobelatelep&amp;#039;,&lt;br /&gt;
 );&lt;br /&gt;
 &lt;br /&gt;
 while ( my ($CFName , $DefaultValue ) = each(%hash) ) {&lt;br /&gt;
 &lt;br /&gt;
  my $RecTransaction = 1;&lt;br /&gt;
 &lt;br /&gt;
  my $QueueObj = $self-&amp;amp;gt;TicketObj-&amp;amp;gt;QueueObj;&lt;br /&gt;
  my $CFObj = RT::CustomField-&amp;amp;gt;new( $QueueObj-&amp;amp;gt;CurrentUser );&lt;br /&gt;
  $CFObj-&amp;amp;gt;LoadByNameAndQueue( Name =&amp;amp;gt; $CFName, Queue =&amp;amp;gt; $QueueObj-&amp;amp;gt;id );&lt;br /&gt;
  unless( $CFObj-&amp;amp;gt;id ) {&lt;br /&gt;
    $CFObj-&amp;amp;gt;LoadByNameAndQueue( Name =&amp;amp;gt; $CFName, Queue =&amp;amp;gt; 0 );&lt;br /&gt;
    unless( $CFObj-&amp;amp;gt;id ) {&lt;br /&gt;
      $RT::Logger-&amp;amp;gt;warning(&amp;quot;custom field &amp;#039;$CFName&amp;#039; isn&amp;#039;t global or defined for queue &amp;#039;&amp;quot;. $QueueObj-&amp;amp;gt;Name .&amp;quot;&amp;#039;&amp;quot;);&lt;br /&gt;
      return undef;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  unless( $self-&amp;amp;gt;TicketObj-&amp;amp;gt;FirstCustomFieldValue( $CFObj-&amp;amp;gt;id ) ) {&lt;br /&gt;
    my( $st, $msg ) = $self-&amp;amp;gt;TicketObj-&amp;amp;gt;AddCustomFieldValue(&lt;br /&gt;
                                          Field =&amp;amp;gt; $CFObj-&amp;amp;gt;id,&lt;br /&gt;
                                          Value =&amp;amp;gt; $DefaultValue,&lt;br /&gt;
                                          RecordTransaction =&amp;amp;gt; $RecTransaction );&lt;br /&gt;
    unless( $st ) {&lt;br /&gt;
      $RT::Logger-&amp;amp;gt;warning( &amp;quot;Couldn&amp;#039;t set $DefaultValue as value for CF $CFName:&amp;quot;. $msg );&lt;br /&gt;
      return undef;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 return 1;&lt;br /&gt;
&lt;br /&gt;
== Simpler/Modern form ==&lt;br /&gt;
&lt;br /&gt;
Queue doesn&amp;#039;t seem to include [[CurrentUser]] (in modern [[RTs]]), so here&amp;#039;s a working action variant:&lt;br /&gt;
&lt;br /&gt;
 my $CFName = &amp;#039;myCF&amp;#039;;&lt;br /&gt;
 my $DefaultValue = &amp;#039;myDefValue&amp;#039;;&lt;br /&gt;
 my $RecTransaction = 1;&lt;br /&gt;
 &lt;br /&gt;
 unless( $self-&amp;amp;gt;TicketObj-&amp;amp;gt;FirstCustomFieldValue( $CFName ) ) {&lt;br /&gt;
   my( $st, $msg ) = $self-&amp;amp;gt;TicketObj-&amp;amp;gt;AddCustomFieldValue(&lt;br /&gt;
                                         Field =&amp;amp;gt; $CFName,&lt;br /&gt;
                                         Value =&amp;amp;gt; $DefaultValue,&lt;br /&gt;
                                         RecordTransaction =&amp;amp;gt; $RecTransaction );&lt;br /&gt;
   unless( $st ) {&lt;br /&gt;
     $RT::Logger-&amp;amp;gt;warning( &amp;quot;Couldn&amp;#039;t set $DefaultValue as value for CF $CFName:&amp;quot;. $msg );&lt;br /&gt;
     return undef;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 return 1;&lt;br /&gt;
&lt;br /&gt;
== Yet another way ==&lt;br /&gt;
Defaults that do show up at edit time and are set to the values picked in the last ticket created by this user.&lt;br /&gt;
*Use a specific keyword in the description of the customfields that you want memorized (e.g. &amp;quot;default&amp;quot;)&lt;br /&gt;
*Create a scrip as follows:&lt;br /&gt;
&lt;br /&gt;
 Description: On Create set custom field defaults&lt;br /&gt;
 Condition: On Create&lt;br /&gt;
 Action: User defined&lt;br /&gt;
 Custom action preparation code: return 1;&lt;br /&gt;
 Custom action cleanup code:&lt;br /&gt;
 &lt;br /&gt;
 #capture chosen values for custom fields in an attribute called &amp;quot;cf_defaults&amp;quot;&lt;br /&gt;
 # we get them in a hash of the form {customfield_id =&amp;gt; [one or more values]}&lt;br /&gt;
 &lt;br /&gt;
 my %cache;&lt;br /&gt;
 my $ticket = $self-&amp;gt;TicketObj;&lt;br /&gt;
 my $CustomFields = $ticket-&amp;gt;QueueObj-&amp;gt;TicketCustomFields();&lt;br /&gt;
 while (my $CustomField = $CustomFields-&amp;gt;Next()) {&lt;br /&gt;
    my $cfid = $CustomField-&amp;gt;Id;&lt;br /&gt;
    # only those that contain &amp;quot;default&amp;quot; in the description, all the others&lt;br /&gt;
    # won&amp;#039;t save defaults:&lt;br /&gt;
    next unless $CustomField-&amp;gt;Description =~ /default/i;&lt;br /&gt;
    my $vals = $ticket-&amp;gt;CustomFieldValues($cfid);&lt;br /&gt;
    while (my $cfval = $vals-&amp;gt;Next){&lt;br /&gt;
      push @{$cache{$cfid}}, $cfval-&amp;gt;Content;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 # finished populating %cache&lt;br /&gt;
 &lt;br /&gt;
 my $user = $self-&amp;gt;TransactionObj-&amp;gt;CreatorObj; &lt;br /&gt;
 &lt;br /&gt;
 if ( my $attr = ($user-&amp;gt;Attributes-&amp;gt;Named(&amp;#039;cf_defaults&amp;#039;))[0]){&lt;br /&gt;
     # I don&amp;#039;t want to touch the database if nothing&amp;#039;s been changed&lt;br /&gt;
     # so I need to compare %cache with the actual content&lt;br /&gt;
     require Storable; &lt;br /&gt;
     local $Storable::canonical = 1;&lt;br /&gt;
     if ( Storable::freeze(\%cache) ne Storable::freeze($attr-&amp;gt;Content) ){&lt;br /&gt;
         $attr-&amp;gt;SetContent(\%cache);&lt;br /&gt;
     }&lt;br /&gt;
 } else {&lt;br /&gt;
     $user-&amp;gt;AddAttribute( Name =&amp;gt; &amp;quot;cf_defaults&amp;quot;, Content =&amp;gt; \%cache);&lt;br /&gt;
 }&lt;br /&gt;
 return 1;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Copy .../share/html/Ticket/Elements/EditCustomFields to ../local/htmlTicket/Elements/EditCustomFields. Edit the copy and replace this:&lt;br /&gt;
 &amp;lt;%INIT&amp;gt;&lt;br /&gt;
 my $CustomFields;&lt;br /&gt;
 &lt;br /&gt;
 if ($TicketObj &amp;amp;&amp;amp; !$OnCreate) {&lt;br /&gt;
     $CustomFields = $TicketObj-&amp;gt;CustomFields();&lt;br /&gt;
     $NamePrefix .= &amp;quot;Object-RT::Ticket-&amp;quot;.$TicketObj-&amp;gt;Id.&amp;quot;-CustomField-&amp;quot;;&lt;br /&gt;
 } else {&lt;br /&gt;
     $CustomFields = $QueueObj-&amp;gt;TicketCustomFields();&lt;br /&gt;
     $NamePrefix .= &amp;quot;Object-RT::Ticket--CustomField-&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
with this:&lt;br /&gt;
 &amp;lt;%INIT&amp;gt;&lt;br /&gt;
 my $CustomFields;&lt;br /&gt;
 &lt;br /&gt;
 if ($TicketObj &amp;amp;&amp;amp; !$OnCreate) {&lt;br /&gt;
     $CustomFields = $TicketObj-&amp;gt;CustomFields();&lt;br /&gt;
     $NamePrefix .= &amp;quot;Object-RT::Ticket-&amp;quot;.$TicketObj-&amp;gt;Id.&amp;quot;-CustomField-&amp;quot;;&lt;br /&gt;
 } else {&lt;br /&gt;
     $CustomFields = $QueueObj-&amp;gt;TicketCustomFields();&lt;br /&gt;
     $NamePrefix .= &amp;quot;Object-RT::Ticket--CustomField-&amp;quot;;&lt;br /&gt;
     #Iulian&lt;br /&gt;
     my $me = $session{&amp;#039;CurrentUser&amp;#039;}-&amp;gt;UserObj;&lt;br /&gt;
     if(my $attr = ($me-&amp;gt;Attributes-&amp;gt;Named(&amp;#039;cf_defaults&amp;#039;))[0]){&lt;br /&gt;
       foreach my $cfid (keys %{$attr-&amp;gt;Content}){&lt;br /&gt;
         my @vals = @{$attr-&amp;gt;Content-&amp;gt;{$cfid}};&lt;br /&gt;
         $ARGS{&amp;quot;CustomField-&amp;quot;. $cfid } = @vals == 1 ? $vals[0] : \@vals;&lt;br /&gt;
       }&lt;br /&gt;
      }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now RT will remember the last chosen customfield values for every user.&lt;/div&gt;</summary>
		<author><name>193.1.228.82</name></author>
	</entry>
</feed>