166 lines
5.2 KiB
Perl
166 lines
5.2 KiB
Perl
package WebGUI::Asset::Wobject::Shelf;
|
|
|
|
#-------------------------------------------------------------------
|
|
# WebGUI is Copyright 2001-2009 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 List::MoreUtils;
|
|
use WebGUI::International;
|
|
use Moose;
|
|
use WebGUI::Definition::Asset;
|
|
extends 'WebGUI::Asset::Wobject';
|
|
use WebGUI::Text;
|
|
use WebGUI::Storage;
|
|
use WebGUI::Exception::Shop;
|
|
use WebGUI::Asset::Sku::Product;
|
|
|
|
define assetName => ['assetName', 'Asset_Shelf'];
|
|
define icon => 'Shelf.gif';
|
|
define tableName => 'Shelf';
|
|
|
|
property templateId => (
|
|
fieldType => "template",
|
|
default => 'nFen0xjkZn8WkpM93C9ceQ',
|
|
tab => "display",
|
|
namespace => "Shelf",
|
|
hoverHelp => ['shelf template help', 'Asset_Shelf'],
|
|
label => ['shelf template', 'Asset_Shelf'],
|
|
);
|
|
|
|
#----------------------------------------------------------------------------
|
|
|
|
=head2 getHelpers ( )
|
|
|
|
Add the importCSV and exportCSV helpers to the Shelf
|
|
|
|
=cut
|
|
|
|
override getHelpers => sub {
|
|
my ( $self ) = @_;
|
|
my $helpers = super();
|
|
|
|
$helpers->{import_products} = {
|
|
className => 'WebGUI::AssetHelper::Product::ImportCSV',
|
|
label => 'Import Products',
|
|
};
|
|
$helpers->{export_products} = {
|
|
className => 'WebGUI::AssetHelper::Product::ExportCSV',
|
|
label => 'Export Products',
|
|
};
|
|
|
|
return $helpers;
|
|
};
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
=head2 prepareView ( )
|
|
|
|
See WebGUI::Asset::prepareView() for details.
|
|
|
|
=cut
|
|
|
|
sub prepareView {
|
|
my $self = shift;
|
|
$self->SUPER::prepareView();
|
|
warn "Shelf: going to do prepareView on template with id: " . $self->templateId . " and we are: " . $self->getId;
|
|
my $template = WebGUI::Asset::Template->newById($self->session, $self->templateId); # boom XXX
|
|
if (!$template) {
|
|
WebGUI::Error::ObjectNotFound::Template->throw(
|
|
error => qq{Template not found},
|
|
templateId => $self->get("templateId"),
|
|
assetId => $self->getId,
|
|
);
|
|
}
|
|
$template->prepare($self->getMetaDataAsTemplateVariables);
|
|
$self->{_viewTemplate} = $template;
|
|
}
|
|
|
|
|
|
#-------------------------------------------------------------------
|
|
|
|
=head2 view ( )
|
|
|
|
method called by the www_view method. Returns a processed template
|
|
to be displayed within the page style.
|
|
|
|
=cut
|
|
|
|
sub view {
|
|
my $self = shift;
|
|
my $session = $self->session;
|
|
|
|
# get other shelves
|
|
my @childShelves = ();
|
|
my $childIter = $self->getLineageIterator(['children'],{includeOnlyClasses=>['WebGUI::Asset::Wobject::Shelf']});
|
|
SHELF: while ( 1 ) {
|
|
my $child;
|
|
eval { $child = $childIter->() };
|
|
if ( my $x = WebGUI::Error->caught('WebGUI::Error::ObjectNotFound') ) {
|
|
$session->log->error($x->full_message);
|
|
next;
|
|
}
|
|
last unless $child;
|
|
next SHELF unless $child->canView;
|
|
my $properties = $child->get;
|
|
$properties->{url} = $child->getUrl;
|
|
$properties->{title} = $child->getTitle;
|
|
push @childShelves, $properties;
|
|
}
|
|
|
|
# get other child skus
|
|
my @childSkus = @{$self->getLineage(['children'],{isa=>'WebGUI::Asset::Sku'})};
|
|
|
|
# find products based upon keywords
|
|
my @keywords = $self->keywords;
|
|
my $keywordBasedAssetIds = WebGUI::Keyword->new($session)->getMatchingAssets({
|
|
matchAssetKeywords => $self,
|
|
isa => 'WebGUI::Asset::Sku',
|
|
});
|
|
|
|
##Prescreen to only paginate viewable products
|
|
my @productIds = List::MoreUtils::uniq(@childSkus, @{$keywordBasedAssetIds});
|
|
my @products = ();
|
|
PRODUCT: foreach my $id (@productIds) {
|
|
my $asset = WebGUI::Asset->newById($session, $id);
|
|
if (!defined $asset) {
|
|
$session->log->error(q|Couldn't instanciate SKU with assetId |.$id.q| on shelf with assetId |.$self->getId);
|
|
next PRODUCT;
|
|
}
|
|
push @products, $asset if $asset->canView;
|
|
}
|
|
|
|
# create paginator
|
|
my $p = WebGUI::Paginator->new($session, $self->getUrl('func=view'));
|
|
$p->setDataByArrayRef(\@products);
|
|
|
|
# generate template variables
|
|
my @skus = ();
|
|
foreach my $asset (@{$p->getPageData}) {
|
|
my $sku = $asset->get;
|
|
$sku->{url} = $asset->getUrl;
|
|
$sku->{thumbnailUrl} = $asset->getThumbnailUrl;
|
|
$sku->{price} = sprintf("%.2f", $asset->getPrice ? $asset->getPrice : 0);
|
|
$sku->{addToCartForm} = $asset->getAddToCartForm;
|
|
push @skus, $sku;
|
|
}
|
|
my %var = (
|
|
shelves => \@childShelves,
|
|
products => \@skus,
|
|
noViewableSkus => scalar(@skus) ? 0 : 1,
|
|
emptyShelf => scalar(@productIds) ? 0 : 1,
|
|
);
|
|
$p->appendTemplateVars(\%var);
|
|
|
|
# render page
|
|
return $self->processTemplate(\%var, undef, $self->{_viewTemplate});
|
|
}
|
|
|
|
__PACKAGE__->meta->make_immutable;
|
|
1;
|