]> git.decadent.org.uk Git - maypole.git/blobdiff - lib/Maypole/View/TT.pm
tested and it seems to work
[maypole.git] / lib / Maypole / View / TT.pm
index 0280e1ef3ab52fdd460d8b5978a0aff598200d31..b7a59a2f565813c9a5c3c4a7ffaee12d845ac232 100644 (file)
@@ -8,48 +8,62 @@ our $error_template;
 { local $/; $error_template = <DATA>; }
 
 use strict;
 { local $/; $error_template = <DATA>; }
 
 use strict;
-our $VERSION = 2.11;
 
 sub template {
 
 sub template {
-    my ( $self, $r ) = @_;
-
-    unless ($self->{tt}) {
-        my $view_options = $r->config->view_options || {};
-        $self->{provider} = Template::Provider->new($view_options);
-        $self->{tt}       = Template->new({
-            %$view_options,
-            LOAD_TEMPLATES => [ $self->{provider} ],
-        });
-    }
-
-    $self->{provider}->include_path([ $self->paths($r) ]);
-
-    my $template_file = $r->template;
-    my $ext = $r->config->template_extension;
-    $template_file .= $ext if defined $ext;
-
-    my $output;
-    if ($self->{tt}->process($template_file, { $self->vars($r) }, \$output )) {
-        $r->{output} = $output;
-        return OK;
-    }
-    else {
-       $r->{error} = "TT error for template '$template_file'\n" . $self->{tt}->error;
-        return ERROR;
+  my ( $self, $r ) = @_;
+  unless ($self->{tt}) {
+    my $view_options = $r->config->view_options || {};
+    $self->{provider} = Template::Provider->new($view_options);
+    $self->{tt}       = Template->new({
+                                      %$view_options,
+                                      LOAD_TEMPLATES => [ $self->{provider} ],
+                                     });
+  }
+
+  $self->{provider}->include_path([ $self->paths($r) ]);
+
+  my $template_file = $r->template;
+
+  my $ext = $r->config->template_extension;
+  $template_file .= $ext if defined $ext;
+
+  my $output;
+  my $processed_ok = eval{$self->{tt}->process($template_file, { $self->vars($r) }, \$output );};
+  if ($processed_ok) {
+    $r->{output} = $output;
+    return OK;
+  } else {
+    if ($@) {
+      warn "fatal error in template '$template_file' : $@\n";
+      $r->{error} = "fatal error in template '$template_file' : $@";
+    } else {
+      warn "TT error for template '$template_file'\n" . $self->{tt}->error;
+      $r->{error} = "TT error for template '$template_file'\n" . $self->{tt}->error;
     }
     }
+    return ERROR;
+  }
 }
 
 
 sub report_error {
     my ($self, $r, $error, $type) = @_;
     my $output;
 }
 
 
 sub report_error {
     my ($self, $r, $error, $type) = @_;
     my $output;
+
+    warn "self : $self, r : $r, error : $error, type : $type\n";
+
     # Need to be very careful here.
     my $tt = Template->new;
     # Need to be very careful here.
     my $tt = Template->new;
+    unless (ref $r->{config}) {
+      warn "no config for this request\n";
+      $error .= '<br> There was a problem finding configuration for this request';
+      $r->{config} ||= {};
+    }
     if ($tt->process(\$error_template,
     if ($tt->process(\$error_template,
-        { err_type => $type, error => $error, 
-         config => { %{$r->{config}}},
-          request => $r, # We have that at least
-        eval{$self->vars($r)} }, \$output )) {
+                    { err_type => $type, error => $error,
+                      config => $r->{config},
+                      request => $r,
+                      paths => $self->paths($r),
+                      eval{$self->vars($r)} }, \$output )) {
         $r->{output} = $output;
         if ($tt->error) { $r->{output} = "<html><body>Even the error template
         errored - ".$tt->error."</body></html>"; }
         $r->{output} = $output;
         if ($tt->error) { $r->{output} = "<html><body>Even the error template
         errored - ".$tt->error."</body></html>"; }
@@ -103,6 +117,10 @@ options.
 
 Processes the template and sets the output. See L<Maypole::View::Base>
 
 
 Processes the template and sets the output. See L<Maypole::View::Base>
 
+=item report_error
+
+Reports the details of an error, current state and parameters
+
 =back
 
 =head1 TEMPLATE TOOLKIT INTRODUCTION
 =back
 
 =head1 TEMPLATE TOOLKIT INTRODUCTION
@@ -141,6 +159,9 @@ or CALL a method or operation which will also not return anything.
 You can specify expressions using the logical (and, or, not, ?:) and mathematic
 operators (+ - * / % mod div).
 
 You can specify expressions using the logical (and, or, not, ?:) and mathematic
 operators (+ - * / % mod div).
 
+Results of TT commands are interpolated in the place of the template tags, unless
+using SET or CALL, i.e. [% SET foo = 1 %], [% GET foo.bar('quz'); %]
+
 =over 4
 
 [% template.title or default.title %]
 =over 4
 
 [% template.title or default.title %]
@@ -265,6 +286,18 @@ truncate, format, escape or encode trivially. A useful selection is included
 with Template Toolkit and they can also be found on CPAN or can be written
 easily. See L<Template::Manual::Filters>.
 
 with Template Toolkit and they can also be found on CPAN or can be written
 easily. See L<Template::Manual::Filters>.
 
+TT provides stderr and stdout filters, which allow you to write handy macros
+like this one to output debug information to your web server log, etc :
+
+=over 4
+
+[% MACRO debug_msg(text)
+    FILTER stderr; "[TT debug_msg] $text\n"; END;
+%]
+
+=back
+
+
 TT Macros allow you to reuse small blocks of content, directives, etc. The MACRO
 directive allows you to define a directive or directive block which is then
 evaluated each time the macro is called. Macros can be passed named parameters
 TT Macros allow you to reuse small blocks of content, directives, etc. The MACRO
 directive allows you to define a directive or directive block which is then
 evaluated each time the macro is called. Macros can be passed named parameters
@@ -276,6 +309,34 @@ and useful macros in the templates/ directory of the package and these are used
 in the beerdb and default templates. See the MACRO section of the
 L<Template::Manual::Directives> documentation.
 
 in the beerdb and default templates. See the MACRO section of the
 L<Template::Manual::Directives> documentation.
 
+=head1 ACCESSING MAYPOLE VALUES
+
+=head2 request
+
+You can access the request in your templates in order to see the action, table, etc as well
+as parameters passed through forms :
+
+for example
+
+Hello [% request.params.forename %] [% request.params.surname %] !
+
+or 
+
+Are you want to [% request.action %] in the [% request.table %] ?
+
+=head2 config
+
+You can access your maypole application configuration through the config variable :
+
+<link base="[% config.uri_base %]"/>
+
+=head2 object and objects
+
+Objects are passed to the request using r->objects($arrayref) and are accessed in the templates
+as an array called objects.
+
+[% FOR objects %] <a href="[% config.uri_base %]/[% request.table %]/view/[% object.id %]"> [% object %] </a> [% END %]
+
 =head1 MAYPOLE MACROS AND FILTERS
 
 Maypole provides a collection of useful and powerful macros in the templates/factory/macros
 =head1 MAYPOLE MACROS AND FILTERS
 
 Maypole provides a collection of useful and powerful macros in the templates/factory/macros
@@ -353,23 +414,27 @@ the path "[% request.path %]". The error text returned was:
 
 <h2> Request details </h2>
 
 
 <h2> Request details </h2>
 
-<table
-    [% FOR thing = ["model_class", "table", "template", "path",
+<table width="85%" cellspacing="2" cellpadding="1">
+    [% FOR attribute = ["model_class", "table", "template", "path",
     "content_type", "document_encoding", "action", "args", "objects"] %]
     "content_type", "document_encoding", "action", "args", "objects"] %]
-    <tr> <td class="lhs"> [%thing %] </td> <td class="rhs"> [%
-    request.$thing.list.join(" , ") %] </td></tr>
+    <tr> <td class="lhs" width="35%"> <b>[% attribute %]</b> </td> <td class="rhs" width="65%"> [%
+    request.$attribute.list.join(" , ") %] </td></tr>
     [% END %]
 </table>
 
     [% END %]
 </table>
 
+<h2> Website / Template Paths </h2>
+<table width="85%" cellspacing="2" cellpadding="1">
+<tr><td class="lhs" width="35%"> <b>Base URI</b> </td><td class="rhs" width="65%">[% request.config.uri_base %]</td></tr>
+<tr><td class="lhs" width="35%"> <b>Paths</b> </td><td class="rhs" width="65%"> [% paths %] </td></tr>
+</table>
+
 <h2> Application configuration </h2>
 <h2> Application configuration </h2>
-<table
-    [% FOR thing = config.keys %]
-    <tr> <td class="lhs"> [%thing %] </td> <td class="rhs"> [% 
-    config.$thing.list.join(" , ") %] </td></tr>
-    [% END %]
+<table width="85%" cellspacing="2" cellpadding="1">
+    <tr><td class="lhs"  width="35%"> <b>Model </b> </td><td class="rhs" width="65%"> [% request.config.model %] </td></tr>
+    <tr><td class="lhs"  width="35%"> <b>View </b> </td><td class="rhs" width="65%"> [% request.config.view %] </td></tr>
+    <tr><td class="lhs" width="35%"> <b>Classes</b> </td><td class="rhs" width="65%"> [% request.config.classes.list.join(" , ") %] </td></tr>
+    <tr><td class="lhs" width="35%"> <b>Tables</b> </td><td class="rhs" width="65%"> [% request.config.display_tables.list.join(" , ") %] </td></tr>
 </table>
 
 </body>
 </html>
 </table>
 
 </body>
 </html>
-
-