diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index ce6937f59..a2d65c2fd 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -25,6 +25,7 @@ - fixed #11146: Upgrade Error 7.7.21 to 7.7.22 - fixed #11147: fail safe template is missing embedded style - fixed #11137: Customers see failed orders + - fixed #11156: Syndicated Content doesn't show all headlines in feed 7.8.1 - mark $session->datetime->time as deprecated and remove its use from core code diff --git a/lib/WebGUI/Asset/Wobject/SyndicatedContent.pm b/lib/WebGUI/Asset/Wobject/SyndicatedContent.pm index fc10a362f..c1da1d9e1 100644 --- a/lib/WebGUI/Asset/Wobject/SyndicatedContent.pm +++ b/lib/WebGUI/Asset/Wobject/SyndicatedContent.pm @@ -133,7 +133,7 @@ sub generateFeed { my $limit = shift || $self->get('maxHeadlines'); my $feed = XML::FeedPP::Atom->new(); my $log = $self->session->log; - + # build one feed out of many my $newlyCached = 0; foreach my $url (split(/\s+/, $self->get('rssUrl'))) { @@ -154,35 +154,45 @@ sub generateFeed { utf8::downgrade($value, 1); eval { my $singleFeed = XML::FeedPP->new($value, utf8_flag => 1, -type => 'string'); - $feed->merge($singleFeed); + $feed->merge_channel($singleFeed); + $feed->merge_item($singleFeed); }; if ($@) { $log->error("Syndicated Content asset (".$self->getId.") has a bad feed URL (".$url."). Failed with ".$@); } } - + + # build a new feed that matches the term the user is interested in if ($self->get('hasTerms') ne '') { my @terms = split /,\s*/, $self->get('hasTerms'); # get the list of terms my $termRegex = join("|", map quotemeta($_), @terms); # turn the terms into a regex string my @items = $feed->match_item(title => qr/$termRegex/msi); push @items, $feed->match_item(description => qr/$termRegex/msi); - $feed->clear_item; - $feed->uniq_item; - foreach my $item (@items) { - $feed->add_item($item); - } + $feed->clear_item; + ITEM: foreach my $item (@items) { + $feed->add_item($item); + } } - + + my %seen = {}; + my @items = $feed->get_item; + $feed->clear_item; + ITEM: foreach my $item (@items) { + my $key = join "\n", $item->link, $item->pubDate, $item->description, $item->title; + next ITEM if $seen{$key}++; + $feed->add_item($item); + } + # sort them by date and remove any duplicate from the OR based term matching above - $feed->normalize(); - + $feed->sort_item(); + # limit the feed to the maximum number of headlines (or the feed generator limit). $feed->limit_item($limit); - + # mark this asset as updated $self->update({}) if ($newlyCached); - + return $feed; } diff --git a/t/Asset/Wobject/SyndicatedContent.t b/t/Asset/Wobject/SyndicatedContent.t index 270d59d30..7cce86dd8 100644 --- a/t/Asset/Wobject/SyndicatedContent.t +++ b/t/Asset/Wobject/SyndicatedContent.t @@ -162,9 +162,6 @@ $cache->set($rssContent, 60); my $filteredFeed = $syndicated_content->generateFeed(); -use Data::Dumper; -diag Dumper($filteredFeed->get_item()); - cmp_deeply( [ map { $_->title } $filteredFeed->get_item() ], [