diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index 2460745bb..5785b2eac 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -13,6 +13,7 @@ - fix: EMS edit badge event list can display incorrectly in IE - fix: Expired SessionScratch not deleted (thanks to Michelle Lamar) http://www.plainblack.com/bugs/tracker/expired-sessionscratch-not-deleted +- fix: Bad import of help template variables from other topics. (perlDreamer Consulting, LLC.) 7.4.12 - fix: extra empty/grey area at the bottom of pages diff --git a/lib/WebGUI/Operation/Help.pm b/lib/WebGUI/Operation/Help.pm index 6757dac37..765deeec8 100644 --- a/lib/WebGUI/Operation/Help.pm +++ b/lib/WebGUI/Operation/Help.pm @@ -57,9 +57,33 @@ sub _loadHelp { #------------------------------------------------------------------- +=head2 _processVariables ( $helpVar, $namespace ) + +Recursively descend down any nested template variables and give +them default namespaces. Also, handle copying the variables +entry. + +=cut + +sub _processVar { + my ($helpVar, $namespace) = @_; + my $processed = {}; + $processed->{name} = $helpVar->{name}, + $processed->{description} = $helpVar->{description}, + $processed->{namespace} = $helpVar->{namespace} || $namespace; + if ($helpVar->{variables}) { + foreach my $helpVariable (@{ $helpVar->{variables} }) { + push @{ $processed->{variables} }, _processVar($helpVariable, $namespace); + } + } + return $processed; +} + +#------------------------------------------------------------------- + =head2 _process ( $session, $cmd, $key ) -Do all post processing for an entry in a freshly loaded help file. +Do almost all the post processing for an entry in a freshly loaded help file. Resolve the related key, add a default isa key if it is missing, and set the __PROCESSED flag to prevent processing entries twice. @@ -78,7 +102,7 @@ sub _process { $helpEntry->{__PROCESSED} = 0; } foreach my $isa ( @{ $helpEntry->{isa} } ) { - my $oCmd = "WebGUI::Help::".$isa->{namespace}; + my $oCmd = "WebGUI::Help::".$isa->{namespace}; my $other = _loadHelp($session, $oCmd); my $otherHelp = $other->{ $isa->{tag} }; _process($session, $otherHelp, $isa->{tag}); @@ -88,11 +112,7 @@ sub _process { @{$helpEntry->{related}} = (@{ $helpEntry->{related} }, @{ $add }); $add = $otherHelp->{variables}; foreach my $row (@{$add}) { - push(@{$helpEntry->{variables}}, { - name=> $row->{name}, - description => $row->{description}, - namespace => $row->{namespace} || $isa->{namespace} - }); + push(@{$helpEntry->{variables}}, _processVar($row, $isa->{namespace})); } } $helpEntry->{__PROCESSED} = 1; diff --git a/t/Help/isa.t b/t/Help/isa.t new file mode 100644 index 000000000..de1f11fc2 --- /dev/null +++ b/t/Help/isa.t @@ -0,0 +1,179 @@ +#------------------------------------------------------------------- +# WebGUI is Copyright 2001-2007 Plain Black Corporation. +#------------------------------------------------------------------- +# Please read the legal notices (docs/legal.txt) and the license +# (docs/license.txt) that came with this distribution before using +# this software. +#------------------------------------------------------------------- +# http://www.plainblack.com info@plainblack.com +#------------------------------------------------------------------- + +use FindBin; +use strict; +use lib "$FindBin::Bin/../lib"; + +use WebGUI::Test; +use WebGUI::Session; +use WebGUI::Operation::Help; + +use File::Copy; +use File::Spec; + +#The goal of this test is to verify Help inheritance, via the isa key field. +#isa should bring in related items, form entries and template variables, +#recursively. + +use Test::More; +use Test::Deep; + +my $session = WebGUI::Test->session; + +plan tests => 4; + +installCollateral(); + +my $allHelp = WebGUI::Operation::Help::_load($session, 'HelpTest'); + +cmp_deeply( + $allHelp->{'base one'}, + { + title => 'base one title', + body => 'base one body', + variables => [ + { name => 'base one var1', }, + { name => 'base one var2', }, + { name => 'base one var3', }, + ], + related => [], + fields => [], + isa => [], + __PROCESSED => 1, + }, + 'fetching help with no isa relationships' +); + +cmp_deeply( + $allHelp->{'isa one'}, + { + title => 'isa one title', + body => 'isa one body', + variables => [ + { name => 'isa one var1', }, + { name => 'isa one var2', }, + { name => 'isa one var3', }, + { name => 'base one var1', + description => undef, + namespace => 'HelpTest' + }, + { name => 'base one var2', + description => undef, + namespace => 'HelpTest' + }, + { name => 'base one var3', + description => undef, + namespace => 'HelpTest' + }, + ], + related => [], + fields => [], + isa => [ + { namespace => "HelpTest", + tag => "base one" + }, + ], + __PROCESSED => 1, + }, + 'isa imports variables. Imported variables have explicit description and namespaces' +); + +cmp_deeply( + $allHelp->{'isa loop one'}, + { + title => 'isa loop one title', + body => 'isa loop one body', + variables => [ + { name => 'isa loop one var1', }, + { name => 'loop one var1', + description => undef, + namespace => 'HelpTest', + variables => [ + { name => 'loop one loop1', + description => undef, + namespace => 'HelpTest', + }, + { name => 'loop one loop2', + description => undef, + namespace => 'HelpTest', + }, + ], + }, + { name => 'loop one var2', + description => undef, + namespace => 'HelpTest', + }, + ], + related => [], + fields => [], + isa => [ + { namespace => "HelpTest", + tag => "loop one" + }, + ], + __PROCESSED => 1, + }, + 'isa imports variables with loops' +); + +cmp_deeply( + $allHelp->{'isa deep loop'}, + { + title => 'isa deep loop title', + body => 'isa deep loop body', + variables => [ + { name => 'isa deep loop var1', }, + { name => 'deep loop var1', + description => undef, + namespace => 'HelpTest', + variables => [ + { name => 'deep loop loop2', + description => undef, + namespace => 'HelpTest', + variables => [ + { name => 'deep loop loop3', + description => undef, + namespace => 'HelpTest', + variables => [ + { name => 'deep loop loop4', + description => undef, + namespace => 'HelpTest', + }, + ], + }, + ], + }, + ], + }, + ], + related => [], + fields => [], + isa => [ + { namespace => "HelpTest", + tag => "deep loop" + }, + ], + __PROCESSED => 1, + }, + 'isa imports variables with nested loops' +); + +sub installCollateral { + copy( + File::Spec->catfile( WebGUI::Test->getTestCollateralPath, qw/Help HelpTest.pm/), + File::Spec->catfile( WebGUI::Test->lib, qw/WebGUI Help/) + ); +} + +END: { + unlink File::Spec->catfile(WebGUI::Test->lib, qw/WebGUI Help HelpTest.pm/); +} + diff --git a/t/supporting_collateral/Help/HelpTest.pm b/t/supporting_collateral/Help/HelpTest.pm new file mode 100644 index 000000000..a8455ec06 --- /dev/null +++ b/t/supporting_collateral/Help/HelpTest.pm @@ -0,0 +1,109 @@ +package WebGUI::Help::HelpTest; + +our $HELP = { + + 'base one' => { + title => 'base one title', + body => 'base one body', + variables => [ + { name => 'base one var1', }, + { name => 'base one var2', }, + { name => 'base one var3', }, + ], + fields => [], + related => [] + }, + + 'isa one' => { + title => 'isa one title', + body => 'isa one body', + isa => [ + { namespace => "HelpTest", + tag => "base one" + }, + ], + variables => [ + { name => 'isa one var1', }, + { name => 'isa one var2', }, + { name => 'isa one var3', }, + ], + fields => [], + related => [], + }, + + 'loop one' => { + title => 'loop one title', + body => 'loop one body', + isa => [ + ], + variables => [ + { name => 'loop one var1', + variables => [ + { name => 'loop one loop1', }, + { name => 'loop one loop2', }, + ], + }, + { name => 'loop one var2', }, + ], + fields => [], + related => [], + }, + + 'isa loop one' => { + title => 'isa loop one title', + body => 'isa loop one body', + isa => [ + { namespace => "HelpTest", + tag => "loop one" + }, + ], + variables => [ + { name => 'isa loop one var1', }, + ], + fields => [], + related => [], + }, + + 'deep loop' => { + title => 'deep loop title', + body => 'deep loop body', + isa => [ + ], + variables => [ + { name => 'deep loop var1', + variables => [ + { name => 'deep loop loop2', + variables => [ + { name => 'deep loop loop3', + variables => [ + { name => 'deep loop loop4', + }, + ], + }, + ], + }, + ], + }, + ], + fields => [], + related => [], + }, + + 'isa deep loop' => { + title => 'isa deep loop title', + body => 'isa deep loop body', + isa => [ + { namespace => "HelpTest", + tag => "deep loop" + }, + ], + variables => [ + { name => 'isa deep loop var1', }, + ], + fields => [], + related => [], + }, + +}; + +1;