diff --git a/lib/WebGUI/Asset.pm b/lib/WebGUI/Asset.pm index a0bfafd00..333a16e8c 100644 --- a/lib/WebGUI/Asset.pm +++ b/lib/WebGUI/Asset.pm @@ -1497,7 +1497,7 @@ sub processPropertiesFromFormPost { #------------------------------------------------------------------- -=head2 processTemplate ( vars, templateId ) +=head2 processTemplate ( vars, templateId, template ) Returns the content generated from this template. @@ -1509,23 +1509,28 @@ A hash reference containing variables and loops to pass to the template engine. An id referring to a particular template in the templates table. +=head3 template + +Instead of passing in a templateId, you may pass in a template object. + =cut sub processTemplate { my $self = shift; my $var = shift; my $templateId = shift; - my $meta = $self->getMetaDataFields() if ($self->session->setting->get("metaDataEnabled")); - foreach my $field (keys %$meta) { - $var->{$meta->{$field}{fieldName}} = $meta->{$field}{value}; - } - $var->{'controls'} = $self->getToolbar; - my %vars = ( - %{$self->{_properties}}, - %{$var} - ); - my $template = WebGUI::Asset->new($self->session, $templateId,"WebGUI::Asset::Template"); + my $template = shift; + $template = WebGUI::Asset->new($self->session, $templateId,"WebGUI::Asset::Template") unless (defined $template); if (defined $template) { + my $meta = $self->getMetaDataFields() if ($self->session->setting->get("metaDataEnabled")); + foreach my $field (keys %$meta) { + $var->{$meta->{$field}{fieldName}} = $meta->{$field}{value}; + } + $var->{'controls'} = $self->getToolbar; + my %vars = ( + %{$self->{_properties}}, + %{$var} + ); return $template->process(\%vars); } else { $self->session->errorHandler->error("Can't instantiate template $templateId for asset ".$self->getId); diff --git a/lib/WebGUI/Asset/Event.pm b/lib/WebGUI/Asset/Event.pm index 8304e30f1..4710e47c9 100644 --- a/lib/WebGUI/Asset/Event.pm +++ b/lib/WebGUI/Asset/Event.pm @@ -134,6 +134,23 @@ sub getEditForm { +#------------------------------------------------------------------- + +=head2 prepareView ( ) + +See WebGUI::Asset::prepareView() for details. + +=cut + +sub prepareView { + my $self = shift; + $self->SUPER::prepareView(); + my $template = WebGUI::Asset::Template->new($self->session, $self->get("templateId")); + $template->prepare; + $self->{_viewTemplate} = $template; +} + + #------------------------------------------------------------------- sub processPropertiesFromFormPost { my $self = shift; @@ -227,7 +244,7 @@ sub view { }); } $var{others_loop} = \@others; - return $self->processTemplate(\%var,$self->getValue("templateId")); + return $self->processTemplate(\%var,undef, $self->{_viewTemplate}); } diff --git a/lib/WebGUI/Asset/File.pm b/lib/WebGUI/Asset/File.pm index 6b8573d96..a4e0c0377 100644 --- a/lib/WebGUI/Asset/File.pm +++ b/lib/WebGUI/Asset/File.pm @@ -207,6 +207,23 @@ sub indexContent { } +#------------------------------------------------------------------- + +=head2 prepareView ( ) + +See WebGUI::Asset::prepareView() for details. + +=cut + +sub prepareView { + my $self = shift; + $self->SUPER::prepareView(); + my $template = WebGUI::Asset::Template->new($self->session, $self->get("templateId")); + $template->prepare; + $self->{_viewTemplate} = $template; +} + + #------------------------------------------------------------------- sub processPropertiesFromFormPost { my $self = shift; @@ -285,7 +302,7 @@ sub view { $var{controls} = $self->getToolbar; $var{fileUrl} = $self->getFileUrl; $var{fileIcon} = $self->getFileIconUrl; - return $self->processTemplate(\%var,$self->getValue("templateId")); + return $self->processTemplate(\%var, undef, $self->{_viewTemplate}); } diff --git a/lib/WebGUI/Asset/File/Image.pm b/lib/WebGUI/Asset/File/Image.pm index e7961a701..6b147067c 100644 --- a/lib/WebGUI/Asset/File/Image.pm +++ b/lib/WebGUI/Asset/File/Image.pm @@ -188,6 +188,23 @@ sub getToolbar { return $self->SUPER::getToolbar(); } +#------------------------------------------------------------------- + +=head2 prepareView ( ) + +See WebGUI::Asset::prepareView() for details. + +=cut + +sub prepareView { + my $self = shift; + $self->SUPER::prepareView(); + my $template = WebGUI::Asset::Template->new($self->session, $self->get("templateId")); + $template->prepare; + $self->{_viewTemplate} = $template; +} + + #------------------------------------------------------------------- sub processPropertiesFromFormPost { my $self = shift; @@ -220,7 +237,7 @@ sub view { $var{fileUrl} = $self->getFileUrl; $var{fileIcon} = $self->getFileIconUrl; $var{thumbnail} = $self->getThumbnailUrl; - return $self->processTemplate(\%var,$self->get("templateId")); + return $self->processTemplate(\%var,undef,$self->{_viewTemplate}); } #------------------------------------------------------------------- diff --git a/lib/WebGUI/Asset/File/ZipArchive.pm b/lib/WebGUI/Asset/File/ZipArchive.pm index 6333c62df..8b3f16645 100644 --- a/lib/WebGUI/Asset/File/ZipArchive.pm +++ b/lib/WebGUI/Asset/File/ZipArchive.pm @@ -186,6 +186,23 @@ sub getIcon { } +#------------------------------------------------------------------- + +=head2 prepareView ( ) + +See WebGUI::Asset::prepareView() for details. + +=cut + +sub prepareView { + my $self = shift; + $self->SUPER::prepareView(); + my $template = WebGUI::Asset::Template->new($self->session, $self->get("templateId")); + $template->prepare; + $self->{_viewTemplate} = $template; +} + + #------------------------------------------------------------------- =head2 processPropertiesFromFormPost ( ) @@ -224,30 +241,6 @@ sub processPropertiesFromFormPost { } -#------------------------------------------------------------------- -=head2 purge ( ) - -This method is called when data is purged by the system. - -=cut - -sub purge { - my $self = shift; - return $self->SUPER::purge; -} - -#------------------------------------------------------------------- -=head2 purgeRevision ( ) - -This method is called when data is purged by the system. - -=cut - -sub purgeRevision { - my $self = shift; - return $self->SUPER::purgeRevision; -} - #------------------------------------------------------------------- =head2 view ( ) @@ -273,7 +266,7 @@ sub view { unless($self->get("showPage")) { $var{pageError} = "true"; } - return $self->processTemplate(\%var,$self->get("templateId")); + return $self->processTemplate(\%var,undef,$self->{_viewTemplate}); } diff --git a/lib/WebGUI/Asset/Post/Thread.pm b/lib/WebGUI/Asset/Post/Thread.pm index 32fbee7cb..3488ca5a4 100644 --- a/lib/WebGUI/Asset/Post/Thread.pm +++ b/lib/WebGUI/Asset/Post/Thread.pm @@ -419,6 +419,23 @@ sub lock { } +#------------------------------------------------------------------- + +=head2 prepareView ( ) + +See WebGUI::Asset::prepareView() for details. + +=cut + +sub prepareView { + my $self = shift; + $self->SUPER::prepareView(); + my $template = WebGUI::Asset::Template->new($self->session, $self->getParent->get("threadTemplateId")); + $template->prepare; + $self->{_viewTemplate} = $template; +} + + #------------------------------------------------------------------- sub processPropertiesFromFormPost { my $self = shift; @@ -699,7 +716,7 @@ sub view { $var->{'collaboration.title'} = $self->getParent->get("title"); $var->{'collaboration.description'} = $self->getParent->get("description"); - return $self->processTemplate($var,$self->getParent->get("threadTemplateId")); + return $self->processTemplate($var,undef,$self->{_viewTemplate}); } diff --git a/lib/WebGUI/Asset/RichEdit.pm b/lib/WebGUI/Asset/RichEdit.pm index 2e0d4a3f1..f1588e61d 100644 --- a/lib/WebGUI/Asset/RichEdit.pm +++ b/lib/WebGUI/Asset/RichEdit.pm @@ -504,13 +504,6 @@ sub indexContent { } -#------------------------------------------------------------------- -sub view { - my $self = shift; - return '

'.$self->getToolbar.'

' if ($self->session->var->get("adminOn")); - return undef; -} - #------------------------------------------------------------------- sub www_edit { my $self = shift; diff --git a/lib/WebGUI/Asset/Shortcut.pm b/lib/WebGUI/Asset/Shortcut.pm index eaa89becf..0628a1f4c 100644 --- a/lib/WebGUI/Asset/Shortcut.pm +++ b/lib/WebGUI/Asset/Shortcut.pm @@ -583,6 +583,24 @@ sub isDashlet { return 0; } +#------------------------------------------------------------------- + +=head2 prepareView ( ) + +See WebGUI::Asset::prepareView() for details. + +=cut + +sub prepareView { + my $self = shift; + $self->SUPER::prepareView(); + my $template = WebGUI::Asset::Template->new($self->session, $self->get("templateId")); + $template->prepare; + $self->{_viewTemplate} = $template; + $self->getShortcut->prepareView; +} + + #------------------------------------------------------------------- sub processPropertiesFromFormPost { my $self = shift; @@ -620,7 +638,7 @@ sub view { next if ($prop eq 'content' || $prop eq 'label' || $prop eq 'url'); $var{'shortcut.'.$prop} = $self->{_shortcut}{_properties}{$prop}; } - return $self->processTemplate(\%var,$self->getValue("templateId")); + return $self->processTemplate(\%var,undef, $self->{_viewTemplate}); } #------------------------------------------------------------------- diff --git a/lib/WebGUI/Asset/Template.pm b/lib/WebGUI/Asset/Template.pm index 528ee87dc..a3906a4e8 100644 --- a/lib/WebGUI/Asset/Template.pm +++ b/lib/WebGUI/Asset/Template.pm @@ -318,17 +318,6 @@ sub processRaw { } -#------------------------------------------------------------------- -sub view { - my $self = shift; - if ($self->session->var->isAdminOn()) { - return $self->getToolbar; - } else { - return ""; - } -} - - #------------------------------------------------------------------- sub www_edit { my $self = shift; diff --git a/lib/WebGUI/Asset/Wobject.pm b/lib/WebGUI/Asset/Wobject.pm index 5a6ccab10..727fcce4c 100644 --- a/lib/WebGUI/Asset/Wobject.pm +++ b/lib/WebGUI/Asset/Wobject.pm @@ -401,10 +401,12 @@ See WebGUI::Asset::prepareView() for details. =cut -sub prepareView { +sub p1repareView { my $self = shift; + $self->SUPER::prepareView(); my $template = WebGUI::Asset::Template->new($self->session, $self->get("templateId")); $template->prepare; + $self->{_viewTemplate} = $template; } @@ -585,9 +587,9 @@ sub www_edit { Renders self->view based upon current style, subject to timeouts. Returns Privilege::noAccess() if canView is False. =cut + sub www_view { my $self = shift; - my $disableCache = shift; unless ($self->canView) { if ($self->get("state") eq "published") { # no privileges, make em log in return $self->session->privilege->noAccess(); @@ -607,6 +609,25 @@ sub www_view { return ""; } $self->logView(); + $self->session->http->getHeader; + $self->prepareView; + my $style = $self->processStyle("~~~"); + my ($head, $foot) = split("~~~",$style); + $self->session->output->print($head); + $self->view; + $self->session->output->print($foot); +} + +#------------------------------------------------------------------- + +=head2 www_view ( [ disableCache ] ) + +Renders self->view based upon current style, subject to timeouts. Returns Privilege::noAccess() if canView is False. + +=cut +sub www_viewOld { + my $self = shift; + my $disableCache = shift; my $cache; my $output; my $useCache = ( diff --git a/lib/WebGUI/Asset/Wobject/Article.pm b/lib/WebGUI/Asset/Wobject/Article.pm index 1fbc0668e..252935f12 100644 --- a/lib/WebGUI/Asset/Wobject/Article.pm +++ b/lib/WebGUI/Asset/Wobject/Article.pm @@ -118,6 +118,27 @@ sub definition { return $class->SUPER::definition($session, $definition); } +#------------------------------------------------------------------- + +=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; +} + + #------------------------------------------------------------------- =head2 view ( ) @@ -181,11 +202,7 @@ sub view { $var{description} = $p->getPage; } $p->appendTemplateVars(\%var); - my $templateId = $self->get("templateId"); - if ($self->session->form->process("overrideTemplateId") ne "") { - $templateId = $self->session->form->process("overrideTemplateId"); - } - return $self->processTemplate(\%var, $templateId); + return $self->processTemplate(\%var, undef, $self->{_viewTemplate}); } 1; diff --git a/lib/WebGUI/Asset/Wobject/Collaboration.pm b/lib/WebGUI/Asset/Wobject/Collaboration.pm index 02c443327..9d2628a05 100644 --- a/lib/WebGUI/Asset/Wobject/Collaboration.pm +++ b/lib/WebGUI/Asset/Wobject/Collaboration.pm @@ -782,6 +782,23 @@ sub isSubscribed { return $self->session->user->isInGroup($self->get("subscriptionGroupId")); } +#------------------------------------------------------------------- + +=head2 prepareView ( ) + +See WebGUI::Asset::prepareView() for details. + +=cut + +sub prepareView { + my $self = shift; + $self->SUPER::prepareView(); + my $template = WebGUI::Asset::Template->new($self->session, $self->get("collaborationTemplateId")); + $template->prepare; + $self->{_viewTemplate} = $template; +} + + #------------------------------------------------------------------- sub processPropertiesFromFormPost { my $self = shift; @@ -937,7 +954,7 @@ sub view { my $p = WebGUI::Paginator->new($self->session,$self->getUrl,$self->get("threadsPerPage")); $self->appendPostListTemplateVars(\%var, $sql, $p); $self->appendTemplateLabels(\%var); - return $self->processTemplate(\%var,$self->get("collaborationTemplateId")); + return $self->processTemplate(\%var,undef, $self->{_viewTemplate}); } #------------------------------------------------------------------- diff --git a/lib/WebGUI/Asset/Wobject/Layout.pm b/lib/WebGUI/Asset/Wobject/Layout.pm index 9b7e40ed9..9d9e2c6f1 100644 --- a/lib/WebGUI/Asset/Wobject/Layout.pm +++ b/lib/WebGUI/Asset/Wobject/Layout.pm @@ -139,107 +139,6 @@ sub getEditForm { sub prepareView { my $self = shift; $self->SUPER::prepareView; - if ($self->session->var->isAdminOn) { - # under normal circumstances we don't put HTML stuff in our code, but this will make it much easier - # for end users to work with our templates - $self->session->style->setScript($self->session->config->get("extrasURL")."/draggable.js",{ type=>"text/javascript" }); - $self->session->style->setLink($self->session->config->get("extrasURL")."/draggable.css",{ type=>"text/css", rel=>"stylesheet", media=>"all" }); - $self->session->style->setRawHeadTags(' - - '); - } -} - -#------------------------------------------------------------------- -sub viewOriginal { - my $self = shift; - my $children = $self->getLineage( ["children"], { returnObjects=>1, excludeClasses=>["WebGUI::Asset::Wobject::Layout"] }); - my %vars; - # I'm sure there's a more efficient way to do this. We'll figure it out someday. - my @positions = split(/\./,$self->get("contentPositions")); - my @hidden = split("\n",$self->get("assetsToHide")); - my $i = 1; - my $template= WebGUI::Asset->newByDynamicClass($self->session,$self->get("templateId"))->get("template"); - my $numPositions = 1; - foreach my $j (2..15) { - $numPositions = $j if $template =~ m/position${j}\_loop/; - } - my @found; - my $showPerformance = $self->session->errorHandler->canShowPerformanceIndicators(); - foreach my $position (@positions) { - my @assets = split(",",$position); - foreach my $asset (@assets) { - foreach my $child (@{$children}) { - if ($asset eq $child->getId) { - unless (isIn($asset,@hidden) || !($child->canView)) { - $self->session->style->setRawHeadTags($child->getExtraHeadTags); - my $t = [Time::HiRes::gettimeofday()] if ($showPerformance); - my $view = $child->view; - $view .= "Asset:".Time::HiRes::tv_interval($t) if ($showPerformance); - if ($i > $numPositions) { - push(@{$vars{"position1_loop"}},{ - id=>$child->getId, - content=>$view - }); - } else { - push(@{$vars{"position".$i."_loop"}},{ - id=>$child->getId, - content=>$view - }); - } - } - push(@found, $child->getId); - } - } - } - $i++; - } - # deal with unplaced children - foreach my $child (@{$children}) { - unless (isIn($child->getId, @found)||isIn($child->getId,@hidden)) { - if ($child->canView) { - my $t = [Time::HiRes::gettimeofday()] if ($showPerformance); - my $view = $child->view; - $view .= "Asset:".Time::HiRes::tv_interval($t) if ($showPerformance); - push(@{$vars{"position1_loop"}},{ - id=>$child->getId, - content=>$view - }); - } - } - } - $vars{showAdmin} = ($self->session->var->get("adminOn") && $self->canEdit); - if ($vars{showAdmin}) { - # under normal circumstances we don't put HTML stuff in our code, but this will make it much easier - # for end users to work with our templates - $self->session->style->setScript($self->session->config->get("extrasURL")."/draggable.js",{ type=>"text/javascript" }); - $self->session->style->setLink($self->session->config->get("extrasURL")."/draggable.css",{ type=>"text/css", rel=>"stylesheet", media=>"all" }); - $self->session->style->setRawHeadTags(' - - '); - $vars{"dragger.icon"} = $self->session->icon->drag(); - $vars{"dragger.init"} = ' - - - '; - } - - return $self->processTemplate(\%vars,$self->get("templateId")); -} - -#------------------------------------------------------------------- -sub view { - my $self = shift; my $children = $self->getLineage( ["children"], { returnObjects=>1, excludeClasses=>["WebGUI::Asset::Wobject::Layout"] }); my %vars; # I'm sure there's a more efficient way to do this. We'll figure it out someday. @@ -247,13 +146,14 @@ sub view { my @hidden = split("\n",$self->get("assetsToHide")); my @placeHolder = (); my $i = 1; - my $template= WebGUI::Asset->newByDynamicClass($self->session,$self->get("templateId"))->get("template"); + my $template = WebGUI::Asset->new($self->session,$self->get("templateId"),"WebGUI::Asset::Template"); + my $templateContent = $template->get("template"); + $self->{_viewTemplate} = $template; my $numPositions = 1; foreach my $j (2..15) { - $numPositions = $j if $template =~ m/position${j}\_loop/; + $numPositions = $j if $templateContent =~ m/position${j}\_loop/; } my @found; - my $showPerformance = $self->session->errorHandler->canShowPerformanceIndicators(); foreach my $position (@positions) { my @assets = split(",",$position); foreach my $asset (@assets) { @@ -261,6 +161,7 @@ sub view { if ($asset eq $child->getId) { unless (isIn($asset,@hidden) || !($child->canView)) { $self->session->style->setRawHeadTags($child->getExtraHeadTags); + $child->prepareView; push(@placeHolder, $child); if ($i > $numPositions) { push(@{$vars{"position1_loop"}},{ @@ -284,6 +185,7 @@ sub view { foreach my $child (@{$children}) { unless (isIn($child->getId, @found)||isIn($child->getId,@hidden)) { if ($child->canView) { + $child->prepareView; push(@placeHolder, $child); push(@{$vars{"position1_loop"}},{ id=>$child->getId, @@ -292,22 +194,44 @@ sub view { } } } - $vars{showAdmin} = ($self->session->var->get("adminOn") && $self->canEdit); + $self->{_viewPlaceholders} = \@placeHolder; + $vars{showAdmin} = ($self->session->var->isAdminOn && $self->canEdit); + $self->{_viewVars} = \%vars; if ($vars{showAdmin}) { # under normal circumstances we don't put HTML stuff in our code, but this will make it much easier # for end users to work with our templates - $vars{"dragger.icon"} = $self->session->icon->drag(); - $vars{"dragger.init"} = ' + $self->session->style->setScript($self->session->config->get("extrasURL")."/draggable.js",{ type=>"text/javascript" }); + $self->session->style->setLink($self->session->config->get("extrasURL")."/draggable.css",{ type=>"text/css", rel=>"stylesheet", media=>"all" }); + $self->session->style->setRawHeadTags(' + + '); + } +} + +#------------------------------------------------------------------- +sub view { + my $self = shift; + if ($self->{_viewVars}{showAdmin}) { + # under normal circumstances we don't put HTML stuff in our code, but this will make it much easier + # for end users to work with our templates + $self->{_viewVars}{"dragger.icon"} = $self->session->icon->drag(); + $self->{_viewVars}{"dragger.init"} = ' '; } - my @parts = split("~~~",$self->processTemplate(\%vars,$self->get("templateId"))); + my $showPerformance = $self->session->errorHandler->canShowPerformanceIndicators(); + my $out = $self->processTemplate($self->{_viewVars},undef,$self->{_viewTemplate}); + my @parts = split("~~~",$self->processTemplate($self->{_viewVars},undef,$self->{_viewTemplate})); foreach my $part (@parts) { $self->session->output->print($part); - my $asset = shift @placeHolder; + my $asset = shift @{$self->{_viewPlaceholders}}; if (defined $asset) { my $t = [Time::HiRes::gettimeofday()] if ($showPerformance); $self->session->output->print($asset->view); @@ -325,16 +249,5 @@ sub www_setContentPositions { return "Map set: ".$self->session->form->process("map"); } -sub www_view { - my $self = shift; - $self->session->http->getHeader; - $self->prepareView; - my $style = $self->processStyle("~~~"); - my ($head, $foot) = split("~~~",$style); - $self->session->output->print($head); - $self->view; - $self->session->output->print($foot); -} - 1; diff --git a/lib/WebGUI/Asset/_NewAsset.skeleton b/lib/WebGUI/Asset/_NewAsset.skeleton index bcd0945aa..0fe98ee95 100644 --- a/lib/WebGUI/Asset/_NewAsset.skeleton +++ b/lib/WebGUI/Asset/_NewAsset.skeleton @@ -191,6 +191,23 @@ sub indexContent { } +#------------------------------------------------------------------- + +=head2 prepareView ( ) + +See WebGUI::Asset::prepareView() for details. + +=cut + +sub prepareView { + my $self = shift; + $self->SUPER::prepareView(); + my $template = WebGUI::Asset::Template->new($self->session, $self->get("templateId")); + $template->prepare; + $self->{_viewTemplate} = $template; +} + + #------------------------------------------------------------------- =head2 processPropertiesFromFormPost ( ) @@ -250,7 +267,7 @@ sub view { $var->{controls} = $self->getToolbar; $var->{fileUrl} = $self->getFileUrl; $var->{fileIcon} = $self->getFileIconUrl; - return $self->processTemplate($var,$self->getValue("templateId")); + return $self->processTemplate($var,undef, $self->{_viewTemplate}); } diff --git a/lib/WebGUI/Session/ErrorHandler.pm b/lib/WebGUI/Session/ErrorHandler.pm index ac26bc3c0..799bfa73d 100644 --- a/lib/WebGUI/Session/ErrorHandler.pm +++ b/lib/WebGUI/Session/ErrorHandler.pm @@ -85,6 +85,7 @@ Returns true if the user meets the condition to see debugging information and de sub canShowDebug { my $self = shift; return 0 unless ($self->session->setting->get("showDebug")); + return 0 unless ($self->session->http->getMimeType eq "text/html"); return 1 if ($self->session->setting->get("debugIp") eq ""); my @ips = split(" ",$self->session->setting->get("debugIp")); my $ok = 0;