rewrote the template api and added lots of caching options

This commit is contained in:
JT Smith 2004-06-15 17:36:25 +00:00
parent 6613992f3d
commit 20482def49
24 changed files with 252 additions and 100 deletions

View file

@ -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;

View file

@ -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'} = "</form>";
$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);
}
#-------------------------------------------------------------------

View file

@ -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);
}
#-------------------------------------------------------------------

View file

@ -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);
}
#-------------------------------------------------------------------

View file

@ -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'} = "</form>";
return WebGUI::Template::process(WebGUI::Template::get(1,'Auth/WebGUI/Expired'), $vars);
return WebGUI::Template::process(1,'Auth/WebGUI/Expired', $vars);
}
#-------------------------------------------------------------------

View file

@ -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);
}
}

View file

@ -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'} = '</form>';
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);
}
}

View file

@ -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);
}

View file

@ -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'} = '</form>';
return WebGUI::Template::process(WebGUI::Template::get($templateId,"Macro/L_loginBox"),\%var);
return WebGUI::Template::process($templateId,"Macro/L_loginBox",\%var);
}
1;

View file

@ -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);
}
}
#-------------------------------------------------------------------

View file

@ -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;

View file

@ -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;

View file

@ -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} = "<table>\n<tr>\n<td>\n\n<tmpl_var page.position1>\n\n</td>\n </tr>\n</table>\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;

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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;

View file

@ -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);
}
#-------------------------------------------------------------------

View file

@ -566,7 +566,7 @@ sub www_viewEvent {
$var{"next.label"} = WebGUI::International::get(93,$_[0]->get("namespace")).'&raquo;';
$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;

View file

@ -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}),

View file

@ -563,7 +563,7 @@ sub www_editSubmission {
});
$var{'form.submit'} = WebGUI::Form::submit();
$var{'form.footer'} = '</form>';
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");
}