webgui/lib/WebGUI/Asset/Wobject/Article.pm
Drake c438d55310 Normalized signature of Asset::duplicate. This involved going through
existing overrides and callers for that method and making sure they followed
the correct signature.  Various related cleanups.

This should fix those bugs with collaboration systems refusing to be copied
or deployed as packages.
2006-09-23 01:33:46 +00:00

373 lines
11 KiB
Perl

package WebGUI::Asset::Wobject::Article;
#-------------------------------------------------------------------
# WebGUI is Copyright 2001-2006 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 strict;
use Tie::IxHash;
use WebGUI::International;
use WebGUI::Cache;
use WebGUI::Paginator;
use WebGUI::Asset::Wobject;
use WebGUI::Storage::Image;
our @ISA = qw(WebGUI::Asset::Wobject);
=head1 NAME
Package WebGUI::Asset::Wobject::Article
=head1 DESCRIPTION
Asset to display content to the user. Most content in WebGUI sites
will be Articles.
Articles are Wobjects, so they inherit all the methods and properties of
Wobjects.
=head2 definition ( $class, $definition )
This method defines all properties of an Article and is used to autogenerate
most methods used by the Article.
=head3 $class
$class is used to make sure that inheritance works on Assets and Wobjects.
=head3 $definition
Definition hashref from subclasses.
=head3 Article specific properties
=over 4
=item templateId
ID of a tempate from the Article namespace to display the contents of the Article.
=item linkTitle
The text displayed to the user as a hyperlink to the linkURL.
=back
=cut
#-------------------------------------------------------------------
=head2 addRevision
Override the default method in order to deal with attachments.
=cut
sub addRevision {
my $self = shift;
my $newSelf = $self->SUPER::addRevision(@_);
if ($self->get("storageId")) {
my $newStorage = WebGUI::Storage->get($self->session,$self->get("storageId"))->copy;
$newSelf->update({storageId=>$newStorage->getId});
}
return $newSelf;
}
#-------------------------------------------------------------------
sub definition {
my $class = shift;
my $session = shift;
my $definition = shift;
my $i18n = WebGUI::International->new($session,'Asset_Article');
my %properties;
tie %properties, 'Tie::IxHash';
%properties = (
cacheTimeout => {
tab => "display",
fieldType => "interval",
defaultValue => 3600,
uiLevel => 8,
label => $i18n->get("cache timeout"),
hoverHelp => $i18n->get("cache timeout help")
},
templateId =>{
fieldType=>"template",
defaultValue=>'PBtmpl0000000000000002',
tab=>"display",
namespace=>"Article",
hoverHelp=>$i18n->get('article template description'),
label=>$i18n->get(72)
},
linkURL=>{
tab=>"properties",
fieldType=>'url',
defaultValue=>undef,
label=>$i18n->get(8),
hoverHelp=>$i18n->get('link url description'),
uiLevel=>3
},
linkTitle=>{
tab=>"properties",
fieldType=>'text',
defaultValue=>undef,
label=>$i18n->get(7),
hoverHelp=>$i18n->get('link title description'),
uiLevel=>3
},
storageId=>{
tab=>"properties",
fieldType=>"image",
deleteFileUrl=>$session->url->page("func=deleteFile;filename="),
maxAttachments=>25,
defaultValue=>undef,
label=>$i18n->get("attachments"),
hoverHelp=>$i18n->get("attachments help")
}
);
push(@{$definition}, {
assetName=>$i18n->get('assetName'),
icon=>'article.gif',
autoGenerateForms=>1,
tableName=>'Article',
className=>'WebGUI::Asset::Wobject::Article',
properties=>\%properties
});
return $class->SUPER::definition($session, $definition);
}
#-------------------------------------------------------------------
sub duplicate {
my $self = shift;
my $newAsset = $self->SUPER::duplicate(@_);
my $newStorage = $self->getStorageLocation->copy;
$newAsset->update({storageId=>$newStorage->getId});
return $newAsset;
}
#-------------------------------------------------------------------
=head2 exportAssetData ( )
See WebGUI::AssetPackage::exportAssetData() for details.
=cut
sub exportAssetData {
my $self = shift;
my $data = $self->SUPER::exportAssetData;
push(@{$data->{storage}}, $self->get("storageId")) if ($self->get("storageId") ne "");
return $data;
}
#-------------------------------------------------------------------
sub getStorageLocation {
my $self = shift;
unless (exists $self->{_storageLocation}) {
if ($self->get("storageId") eq "") {
$self->{_storageLocation} = WebGUI::Storage::Image->create($self->session);
$self->update({storageId=>$self->{_storageLocation}->getId});
} else {
$self->{_storageLocation} = WebGUI::Storage::Image->get($self->session,$self->get("storageId"));
}
}
return $self->{_storageLocation};
}
#-------------------------------------------------------------------
=head2 indexContent ( )
Indexing the content of attachments and user defined fields. See WebGUI::Asset::indexContent() for additonal details.
=cut
sub indexContent {
my $self = shift;
my $indexer = $self->SUPER::indexContent;
$indexer->addKeywords($self->get("linkTitle"));
$indexer->addKeywords($self->get("linkUrl"));
my $storage = $self->getStorageLocation;
foreach my $file (@{$storage->getFiles}) {
$indexer->addFile($storage->getPath($file));
}
}
#-------------------------------------------------------------------
=head2 prepareView ( )
See WebGUI::Asset::prepareView() for details.
=cut
sub prepareView {
my $self = shift;
$self->SUPER::prepareView();
my $templateId = $self->get("templateId");
if ($self->session->form->process("overrideTemplateId") ne "") {
$templateId = $self->session->form->process("overrideTemplateId");
}
my $template = WebGUI::Asset::Template->new($self->session, $templateId);
$template->prepare;
$self->{_viewTemplate} = $template;
}
#-------------------------------------------------------------------
sub purge {
my $self = shift;
my $sth = $self->session->db->read("select storageId from Article where assetId=?",[$self->getId]);
while (my ($storageId) = $sth->array) {
my $storage = WebGUI::Storage::Image->get($self->session,$storageId);
$storage->delete if defined $storage;
}
$sth->finish;
return $self->SUPER::purge;
}
#-------------------------------------------------------------------
=head2 purgeCache ( )
See WebGUI::Asset::purgeCache() for details.
=cut
sub purgeCache {
my $self = shift;
WebGUI::Cache->new($self->session,"view_".$self->getId)->delete;
$self->SUPER::purgeCache;
}
#-------------------------------------------------------------------
sub purgeRevision {
my $self = shift;
$self->getStorageLocation->delete;
return $self->SUPER::purgeRevision;
}
#-------------------------------------------------------------------
=head2 view ( )
view defines all template variables, processes the template and
returns the output.
=cut
sub view {
my $self = shift;
if (!$self->session->var->isAdminOn && $self->get("cacheTimeout") > 10 && !$self->session->form->process("overrideTemplateId") && !$self->session->form->process("pn") && !$self->session->form->process("makePrintable")) {
my $out = WebGUI::Cache->new($self->session,"view_".$self->getId)->get;
return $out if $out;
}
my %var;
if ($self->get("storageId")) {
my $storage = $self->getStorageLocation;
my @loop = ();
foreach my $file (@{$storage->getFiles}) {
if ($storage->isImage($file)) {
$var{'image.url'} = $storage->getUrl($file);
$var{'image.thumbnail'} = $storage->getThumbnailUrl($file);
} else {
$var{'attachment.icon'} = $storage->getFileIconUrl($file);
$var{'attachment.url'} = $storage->getUrl($file);
$var{'attachment.name'} = $file;
}
push(@{$var{attachment_loop}}, {
filename => $file,
isImage => $storage->isImage($file),
url=> $storage->getUrl($file),
thumbnailUrl => $storage->getThumbnailUrl($file),
iconUrl => $storage->getFileIconUrl($file)
});
}
}
$var{description} = $self->get("description");
$var{"new.template"} = $self->getUrl("func=view").";overrideTemplateId=";
$var{"description.full"} = $var{description};
$var{"description.full"} =~ s/\^\-\;//g;
$var{"description.first.100words"} = $var{"description.full"};
$var{"description.first.100words"} =~ s/(((\S+)\s+){100}).*/$1/s;
$var{"description.first.75words"} = $var{"description.first.100words"};
$var{"description.first.75words"} =~ s/(((\S+)\s+){75}).*/$1/s;
$var{"description.first.50words"} = $var{"description.first.75words"};
$var{"description.first.50words"} =~ s/(((\S+)\s+){50}).*/$1/s;
$var{"description.first.25words"} = $var{"description.first.50words"};
$var{"description.first.25words"} =~ s/(((\S+)\s+){25}).*/$1/s;
$var{"description.first.10words"} = $var{"description.first.25words"};
$var{"description.first.10words"} =~ s/(((\S+)\s+){10}).*/$1/s;
$var{"description.first.2paragraphs"} = $var{"description.full"};
$var{"description.first.2paragraphs"} =~ s/^((.*?\n){2}).*/$1/s;
$var{"description.first.paragraph"} = $var{"description.first.2paragraphs"};
$var{"description.first.paragraph"} =~ s/^(.*?\n).*/$1/s;
$var{"description.first.4sentences"} = $var{"description.full"};
$var{"description.first.4sentences"} =~ s/^((.*?\.){4}).*/$1/s;
$var{"description.first.3sentences"} = $var{"description.first.4sentences"};
$var{"description.first.3sentences"} =~ s/^((.*?\.){3}).*/$1/s;
$var{"description.first.2sentences"} = $var{"description.first.3sentences"};
$var{"description.first.2sentences"} =~ s/^((.*?\.){2}).*/$1/s;
$var{"description.first.sentence"} = $var{"description.first.2sentences"};
$var{"description.first.sentence"} =~ s/^(.*?\.).*/$1/s;
my $p = WebGUI::Paginator->new($self->session,$self->getUrl,1);
if ($self->session->form->process("makePrintable") || $var{description} eq "") {
$var{description} =~ s/\^\-\;//g;
$p->setDataByArrayRef([$var{description}]);
} else {
my @pages = split(/\^\-\;/,$var{description});
$p->setDataByArrayRef(\@pages);
$var{description} = $p->getPage;
}
$p->appendTemplateVars(\%var);
my $out = $self->processTemplate(\%var,undef,$self->{_viewTemplate});
if (!$self->session->var->isAdminOn && $self->get("cacheTimeout") > 10 && !$self->session->form->process("overrideTemplateId") && !$self->session->form->process("pn") && !$self->session->form->process("makePrintable")) {
WebGUI::Cache->new($self->session,"view_".$self->getId)->set($out,$self->get("cacheTimeout"));
}
return $out;
}
#-------------------------------------------------------------------
=head2 www_deleteFile ( )
Deletes and attached file.
=cut
sub www_deleteFile {
my $self = shift;
return $self->session->privilege->insufficient unless $self->canEdit;
if ($self->get("storageId") ne "") {
my $storage = $self->getStorageLocation;
$storage->deleteFile($self->session->form->param("filename"));
}
return $self->www_edit;
}
#-------------------------------------------------------------------
=head2 www_view ( )
See WebGUI::Asset::Wobject::www_view() for details.
=cut
sub www_view {
my $self = shift;
$self->session->http->setCacheControl($self->get("cacheTimeout"));
$self->SUPER::www_view(@_);
}
1;