package WebGUI::Asset::Wobject::Layout; =head1 LEGAL ------------------------------------------------------------------- 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 ------------------------------------------------------------------- =cut use strict; use WebGUI::AdSpace; use WebGUI::Definition::Asset; extends 'WebGUI::Asset::Wobject'; aspect assetName => ["assetName", 'Asset_Layout']; aspect icon => 'layout.gif'; aspect tableName => 'Layout'; property templateId => ( fieldType => "template", namespace => "Layout", default => 'PBtmpl0000000000000054', label => ['layout template title', 'Asset_Layout'], hoverHelp => ['template description', 'Asset_Layout'], ); property mobileTemplateId => ( #fieldType => ( $session->style->useMobileStyle ? 'template' : 'hidden' ), fieldType => 'template', namespace => 'Layout', default => 'PBtmpl0000000000000054', noFormPost => 1, ); property contentPositions => ( noFormPost => 1, default => undef, fieldType => "hidden", noFormPost => 1, ); property assetsToHide => ( default => undef, fieldType => "checkList", noFormPost => 1, ); property assetOrder => ( default => 'asc', fieldType => 'selectBox', noFormPost => 1, ); use WebGUI::Utility; =head1 NAME Package WebGUI::Asset::Wobject::Layout =head1 DESCRIPTION Provides a mechanism to layout multiple assets on a single page. =head1 SYNOPSIS use WebGUI::Asset::Wobject::Layout; =head1 METHODS These methods are available from this class: =cut #------------------------------------------------------------------- =head2 getEditForm ( ) Extends the base method to handle the optional mobileTemplateId and assetsToHide. =cut sub getEditForm { my $self = shift; my $tabform = $self->SUPER::getEditForm(); my $i18n = WebGUI::International->new($self->session,"Asset_Layout"); my ($templateId); if (($self->assetId eq "new") && ($self->getParent->isa('WebGUI::Asset::Wobject::Layout'))) { $templateId = $self->getParent->templateId; } else { $templateId = $self->templateId; } $tabform->getTab("display")->template( -value=>$templateId, -label=>$i18n->get('layout template title'), -hoverHelp=>$i18n->get('template description'), -namespace=>"Layout" ); if ( $self->session->setting->get('useMobileStyle') ) { $tabform->getTab("display")->template( name => 'mobileTemplateId', value => $self->mobileTemplateId, label => $i18n->get('mobileTemplateId label'), hoverHelp => $i18n->get('mobileTemplateId description'), namespace => 'Layout', ); } else { $tabform->getTab("display")->hidden( name => 'mobileTemplateId', value => $self->mobileTemplateId, ); } tie my %assetOrder, "Tie::IxHash"; %assetOrder = ( "asc" =>$i18n->get("asset order asc"), "desc" =>$i18n->get("asset order desc"), ); $tabform->getTab("display")->selectBox( -name => 'assetOrder', -label => $i18n->get('asset order label'), -hoverHelp => $i18n->get('asset order hoverHelp'), -value => $self->assetOrder, -options => \%assetOrder ); if ($self->get("assetId") eq "new") { $tabform->getTab("properties")->whatNext( -options=>{ view=>$i18n->get(823), viewParent=>$i18n->get(847) }, -value=>"view" ); } else { my @assetsToHide = split("\n",$self->assetsToHide); my $children = $self->getLineage(["children"],{"returnObjects"=>1, excludeClasses=>["WebGUI::Asset::Wobject::Layout"]}); my %childIds; foreach my $child (@{$children}) { $childIds{$child->getId} = $child->getTitle; } $tabform->getTab("display")->checkList( -name=>"assetsToHide", -value=>\@assetsToHide, -options=>\%childIds, -label=>$i18n->get('assets to hide'), -hoverHelp=>$i18n->get('assets to hide description'), -vertical=>1, -uiLevel=>9 ); } return $tabform; } #------------------------------------------------------------------- =head2 prepareView Extends the base class to handle the optional mobile style template, to handle asset dragging and to put children in their places. =cut sub prepareView { my $self = shift; $self->SUPER::prepareView; my $session = $self->session; my $templateId; if ($session->style->useMobileStyle) { $templateId = $self->mobileTemplateId; } else { $templateId = $self->templateId; } my $template = WebGUI::Asset->newById($session, $templateId); if (!$template) { WebGUI::Error::ObjectNotFound::Template->throw( error => qq{Template not found}, templateId => $templateId, assetId => $self->getId, ); } $template->prepare( $self->getMetaDataAsTemplateVariables ); $self->{_viewTemplate} = $template; my $templateContent = $template->template; my $numPositions = 1; while ($templateContent =~ /position(\d+)_loop/g) { $numPositions = $1 if $1 > $numPositions; } my %vars; $vars{showAdmin} = ($session->var->isAdminOn && $self->canEdit && $self->canEditIfLocked); my $splitter = $self->{_viewSplitter} = $self->getSeparator; my %hidden = map { $_ => 1 } split "\n", $self->assetsToHide; my %placeHolder; my @children; for my $child ( @{ $self->getLineage( ["children"], { returnObjects => 1, excludeClasses => ["WebGUI::Asset::Wobject::Layout"], } ) } ) { my $assetId = $child->getId; next if ($hidden{$assetId} || ! $child->canView); $child->prepareView; $placeHolder{$assetId} = $child; push @children, { id => $assetId, isUncommitted => $child->status eq 'pending', content => $splitter . $assetId . '~~', }; if ($vars{showAdmin}) { $children[-1]->{'dragger.icon'} = sprintf '