From 48bbec5c6fe4c906616451a2cd04e915269628ee Mon Sep 17 00:00:00 2001 From: Paul Driver Date: Mon, 24 Jan 2011 09:42:39 -0600 Subject: [PATCH] fixed #12029: issue with keywords --- docs/changelog/7.x.x.txt | 1 + lib/WebGUI/Keyword.pm | 19 ++++++++++++++----- t/Keyword.t | 17 +++++++++++++---- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index 00b302b10..1b15b89c2 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -1,5 +1,6 @@ 7.10.8 - rfe #12016 for the top story as well + - fixed #12029: issue with keywords - fixed #11965: Friend Manager only shows 15 people - fixed #12023: International URLs of aattachments & files in folder - fixed #12024: Copied Collaboration System re-sends subscription mail diff --git a/lib/WebGUI/Keyword.pm b/lib/WebGUI/Keyword.pm index 069b54eae..b1cd2794e 100644 --- a/lib/WebGUI/Keyword.pm +++ b/lib/WebGUI/Keyword.pm @@ -211,11 +211,20 @@ sub generateCloud { [ $options->{startAsset}->get("lineage").'%', @extraPlaceholders, $maxKeywords ]); my $cloud = HTML::TagCloud->new(levels=>$options->{cloudLevels} || 24); while (my ($count, $keyword) = $sth->array) { - my $url - = $urlCallback ? $display->$urlCallback($keyword) - : $options->{displayFunc} ? $display->getUrl("func=".$options->{displayFunc}.";keyword=".$keyword) - : $display->getUrl("keyword=".$keyword) - ; + my $url; + if ($urlCallback) { + $url = $display->$urlCallback($keyword); + } + else { + my %q = ( keyword => $keyword ); + my $e = $self->session->url; + if (my $func = $options->{displayFunc}) { + $q{displayFunc} = $func; + } + $url = $display->getUrl( + join(';', map { join '=', $_, $e->escape($q{$_}) } keys %q) + ); + } $cloud->add($keyword, $url, $count); } return $cloud->html_and_css($maxKeywords); diff --git a/t/Keyword.t b/t/Keyword.t index 8f3c83676..8c5c02b97 100644 --- a/t/Keyword.t +++ b/t/Keyword.t @@ -17,7 +17,7 @@ use WebGUI::Keyword; use WebGUI::Asset; # load your modules here -use Test::More tests => 16; # increment this value for each test you create +use Test::More tests => 17; # increment this value for each test you create use Test::Deep; use Data::Dumper; @@ -30,12 +30,12 @@ isa_ok($home, "WebGUI::Asset"); my $keyword = WebGUI::Keyword->new($session); isa_ok($keyword, "WebGUI::Keyword"); -$keyword->setKeywordsForAsset({ asset=>$home, keywords=>"test key, word, foo bar"}); +$keyword->setKeywordsForAsset({ asset=>$home, keywords=>"test key, word, foo & bar"}); my ($count) = $session->db->quickArray("select count(*) from assetKeyword where assetId=?", [$home->getId]); is($count, 3, "setKeywordsForAsset() create"); cmp_bag( $keyword->getKeywordsForAsset({ asset => $home, asArrayRef => 1}), - ['test key', 'word', 'foo bar'], + ['test key', 'word', 'foo & bar'], '... check correct keywords set, returns array ref' ); @@ -43,10 +43,19 @@ my $keywords = $keyword->getKeywordsForAsset({ asset => $home, }); my @keywords = split ',\s*', $keywords; cmp_bag( \@keywords, - ['test key', 'word', 'foo bar'], + ['test key', 'word', 'foo & bar'], '... check correct keywords set, returns string' ); +my $cloud = $keyword->generateCloud( + { + startAsset => $home, + displayFunc => 'view', + } +); +my $url = $session->url->escape('foo & bar'); +like($cloud, qr/\Q$url\E/, 'escaped urls in generateCloud'); + $keyword->setKeywordsForAsset({ asset=>$home, keywords=>"webgui, rules"}); my ($count) = $session->db->quickArray("select count(*) from assetKeyword where assetId=?", [$home->getId]); is($count, 2, "setKeywordsForAsset() update");