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::Asset::Wobject; use WebGUI::Utility; use WebGUI::Cache; our @ISA = qw(WebGUI::Asset::Wobject); =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 definition ( definition ) Defines the properties of this asset. =head3 definition A hash reference passed in from a subclass definition. =cut sub definition { my $class = shift; my $session = shift; my $definition = shift; my $i18n = WebGUI::International->new($session,"Asset_Layout"); push(@{$definition}, { assetName=>$i18n->get("assetName"), icon=>'layout.gif', tableName=>'Layout', className=>'WebGUI::Asset::Wobject::Layout', properties=>{ templateId => { label => $i18n->get('layout template title'), hoverHelp => $i18n->get('template description'), fieldType =>"template", namespace => "Layout", defaultValue =>'PBtmpl0000000000000054', }, mobileTemplateId => { fieldType => ( $session->style->useMobileStyle ? 'template' : 'hidden' ), label => $i18n->get('mobileTemplateId label'), hoverHelp => $i18n->get('mobileTemplateId description'), namespace => 'Layout', defaultValue => 'PBtmpl0000000000000054', }, contentPositions => { noFormPost =>1, defaultValue =>undef, fieldType =>"hidden" }, assetsToHide => { defaultValue =>undef, fieldType =>"checkList" }, assetOrder => { defaultValue => 'asc', fieldType => 'selectBox', label => $i18n->get('asset order label'), hoverHelp => $i18n->get('asset order hoverHelp'), } } }); return $class->SUPER::definition($session, $definition); } #------------------------------------------------------------------- =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->get("assetId") eq "new") && ($self->getParent->get('className') eq 'WebGUI::Asset::Wobject::Layout')) { $templateId = $self->getParent->getValue('templateId'); } else { $templateId = $self->getValue('templateId'); } tie my %extraFields, "Tie::IxHash"; %extraFields = ( templateId => { fieldType => 'template', tab => 'display', value => $templateId, label => $i18n->get('layout template title'), hoverHelp => $i18n->get('template description'), namespace => "Layout", }); if ( $self->session->setting->get('useMobileStyle') ) { $extraFields{mobileTemplateId} = { fieldType => 'template', tab => 'display', name => 'mobileTemplateId', value => $self->getValue('mobileTemplateId'), label => $i18n->get('mobileTemplateId label'), hoverHelp => $i18n->get('mobileTemplateId description'), namespace => 'Layout', }; } else { $extraFields{mobileTemplateId} = { fieldType => 'hidden', tab => 'display', name => 'mobileTemplateId', value => $self->getValue('mobileTemplateId'), }; } tie my %assetOrder, "Tie::IxHash"; %assetOrder = ( "asc" => $i18n->get("asset order asc"), "desc" => $i18n->get("asset order desc"), ); $extraFields{assetOrder} = { tab => 'display', fieldType => 'selectBox', name => 'assetOrder', label => $i18n->get('asset order label'), hoverHelp => $i18n->get('asset order hoverHelp'), value => $self->getValue('assetOrder'), options => \%assetOrder, }; if ($self->get("assetId") eq "new") { $extraFields{whatNext} = { fieldType => 'whatNext', value => "view", options => { view => $i18n->get(823), viewParent => $i18n->get(847) }, }; } else { my @assetsToHide = split("\n",$self->getValue("assetsToHide")); my $childIter = $self->getLineageIterator(["children"],{excludeClasses=>["WebGUI::Asset::Wobject::Layout"]}); my %childIds; while ( 1 ) { my $child; eval { $child = $childIter->() }; if ( my $x = WebGUI::Error->caught('WebGUI::Error::ObjectNotFound') ) { $self->session->log->error($x->full_message); next; } last unless $child; $childIds{$child->getId} = $child->getTitle; } $extraFields{assetsToHide} = { fieldType => 'checkList', tab => 'display', name => "assetsToHide", value => \@assetsToHide, options => \%childIds, label => $i18n->get('assets to hide'), hoverHelp => $i18n->get('assets to hide description'), vertical => 1, uiLevel => 9, }; } my $overrides = $self->session->config->get("assets/".$self->get("className")); foreach my $fieldName (keys %extraFields) { $self->setupFormField($tabform, $fieldName, \%extraFields, $overrides); } 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->get('mobileTemplateId'); } else { $templateId = $self->get('templateId'); } my $template = WebGUI::Asset->new($session,$templateId,"WebGUI::Asset::Template"); 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->get("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->get("assetsToHide"); my %placeHolder; my @children; my $childIter = $self->getLineageIterator( ["children"], { excludeClasses => ["WebGUI::Asset::Wobject::Layout"], } ); 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; my $assetId = $child->getId; next if ($hidden{$assetId} || ! $child->canView); $child->prepareView; $placeHolder{$assetId} = $child; push @children, { id => $assetId, isUncommitted => $child->get('status') eq 'pending', content => $splitter . $assetId . '~~', }; if ($vars{showAdmin}) { $children[-1]->{'dragger.icon'} = sprintf '