205 lines
5.9 KiB
Perl
205 lines
5.9 KiB
Perl
package WebGUI::Asset::RSSCapable;
|
|
|
|
=head1 LEGAL
|
|
|
|
-------------------------------------------------------------------
|
|
WebGUI is Copyright 2001-2008 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
|
|
-------------------------------------------------------------------
|
|
|
|
=cut
|
|
|
|
use strict;
|
|
use NEXT;
|
|
use WebGUI::Asset::RSSFromParent;
|
|
|
|
=head1 NAME
|
|
|
|
WebGUI::Asset::RSSCapable
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
An extra mixin class to be included before WebGUI::Asset in any asset
|
|
class that wishes its instances to be capable of generating RSS feeds
|
|
using the RSSFromParent asset.
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
use base 'WebGUI::Asset::RSSCapable';
|
|
|
|
=cut
|
|
|
|
sub definition {
|
|
my $class = shift;
|
|
my $session = shift;
|
|
my $definition = shift;
|
|
my %properties;
|
|
tie %properties, 'Tie::IxHash';
|
|
my $i18n = WebGUI::International->new($session, 'Asset_RSSCapable');
|
|
|
|
# We do this prefixing to avoid name collisions because properties aren't namespaced.
|
|
%properties =
|
|
(
|
|
rssCapableRssEnabled => { tab => 'display',
|
|
fieldType => 'yesNo',
|
|
defaultValue => 1,
|
|
label => $i18n->get('rssEnabled label'),
|
|
hoverHelp => $i18n->get('rssEnabled hoverHelp')
|
|
},
|
|
rssCapableRssTemplateId => { tab => 'display',
|
|
fieldType => 'template',
|
|
defaultValue => 'PBtmpl0000000000000142',
|
|
namespace => 'RSSCapable/RSS',
|
|
label => $i18n->get('rssTemplateId label'),
|
|
hoverHelp => $i18n->get('rssTemplateId hoverHelp')
|
|
},
|
|
rssCapableRssFromParentId => { fieldType => 'hidden',
|
|
noFormPost => 1,
|
|
defaultValue => undef,
|
|
},
|
|
);
|
|
|
|
push @$definition, { assetName => $i18n->get('assetName'),
|
|
tableName => 'RSSCapable',
|
|
autoGenerateForms => 1,
|
|
className => 'WebGUI::Asset::RSSCapable',
|
|
icon => 'rssCapable.gif',
|
|
properties => \%properties
|
|
};
|
|
return $class->NEXT::definition($session, $definition);
|
|
}
|
|
|
|
#-------------------------------------------------------------------
|
|
sub _rssFromParentValid {
|
|
my $self = shift;
|
|
my $rssFromParentId = $self->get('rssCapableRssFromParentId');
|
|
return undef unless $rssFromParentId;
|
|
|
|
my $rssFromParent = WebGUI::Asset->newByDynamicClass($self->session, $rssFromParentId);
|
|
return undef unless $rssFromParent;
|
|
return ($rssFromParent->isa('WebGUI::Asset::RSSFromParent')
|
|
&& $rssFromParent->getParent->getId eq $self->getId);
|
|
}
|
|
|
|
#-------------------------------------------------------------------
|
|
sub _updateRssFromParentProperties {
|
|
my $self = shift;
|
|
my $rssFromParent = WebGUI::Asset->newByDynamicClass($self->session,
|
|
$self->get('rssCapableRssFromParentId'));
|
|
$rssFromParent->update({ title => $self->get('title'),
|
|
menuTitle => $self->get('menuTitle') });
|
|
}
|
|
|
|
#-------------------------------------------------------------------
|
|
sub _purgeExtraRssFromParentAssets {
|
|
my $self = shift;
|
|
my $rssFromParentId = $self->get('rssCapableRssFromParentId');
|
|
|
|
foreach my $rssFromParent (@{$self->getLineage(['children'],
|
|
{returnObjects => 1,
|
|
includeOnlyClasses =>
|
|
['WebGUI::Asset::RSSFromParent']})}) {
|
|
$rssFromParent->purge unless $rssFromParent->getId eq $rssFromParentId;
|
|
}
|
|
}
|
|
|
|
#-------------------------------------------------------------------
|
|
sub _ensureRssFromParentPresent {
|
|
my $self = shift;
|
|
if (!$self->_rssFromParentValid) {
|
|
# Create a new one.
|
|
my $rssFromParent = $self->addChild({ className => 'WebGUI::Asset::RSSFromParent',
|
|
title => $self->get('title'),
|
|
menuTitle => $self->get('menuTitle'),
|
|
url => $self->get('url').'.rss'
|
|
});
|
|
$self->update({ rssCapableRssFromParentId => $rssFromParent->getId });
|
|
}
|
|
|
|
$self->_updateRssFromParentProperties;
|
|
$self->_purgeExtraRssFromParentAssets;
|
|
}
|
|
|
|
#-------------------------------------------------------------------
|
|
sub _ensureRssFromParentAbsent {
|
|
my $self = shift;
|
|
# Invalidate it, and then it'll get purged along with any others.
|
|
$self->update({ rssCapableRssFromParentId => undef });
|
|
$self->_purgeExtraRssFromParentAssets;
|
|
}
|
|
|
|
#-------------------------------------------------------------------
|
|
sub processPropertiesFromFormPost {
|
|
my $self = shift;
|
|
my $error = $self->NEXT::processPropertiesFromFormPost(@_);
|
|
return $error if ref $error eq 'ARRAY';
|
|
if ($self->get('rssCapableRssEnabled')) {
|
|
$self->_ensureRssFromParentPresent;
|
|
} else {
|
|
$self->_ensureRssFromParentAbsent;
|
|
}
|
|
|
|
return undef;
|
|
}
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
=head2 getRssUrl ( )
|
|
|
|
Returns the site-relative URL to the RSS feed for this asset, or undef
|
|
if there is no such feed.
|
|
|
|
=cut
|
|
|
|
sub getRssUrl {
|
|
my $self = shift;
|
|
my $rssFromParentId = $self->get('rssCapableRssFromParentId');
|
|
return undef unless $rssFromParentId;
|
|
my $rssAsset = WebGUI::Asset->newByDynamicClass($self->session, $rssFromParentId);
|
|
return undef unless $rssAsset;
|
|
return $rssAsset->getUrl;
|
|
}
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
=head2 getRssItems ( )
|
|
|
|
Returns a list of RSS items for a feed corresponding to this asset.
|
|
Each item may be another asset, or a hash of (properly XMLized)
|
|
properties for the <item>..</item> tag. Defaults to no items.
|
|
|
|
This is the primary method that RSSCapable assets should override.
|
|
|
|
=cut
|
|
|
|
sub getRssItems { () }
|
|
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
=head2 www_viewRSS ( )
|
|
|
|
Default www method for methods that return RSS. This will redirect to the getRssUrl unless overridden.
|
|
|
|
=cut
|
|
|
|
sub www_viewRSS {
|
|
my $self = shift;
|
|
my $session = $self->session;
|
|
|
|
my $rssUrl = $self->getRssUrl;
|
|
|
|
if($rssUrl) {
|
|
$session->http->setRedirect($self->getRssUrl);
|
|
}
|
|
|
|
return undef;
|
|
}
|
|
|
|
|
|
1;
|