%# BEGIN LICENSE BLOCK %# %# Copyright (c) 2002-2003 Jesse Vincent %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of version 2 of the GNU General Public License %# as published by the Free Software Foundation. %# %# A copy of that license should have arrived with this %# software, but in any event can be snarfed from www.gnu.org. %# %# This program is distributed in the hope that it will be useful, %# but WITHOUT ANY WARRANTY; without even the implied warranty of %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %# GNU General Public License for more details. %# %# END LICENSE BLOCK <& /RTFM/Article/Elements/Tabs, Article => $ArticleObj, current_subtab => "RTFM/Article/Edit.html?id=".$ArticleObj->Id , id => $id, Title => $title &> <& /Elements/ListActions, actions => \@results &>
<& Elements/EditBasics, ArticleObj => $ArticleObj &> <& Elements/EditCustomFields, ArticleObj => $ArticleObj &> <& Elements/EditLinks, ArticleObj => $ArticleObj &> <& /Elements/Submit, Label => loc('Save Changes'), Caption => loc("If you've updated anything above, be sure to"), color => "#993333" &>
<%INIT> my @results; my $Entries = {}; my $ArticleObj = RT::FM::Article->new( $session{'CurrentUser'} ); my %create_args; if ($id eq 'new') { if ($ARGS{'RefersTo-new'} ) { @{$create_args{'RefersTo-new'}} = split(/\s+/, $ARGS{'RefersTo-new'}); } if ($ARGS{'new-RefersTo'} ) { @{$create_args{'new-RefersTo'}} = split(/\s+/, $ARGS{'new-RefersTo'}); } foreach my $arg (keys %ARGS) { if ($arg =~ /^CustomField-(.*)$/) { $create_args{$arg} = $ARGS{$arg}; } } my $msg; ($id, $msg) = $ArticleObj->Create ( Summary => $ARGS{'Summary'}, Name => $ARGS{'Name'}, Class => $ARGS{'Class'}, %create_args); push (@results, $msg); } else { $ArticleObj->Load($id); unless ( $ArticleObj->id ) { $m->comp("/RTFM/Elements/Error", Why => loc("Unable to load article") ); } my @attribs = qw(Name Summary Class); @results = UpdateRecordObject( AttributesRef => \@attribs, Object => $ArticleObj, ARGSRef => \%ARGS ); my $CustomFields = $ArticleObj->ClassObj->CustomFields(); # Build up a list of articles that we want to work with my %articles_to_mod; my %custom_fields_to_mod; foreach my $arg ( keys %ARGS ) { if ( $arg =~ /^Article-(\d+)-CustomField-(\d+)-/ ) { # For each of those articles, find out what custom fields we want to work with. $custom_fields_to_mod{$1}{$2} = 1; } } # For each of those Articles foreach my $article ( keys %custom_fields_to_mod ) { my $Article = RT::FM::Article->new( $session{'CurrentUser'} ); $Article->Load($article); # For each custom field foreach my $cf ( keys %{ $custom_fields_to_mod{$article} } ) { foreach my $arg ( keys %ARGS ) { next unless ( $arg =~ /^Article-$article-CustomField-$cf-/ ); my @tempvalues = ( ref( $ARGS{$arg} ) eq 'ARRAY' ) ? @{ $ARGS{$arg} } : ( $ARGS{$arg} ); # clobber those newlines into something vaguely standard # that ||1 means that if it doesn't match newline, still add it my @values = grep { $_ =~ s/\r\n|\n\r|\n|\r/\n/g || 1} @tempvalues; chomp(@values); if ( ( $arg =~ /-AddValue$/ ) || ( $arg =~ /-Value$/ ) ) { my $cf_values = $Article->CustomFieldValues($cf); foreach my $value (@values) { next unless ($value); unless ( $cf_values->HasEntryWithContent($value) ) { my ( $val, $msg ) = $Article->AddCustomFieldValue( Field => $cf, Content => $value ); push ( @results, $msg ); } } } elsif ( $arg =~ /-DeleteValues$/ ) { foreach my $value (@values) { next unless ($value); my ( $val, $msg ) = $Article->DeleteCustomFieldValue( Field => $cf, Content => $value ); push ( @results, $msg ); } } elsif ( $arg =~ /-Values$/ ) { my $cf_values = $Article->CustomFieldValues($cf); my %values_hash; foreach my $value (@values) { next unless ($value); # build up a hash of values that the new set has $values_hash{$value} = 1; unless ( $cf_values->HasEntryWithContent($value) ) { my ( $val, $msg ) = $Article->AddCustomFieldValue( Field => $cf, Content => $value); push ( @results, $msg); } } while ( my $cf_value = $cf_values->Next ) { unless ( $values_hash{ $cf_value->Content } == 1 ) { my ( $val, $msg ) = $Article->DeleteCustomFieldValue( Field => $cf, Content => $cf_value->Content); push ( @results, $msg ); } } } else { push ( @results, "User asked for an unknown update type for custom field " . $cf->Name . " for Article " . $Article->id ); } } } } # Delete links that are gone gone gone. foreach my $arg ( keys %ARGS ) { if ( $arg =~ /DeleteLink-(.*?)-(RefersTo|MemberOf|RefersTo)-(.*)$/ ) { my $base = $1; my $type = $2; my $target = $3; my ( $val, $msg ) = $ArticleObj->DeleteLink( Base => $base, Type => $type, Target => $target); push @results, $msg; } } my @linktypes = qw(DependsOn MemberOf RefersTo ); foreach my $linktype (@linktypes) { for my $luri ( split ( / /, $ARGS{ $ArticleObj->Id . "-$linktype" } ) ) { $luri =~ s/\s*$//; # Strip trailing whitespace my ( $val, $msg ) = $ArticleObj->AddLink( Target => $luri, Type => $linktype); push @results, $msg; } for my $luri ( split ( / /, $ARGS{ "$linktype-" . $ArticleObj->Id } ) ) { my ( $val, $msg ) = $ArticleObj->AddLink( Base => $luri, Type => $linktype); push @results, $msg; } } } # TODO: display the results, even if we can't display the Article unless ( $ArticleObj->CurrentUserHasRight('ShowArticle') ) { $m->comp("/RTFM/Elements/Error", Why => "No permission to view Article"); } my $title = loc('Modify article #[_1]', $ArticleObj->Id); <%ARGS> $id => undef