diff --git a/docs/changelog/6.x.x.txt b/docs/changelog/6.x.x.txt index affbb8284..5814c0db9 100644 --- a/docs/changelog/6.x.x.txt +++ b/docs/changelog/6.x.x.txt @@ -10,7 +10,15 @@ - Fixed a bug in articles where articles with no content would fail to display their images. - bugfix [966466] WebGUI::Session. System crash when user language setting missing. - - Eliminated the need for Data::Serializer. + - Eliminated the need for Data::Serializer which results in a small amount of + less memory usage. + - Rewrote the template API which resulted in a 30% performance increase. See + docs/migration.txt for details. + - Added five new caching mechanisms for templates. Each has their own + benefits and detriments. This allows you to increase scalability and + performance at a cost of either memory or disk space or both. The gains + here are primarily enjoyed by large heavy traffic sites that use lots of + templates. 6.0.3 diff --git a/docs/gotcha.txt b/docs/gotcha.txt index ed52b3b21..cf7ed110e 100644 --- a/docs/gotcha.txt +++ b/docs/gotcha.txt @@ -14,6 +14,8 @@ save you many hours of grief. * You no longer need Data::Serializer. + * See docs/migration.txt for changes in the template system. + 6.0.2 -------------------------------------------------------------------- diff --git a/docs/migration.txt b/docs/migration.txt index 278ff93b4..6c54e44d1 100644 --- a/docs/migration.txt +++ b/docs/migration.txt @@ -113,11 +113,16 @@ to load the plug-in at use time. 5.5 Privilege API Change -In 6.1 we move isInGroup from WebGUI::Privilege to WebGUI::Grouping, where it +In 6.1 we moved isInGroup from WebGUI::Privilege to WebGUI::Grouping, where it belongs. We also moved canViewPage and canEditPage to WebGUI::Page and renamed them to canView and canEdit. And finally, we moved canEditWobject and canViewWobject to WebGUI::Wobject and renamed them canView and canEdit and converted them from regular functions into methods. +5.6 Template API Change + +In 6.1 we completely rewrote the underlying template framework to add template +caching. Any plug-ins that use WebGUI::Template, must be updated to reflect +the new API. diff --git a/etc/WebGUI.conf.original b/etc/WebGUI.conf.original index 86bd6de62..ee4e55339 100644 --- a/etc/WebGUI.conf.original +++ b/etc/WebGUI.conf.original @@ -14,6 +14,8 @@ uploadsPath = /data/WebGUI/www/uploads useSharedInternationalCache = 1 +templateCacheType=file + emailRecoveryLoggingEnabled = 1 passwordChangeLoggingEnabled = 1 diff --git a/lib/WebGUI/Attachment.pm b/lib/WebGUI/Attachment.pm index 7bbd7f8a8..e211288a7 100644 --- a/lib/WebGUI/Attachment.pm +++ b/lib/WebGUI/Attachment.pm @@ -66,6 +66,7 @@ Package to manipulate WebGUI Attachments. $filename = $attachment->save("formImage"); $filename = $attachment->saveFromFilesystem($pathToFile); + $filename = $attachment->saveFromScalar($content); $filename = $attachment->saveFromHashref($hashRef); $hashRef = $attachment->getHashref; @@ -681,6 +682,32 @@ sub saveFromHashref { return $self->getFilename; } + +#------------------------------------------------------------------- + +=head2 saveFromScalar ( scalar ) + +Stores a scalar as a text attachment. + +=over + +=item scalar + +A scalar variable containing the content to write to the filesystem. + +=back + +=cut + +sub saveFromScalar { + my ($self, $content) = @_; + $self->getNode->create(); + open(FILE,">".$self->getPath); + print FILE $content; + close(FILE); + return $self->getFilename; +} + 1; diff --git a/lib/WebGUI/Auth.pm b/lib/WebGUI/Auth.pm index ae0223992..d47846402 100644 --- a/lib/WebGUI/Auth.pm +++ b/lib/WebGUI/Auth.pm @@ -218,7 +218,7 @@ sub createAccount { $vars->{'login.url'} = WebGUI::URL::page('op=auth&method=init'); $vars->{'login.label'} = WebGUI::International::get(58); - return WebGUI::Template::process(WebGUI::Template::get(1,$template), $vars); + return WebGUI::Template::process(1,$template, $vars); } #------------------------------------------------------------------- @@ -306,7 +306,7 @@ sub deactivateAccount { $var{'yes.label'} = WebGUI::International::get(44); $var{'no.url'} = WebGUI::URL::page(); $var{'no.label'} = WebGUI::International::get(45); - return WebGUI::Template::process(WebGUI::Template::get(1,"prompt"), \%var); + return WebGUI::Template::process(1,"prompt", \%var); } #------------------------------------------------------------------- @@ -379,7 +379,7 @@ sub displayAccount { $vars->{'account.form.footer'} = ""; $vars->{'account.options'} = WebGUI::Operation::Shared::accountOptions(); - return WebGUI::Template::process(WebGUI::Template::get(1,$template), $vars); + return WebGUI::Template::process(1,$template, $vars); } #------------------------------------------------------------------- @@ -430,7 +430,7 @@ sub displayLogin { $vars->{'anonymousRegistration.isAllowed'} = ($session{setting}{anonymousRegistration}); $vars->{'createAccount.url'} = WebGUI::URL::page('op=createAccount'); $vars->{'createAccount.label'} = WebGUI::International::get(67); - return WebGUI::Template::process(WebGUI::Template::get(1,$template), $vars); + return WebGUI::Template::process(1,$template, $vars); } #------------------------------------------------------------------- diff --git a/lib/WebGUI/Auth/LDAP.pm b/lib/WebGUI/Auth/LDAP.pm index bca2fe31b..bdb2b8d30 100644 --- a/lib/WebGUI/Auth/LDAP.pm +++ b/lib/WebGUI/Auth/LDAP.pm @@ -261,7 +261,7 @@ sub displayAccount { $vars->{'account.form.karma.label'} = WebGUI::International::get(537); } $vars->{'account.options'} = WebGUI::Operation::Shared::accountOptions(); - return WebGUI::Template::process(WebGUI::Template::get(1,'Auth/LDAP/Account'), $vars); + return WebGUI::Template::process(1,'Auth/LDAP/Account', $vars); } #------------------------------------------------------------------- diff --git a/lib/WebGUI/Auth/SMB.pm b/lib/WebGUI/Auth/SMB.pm index a44275f45..cc3c34658 100644 --- a/lib/WebGUI/Auth/SMB.pm +++ b/lib/WebGUI/Auth/SMB.pm @@ -169,7 +169,7 @@ sub displayAccount { $vars->{'account.form.karma.label'} = WebGUI::International::get(537); } $vars->{'account.options'} = WebGUI::Operation::Shared::accountOptions(); - return WebGUI::Template::process(WebGUI::Template::get(1,'Auth/SMB/Account'), $vars); + return WebGUI::Template::process(1,'Auth/SMB/Account', $vars); } #------------------------------------------------------------------- diff --git a/lib/WebGUI/Auth/WebGUI.pm b/lib/WebGUI/Auth/WebGUI.pm index 5c999a13a..92a456d1f 100644 --- a/lib/WebGUI/Auth/WebGUI.pm +++ b/lib/WebGUI/Auth/WebGUI.pm @@ -400,7 +400,7 @@ sub recoverPassword { $vars->{'recover.message'} = $_[0] if ($_[0]); $vars->{'recover.form.email'} = WebGUI::Form::text({"name"=>"email"}); $vars->{'recover.form.email.label'} = WebGUI::International::get(56); - return WebGUI::Template::process(WebGUI::Template::get(1,$template), $vars); + return WebGUI::Template::process(1,$template, $vars); } #------------------------------------------------------------------- @@ -459,7 +459,7 @@ sub resetExpiredPassword { $vars->{'expired.form.submit'} = WebGUI::Form::submit({}); $vars->{'expired.form.footer'} = ""; - return WebGUI::Template::process(WebGUI::Template::get(1,'Auth/WebGUI/Expired'), $vars); + return WebGUI::Template::process(1,'Auth/WebGUI/Expired', $vars); } #------------------------------------------------------------------- diff --git a/lib/WebGUI/Form.pm b/lib/WebGUI/Form.pm index f1dd9527d..3d818a33c 100644 --- a/lib/WebGUI/Form.pm +++ b/lib/WebGUI/Form.pm @@ -991,7 +991,7 @@ sub HTMLArea { if ($session{user}{richEditor} eq 'none') { return $var{textarea}; } else { - return WebGUI::Template::process(WebGUI::Template::get($session{user}{richEditor},'richEditor'),\%var); + return WebGUI::Template::process($session{user}{richEditor},'richEditor',\%var); } } diff --git a/lib/WebGUI/Forum/UI.pm b/lib/WebGUI/Forum/UI.pm index 2cef91b94..117f4d2c8 100644 --- a/lib/WebGUI/Forum/UI.pm +++ b/lib/WebGUI/Forum/UI.pm @@ -1249,7 +1249,7 @@ sub getPostTemplateVars { $var->{'post.deny.url'} = formatDenyPostURL($callback,$post->get("forumPostId")); $var->{'forum.title'} = $callback->{title}; $var->{'forum.description'} = $callback->{description}; - $var->{'post.full'} = WebGUI::Template::process(WebGUI::Template::get($forum->get("postTemplateId"),"Forum/Post"), $var); + $var->{'post.full'} = WebGUI::Template::process($forum->get("postTemplateId"),"Forum/Post", $var); return $var; } @@ -1382,7 +1382,7 @@ sub notifySubscribers { $lang{$u->profileField("language")}{var} = getPostTemplateVars($post, $thread, $forum, $caller, $lang{$u->profileField("language")}{var}); $lang{$u->profileField("language")}{subject} = WebGUI::International::get(523,"WebGUI",$u->profileField("language")); $lang{$u->profileField("language")}{message} = WebGUI::Template::process( - WebGUI::Template::get($forum->get("notificationTemplateId"),"Forum/Notification"), + $forum->get("notificationTemplateId"),"Forum/Notification", $lang{$u->profileField("language")}{var} ); } @@ -1886,7 +1886,7 @@ sub www_post { value=>$subject }); $var->{'form.end'} = ''; - return WebGUI::Template::process(WebGUI::Template::get($forum->get("postformTemplateId"),"Forum/PostForm"), $var); + return WebGUI::Template::process($forum->get("postformTemplateId"),"Forum/PostForm", $var); } #------------------------------------------------------------------- @@ -2119,7 +2119,7 @@ sub www_search { $var{numberOfPages} = $p->getNumberOfPages; $var{pageNumber} = $p->getPageNumber; } - return WebGUI::Template::process(WebGUI::Template::get($forum->get("searchTemplateId"),"Forum/Search"), \%var); + return WebGUI::Template::process($forum->get("searchTemplateId"),"Forum/Search", \%var); } #------------------------------------------------------------------- @@ -2293,7 +2293,7 @@ sub www_viewForum { my $forum = WebGUI::Forum->new($forumId); return WebGUI::Privilege::insufficient() unless ($forum->canView); my $var = getForumTemplateVars($caller, $forum); - return WebGUI::Template::process(WebGUI::Template::get($forum->get("forumTemplateId"),"Forum"), $var); + return WebGUI::Template::process($forum->get("forumTemplateId"),"Forum", $var); } #------------------------------------------------------------------- @@ -2332,7 +2332,7 @@ sub www_viewThread { if ($post->get("forumPostId") == $post->getThread->get("rootPostId") && !$post->canView) { return www_viewForum($caller, $post->getThread->getForum->get("forumId")); } else { - return WebGUI::Template::process(WebGUI::Template::get($post->getThread->getForum->get("threadTemplateId"),"Forum/Thread"), $var); + return WebGUI::Template::process($post->getThread->getForum->get("threadTemplateId"),"Forum/Thread", $var); } } diff --git a/lib/WebGUI/Macro/AdminBar.pm b/lib/WebGUI/Macro/AdminBar.pm index bedef9203..fbbc49c48 100644 --- a/lib/WebGUI/Macro/AdminBar.pm +++ b/lib/WebGUI/Macro/AdminBar.pm @@ -209,7 +209,7 @@ sub process { $i++; } $var{'admin_loop'} = \@admin; - return WebGUI::Template::process(WebGUI::Template::get($templateId,"Macro/AdminBar"),\%var); + return WebGUI::Template::process($templateId,"Macro/AdminBar",\%var); } diff --git a/lib/WebGUI/Macro/L_loginBox.pm b/lib/WebGUI/Macro/L_loginBox.pm index f43fddf6a..b3f3fd6e9 100644 --- a/lib/WebGUI/Macro/L_loginBox.pm +++ b/lib/WebGUI/Macro/L_loginBox.pm @@ -64,7 +64,7 @@ sub process { $var{'account.create.url'} = WebGUI::URL::page('op=createAccount'); $var{'account.create.label'} = WebGUI::International::get(407); $var{'form.footer'} = ''; - return WebGUI::Template::process(WebGUI::Template::get($templateId,"Macro/L_loginBox"),\%var); + return WebGUI::Template::process($templateId,"Macro/L_loginBox",\%var); } 1; diff --git a/lib/WebGUI/Navigation.pm b/lib/WebGUI/Navigation.pm index 8a826bd08..41a7694d5 100644 --- a/lib/WebGUI/Navigation.pm +++ b/lib/WebGUI/Navigation.pm @@ -337,8 +337,11 @@ sub build { # Configure button $var->{'config.button'} = $self->_getEditButton(); - - return WebGUI::Template::process($self->{_template} || WebGUI::Template::get($self->{_templateId}, "Navigation"), $var); + if ($self->{_template}) { + return WebGUI::Template::processRaw($self->{_template}, $var); + } else { + return WebGUI::Template::process($self->{_templateId}, "Navigation", $var); + } } #------------------------------------------------------------------- diff --git a/lib/WebGUI/Operation/MessageLog.pm b/lib/WebGUI/Operation/MessageLog.pm index ba84a3464..0b85e3ff3 100644 --- a/lib/WebGUI/Operation/MessageLog.pm +++ b/lib/WebGUI/Operation/MessageLog.pm @@ -68,7 +68,7 @@ sub www_viewMessageLog { $vars->{'message.multiplePages'} = ($p->getNumberOfPages > 1); $vars->{'message.accountOptions'} = WebGUI::Operation::Shared::accountOptions(); - return WebGUI::Template::process(WebGUI::Template::get(1,'Operation/MessageLog/View'), $vars); + return WebGUI::Template::process(1,'Operation/MessageLog/View', $vars); } #------------------------------------------------------------------- @@ -95,7 +95,7 @@ sub www_viewMessageLogMessage { $vars->{'message.text'} = $data->{message}; $vars->{'message.accountOptions'} = WebGUI::Operation::Shared::accountOptions(); - return WebGUI::Template::process(WebGUI::Template::get(1,'Operation/MessageLog/Message'), $vars); + return WebGUI::Template::process(1,'Operation/MessageLog/Message', $vars); } 1; diff --git a/lib/WebGUI/Operation/Profile.pm b/lib/WebGUI/Operation/Profile.pm index 2ff13385f..881fb29b1 100644 --- a/lib/WebGUI/Operation/Profile.pm +++ b/lib/WebGUI/Operation/Profile.pm @@ -195,7 +195,7 @@ sub www_editProfile { $vars->{'profile.form.elements'} = \@array; $vars->{'profile.form.submit'} = WebGUI::Form::submit({}); $vars->{'profile.accountOptions'} = WebGUI::Operation::Shared::accountOptions(); - return WebGUI::Template::process(WebGUI::Template::get(1,'Operation/Profile/Edit'), $vars); + return WebGUI::Template::process(1,'Operation/Profile/Edit', $vars); } #------------------------------------------------------------------- @@ -257,7 +257,7 @@ sub www_viewProfile { if ($session{user}{userId} == $session{form}{uid}) { $vars->{'profile.accountOptions'} = WebGUI::Operation::Shared::accountOptions(); } - return WebGUI::Template::process(WebGUI::Template::get(1,'Operation/Profile/View'), $vars); + return WebGUI::Template::process(1,'Operation/Profile/View', $vars); } 1; diff --git a/lib/WebGUI/Operation/Template.pm b/lib/WebGUI/Operation/Template.pm index 4bb559fa2..c452d08d5 100644 --- a/lib/WebGUI/Operation/Template.pm +++ b/lib/WebGUI/Operation/Template.pm @@ -53,13 +53,11 @@ sub _submenu { #------------------------------------------------------------------- sub www_copyTemplate { - my (%template); if (WebGUI::Grouping::isInGroup(8)) { - %template = WebGUI::SQL->quickHash("select * from template where templateId=$session{form}{tid} and namespace=".quote($session{form}{namespace})); - WebGUI::SQL->write("insert into template (templateId,name,template,namespace) - values ("._getNextTemplateId($session{form}{namespace}).", - ".quote('Copy of '.$template{name}).", ".quote($template{template}).", - ".quote($template{namespace}).")"); + my $template = WebGUI::Template::get($session{form}{tid},$session{form}{namespace}); + $template->{name} .= " (copy)"; + $template->{templateId} = "new"; + WebGUI::Template::set($template); return www_listTemplates(); } else { return WebGUI::Privilege::adminOnly(); @@ -157,17 +155,15 @@ sub www_editTemplate { #------------------------------------------------------------------- sub www_editTemplateSave { if (WebGUI::Grouping::isInGroup(8)) { - if ($session{form}{tid} eq "new") { - $session{form}{tid} = _getNextTemplateId($session{form}{namespace}); - WebGUI::SQL->write("insert into template (templateId,namespace) values - ($session{form}{tid}, ".quote($session{form}{namespace}).")"); - } if ($session{form}{template} eq "" && $session{form}{namespace} eq "Page") { $session{form}{template} = "\n\n\n \n
\n\n\n\n
\n"; } - WebGUI::SQL->write("update template set name=".quote($session{form}{name}).", - template=".quote($session{form}{template})." - where templateId=".$session{form}{tid}." and namespace=".quote($session{form}{namespace})); + $session{form}{tid} = WebGUI::Template::set({ + templateId=>$session{form}{tid}, + namespace=>$session{form}{namespace}, + name=>$session{form}{name}, + template=>$session{form}{template} + }); if ($session{form}{action2} eq "") { return www_listTemplates(); } else { @@ -209,20 +205,5 @@ sub www_listTemplates { } } -sub _getNextTemplateId { - my $namespace = shift; - my $templateId; - my $query = "select max(templateId) from template"; - if ($namespace) { - $query .= " where namespace = ".quote($namespace); - } - ($templateId) = WebGUI::SQL->quickArray($query); - if ($templateId > 999) { - $templateId++; - } else { - $templateId = 1000; - } - return $templateId; -} 1; diff --git a/lib/WebGUI/Page.pm b/lib/WebGUI/Page.pm index 40d8cfdfa..ba2f4aec1 100644 --- a/lib/WebGUI/Page.pm +++ b/lib/WebGUI/Page.pm @@ -451,7 +451,7 @@ sub generate { WebGUI::ErrorHandler::fatalError("Wobject runtime error: ${$wobject}{namespace}. Root cause: ".$@) if($@); } $sth->finish; - return WebGUI::Template::process(getTemplate(),\%var); + return WebGUI::Template::process($session{page}{templateId},"Page",\%var); } diff --git a/lib/WebGUI/Style.pm b/lib/WebGUI/Style.pm index 5cf8d2f56..c498baa77 100644 --- a/lib/WebGUI/Style.pm +++ b/lib/WebGUI/Style.pm @@ -88,7 +88,7 @@ The unique identifier for the template to retrieve. Defaults to the style templa sub process { my %var; $var{'body.content'} = shift; - my $templateId = shift; + my $templateId = shift || $session{page}{styleId}; if ($session{page}{makePrintable}) { $templateId = $session{page}{printableStyleId}; } elsif ($session{page}{useAdminStyle} ne "" && $session{setting}{useAdminStyle}) { @@ -158,7 +158,7 @@ sub process { '; } } - return WebGUI::Template::process(getTemplate($templateId),\%var); + return WebGUI::Template::process($templateId,"style",\%var); } diff --git a/lib/WebGUI/Template.pm b/lib/WebGUI/Template.pm index 8358d83a9..2155ca710 100644 --- a/lib/WebGUI/Template.pm +++ b/lib/WebGUI/Template.pm @@ -18,6 +18,7 @@ package WebGUI::Template; use HTML::Template; use strict; +use WebGUI::Attachment; use WebGUI::ErrorHandler; use WebGUI::International; use WebGUI::Session; @@ -35,9 +36,10 @@ This package contains utility methods for WebGUI's template system. =head1 SYNOPSIS use WebGUI::Template; - $template = WebGUI::Template::get($templateId, $namespace); + $hashRef = WebGUI::Template::get($templateId, $namespace); $hashRef = WebGUI::Template::getList($namespace); - $html = WebGUI::Template::process($template); + $html = WebGUI::Template::process($templateId, $namespace, $vars); + $templateId = WebGUI::Template::set(\%data); =head1 METHODS @@ -47,10 +49,47 @@ These subroutines are available from this package: #------------------------------------------------------------------- +sub _getTemplateFile { + my $templateId = shift; + my $namespace = shift; + my $filename = $namespace."-".$templateId.".tmpl"; + $filename =~ s/\//-/g; + $filename =~ s/ /-/g; + return WebGUI::Attachment->new($filename,"temp","templates"); +} -=head2 get ( [ templateId, namespace ] ) -Returns a template. +#------------------------------------------------------------------- +sub _execute { + my $params = shift; + my $vars = shift; + my $t; + eval { + $t = HTML::Template->new(%{$params}); + }; + unless ($@) { + while (my ($section, $hash) = each %session) { + next unless (ref $hash eq 'HASH'); + while (my ($key, $value) = each %$hash) { + unless (lc($key) eq "password" || lc($key) eq "identifier") { + $t->param("session.".$section.".".$key=>$value); + } + } + } + $t->param(%{$vars}); + $t->param("webgui.version"=>$WebGUI::VERSION); + return $t->output; + } else { + WebGUI::ErrorHandler::warn("Error in template. ".$@); + return WebGUI::International::get(848).$@; + } +} + +#------------------------------------------------------------------- + +=head2 get ( templateId, namespace ) + +Returns a hash reference containing all of the template parameters. =over @@ -67,11 +106,9 @@ Defaults to "Page". Specify the namespace of the template to retrieve. =cut sub get { - my $templateId = $_[0] || 1; - my $namespace = $_[1] || "Page"; - my ($template) = WebGUI::SQL->quickArray("select template from template - where templateId=".$templateId." and namespace=".quote($namespace)); - return $template; + my $templateId = shift || 1; + my $namespace = shift || "Page"; + return WebGUI::SQL->quickHashRef("select * from template where templateId=".$templateId." and namespace=".quote($namespace)); } @@ -99,15 +136,19 @@ sub getList { #------------------------------------------------------------------- -=head2 process ( template [ , vars ] ) +=head2 process ( templateId, namespace, vars ) Evaluate a template replacing template commands for HTML. =over -=item template +=item templateId -The template to process. +Defaults to "1". Specify the templateId of the template to retrieve. + +=item namespace + +Defaults to "Page". Specify the namespace of the template to retrieve. =item vars @@ -118,35 +159,117 @@ A hash reference containing template variables and loops. Automatically includes =cut sub process { - my ($t, $test, $html); - $html = $_[0]; - eval { - $t = HTML::Template->new( - scalarref=>\$html, - global_vars=>1, - loop_context_vars=>1, - die_on_bad_params=>0, - strict=>0 - ); - }; - unless ($@) { - while (my ($section, $hash) = each %session) { - next unless (ref $hash eq 'HASH'); - while (my ($key, $value) = each %$hash) { - unless (lc($key) eq "password" || lc($key) eq "identifier") { - $t->param("session.".$section.".".$key=>$value); - } - } - } - $t->param(%{$_[1]}); - $t->param("webgui.version"=>$WebGUI::VERSION); - return $t->output; - } else { - WebGUI::ErrorHandler::warn("Error in template. ".$@); - return WebGUI::International::get(848).$html; + my $templateId = shift || 1; + my $namespace = shift || "Page"; + my $vars = shift; + my $file = _getTemplateFile($templateId,$namespace); + my %params = ( + filename=>$file->getPath, + global_vars=>1, + loop_context_vars=>1, + die_on_bad_params=>0, + no_includes=>1, + file_cache_dir=>$session{config}{uploadsPath}.$session{os}{slash}."temp".$session{os}{slash}."templatecache", + strict=>0 + ); + if ($session{config}{templateCacheType} eq "file") { + $params{file_cache} = 1; + } elsif ($session{config}{templateCacheType} eq "memory") { + $params{cache} = 1; + } elsif ($session{config}{templateCacheType} eq "ipc") { + $params{shared_cache} = 1; + } elsif ($session{config}{templateCacheType} eq "memory-ipc") { + $params{double_cache} = 1; + } elsif ($session{config}{templateCacheType} eq "memory-file") { + $params{double_file_cache} = 1; } + unless (-f $file->getPath) { + my ($template) = WebGUI::SQL->quickArray("select template from template where templateId=".$templateId." and namespace=".quote($namespace)); + $file->saveFromScalar($template); + } + return _execute(\%params,$vars); } +#------------------------------------------------------------------- + +=head2 processRaw ( template, vars ) + +Evaluate a template replacing template commands for HTML. + +=over + +=item template + +A scalar variable containing the template. + +=item vars + +A hash reference containing template variables and loops. Automatically includes the entire WebGUI session. + +=back + +=cut + +sub processRaw { + my $template = shift; + my $vars = shift; + return _execute({ + scalarref=>\$template, + global_vars=>1, + loop_context_vars=>1, + die_on_bad_params=>0, + no_includes=>1, + strict=>0 + },$vars); +} + +#------------------------------------------------------------------- + +=head2 set ( data ) + +Store a template and it's metadata. + +=over + +=item data + +A hash reference containing the data to be stored. At minimum the hash reference must include "templateId" and "namespace". The following are the elements allowed to be stored. + + templateId - The unique id for the template. If set to "new" then a new one will be generated. + + namespace - The namespace division for this template. + + template - The content of the template. + + name - A human friendly name for the template. + + showInForms - A boolean indicating whether this template should appear when using the "template" subroutine in WebGUI::Form. + + isEditable - A boolean indicating whether this template should be editable through the template manager. + +=back + +=cut + +sub set { + my $data = shift; + if ($data->{templateId} eq "new") { + ($data->{templateId}) = WebGUI::SQL->quickArray("select max(templateId) from template where namespace=".quote($data->{namespace})); + $data->{templateId}++; + if ($data->{templateId} < 1000) { + $data->{templateId} = 1000; + } + WebGUI::SQL->write("insert into template (templateId,namespace) values (".$data->{templateId}.",".quote($data->{namespace}).")"); + } + my @pairs; + foreach my $key (keys %{$data}) { + push(@pairs, $key."=".quote($data->{$key})) unless ($key eq "namespace" || $key eq "templateId"); + } + WebGUI::SQL->write("update template set ".join(",",@pairs)." where templateId=".$data->{templateId}." and namespace=".quote($data->{namespace})); + my $file = _getTemplateFile($data->{templateId},$data->{namespace}); + $file->delete; + return $data->{templateId}; +} 1; diff --git a/lib/WebGUI/Wobject.pm b/lib/WebGUI/Wobject.pm index a5f2e8a69..6025fd1ef 100644 --- a/lib/WebGUI/Wobject.pm +++ b/lib/WebGUI/Wobject.pm @@ -797,7 +797,7 @@ sub processTemplate { $vars{originalURL} = WebGUI::URL::gateway($originalPageURL."#".$_[0]->get("wobjectId")); } my $namespace = $_[3] || $_[0]->get("namespace"); - return WebGUI::Template::process(WebGUI::Template::get($_[1],$namespace), \%vars); + return WebGUI::Template::process($_[1],$namespace, \%vars); } #------------------------------------------------------------------- diff --git a/lib/WebGUI/Wobject/EventsCalendar.pm b/lib/WebGUI/Wobject/EventsCalendar.pm index 6038c6287..4df145dfa 100644 --- a/lib/WebGUI/Wobject/EventsCalendar.pm +++ b/lib/WebGUI/Wobject/EventsCalendar.pm @@ -566,7 +566,7 @@ sub www_viewEvent { $var{"next.label"} = WebGUI::International::get(93,$_[0]->get("namespace")).'»'; $var{"next.url"} = WebGUI::URL::page("func=viewEvent&wid=".$_[0]->get("wobjectId")."&eid=".$id) if ($id); $var{description} = $event{description}; - return WebGUI::Template::process( WebGUI::Template::get( $_[0]->get("eventTemplateId"), "EventsCalendar/Event"), \%var); + return $_[0]->processTemplate($_[0]->get("eventTemplateId"),\%var, "EventsCalendar/Event"); } 1; diff --git a/lib/WebGUI/Wobject/SiteMap.pm b/lib/WebGUI/Wobject/SiteMap.pm index e53a47726..e182e0c46 100644 --- a/lib/WebGUI/Wobject/SiteMap.pm +++ b/lib/WebGUI/Wobject/SiteMap.pm @@ -15,6 +15,7 @@ use Tie::CPHash; use WebGUI::HTMLForm; use WebGUI::Icon; use WebGUI::International; +use WebGUI::Page; use WebGUI::Privilege; use WebGUI::Session; use WebGUI::SQL; @@ -42,7 +43,7 @@ sub _traversePageTree { } $sth = WebGUI::SQL->read("select urlizedTitle, menuTitle, title, pageId, synopsis from page where parentId='$parent' and hideFromNavigation = 0 order by $orderBy"); while ($data = $sth->hashRef) { - if (($data->{pageId}<0 || $data->{pageId}>999 || $data->{pageId}==1) && WebGUI::Privilege::canViewPage($data->{pageId})) { + if (($data->{pageId}<0 || $data->{pageId}>999 || $data->{pageId}==1) && WebGUI::Page::canView($data->{pageId})) { push(@pages,{ "page.indent" => $indentString, "page.url" => WebGUI::URL::gateway($data->{urlizedTitle}), diff --git a/lib/WebGUI/Wobject/USS.pm b/lib/WebGUI/Wobject/USS.pm index a73cdc9c2..9ec5ddf57 100644 --- a/lib/WebGUI/Wobject/USS.pm +++ b/lib/WebGUI/Wobject/USS.pm @@ -563,7 +563,7 @@ sub www_editSubmission { }); $var{'form.submit'} = WebGUI::Form::submit(); $var{'form.footer'} = ''; - return WebGUI::Template::process(WebGUI::Template::get($_[0]->get("submissionFormTemplateId"),"USS/SubmissionForm"), \%var); + return $_[0]->processTemplate($_[0]->get("submissionFormTemplateId"),\%var,"USS/SubmissionForm"); } #------------------------------------------------------------------- @@ -891,7 +891,7 @@ sub www_viewSubmission { {callback=>$callback,title=>$submission->{title},forumId=>$submission->{forumId}}, $submission->{forumId}); } - return WebGUI::Template::process(WebGUI::Template::get($_[0]->get("submissionTemplateId"),"USS/Submission"), \%var); + return $_[0]->processTemplate($_[0]->get("submissionTemplateId"),\%var,"USS/Submission"); }