Bug 23237: Plugin allow [% INCLUDE %] from template

From a plugin template it is useful to be able to include other templates with
[% INCLUDE %] directives. But TT module is used by Koha with absolute paths.
Relative paths are forbidden for security reasons. A new param [% PLUGIN_DIR %]
allow plugin templates to know where to find plugin home directory.

How to test:

1. Install kitchen-sink plugin.

2. Find tool-step1.tt file, and add this at the begining of the file:
   [% INCLUDE "$PLUGIN_DIR/header.tt" %]
   It ask to include a template header.tt which doesn't exit.

3. Run kitchen-sink plugin tool. You must have this error message:

   Template process failed: file error - _path to plugin
   directory_/Koha/Plugin/Com/ByWaterSolutions/KitchenSink/header.tt: not found

   quod erat demonstrandum

Signed-off-by: Maryse Simard <maryse.simard@inlibro.com>
Signed-off-by: Nick Clemens <nick@bywatersolutions.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
This commit is contained in:
Frédéric Demians 2019-06-29 08:55:34 +02:00 committed by Martin Renvoize
parent 43b0ef8f53
commit 8c517d2f28
Signed by: martin.renvoize
GPG key ID: 422B469130441A0F

View file

@ -119,6 +119,32 @@ sub retrieve_data {
get_template returns a Template object. Eventually this will probably be calling
C4:Template, but at the moment, it does not.
The returned template contains 3 variables that can be used in the plugin
templates:
=over 8
=item B<CLASS>
The name of the plugin class.
=item B<METHOD>
Then name of the plugin method used. For example 'tool' or 'report'.
=item B<PLUGIN_PATH>
The URL path to the plugin. It can be used in templates in order to localize
ressources like images in html tags, or other templates.
=item B<PLUGN_DIR>
The absolute pathname to the plugin directory. Necessary to include other
templates from a template with the [% INCLUDE %] directive.
=over
=cut
sub get_template {
@ -142,6 +168,7 @@ sub get_template {
CLASS => $self->{'class'},
METHOD => scalar $self->{'cgi'}->param('method'),
PLUGIN_PATH => $self->get_plugin_http_path(),
PLUGIN_DIR => $self->get_plugin_dir(),
);
return $template;
@ -150,7 +177,10 @@ sub get_template {
sub get_metadata {
my ( $self, $args ) = @_;
return $self->{'metadata'};
#FIXME: Why another encoding issue? For metadata containg non latin characters.
my $metadata = $self->{metadata};
utf8::decode($metadata->{$_}) for keys %$metadata;
return $metadata;
}
=head2 get_qualified_table_name
@ -185,6 +215,22 @@ sub get_plugin_http_path {
return "/plugin/" . join( '/', split( '::', $self->{'class'} ) );
}
=head2 get_plugin_dir
To [% INCLUDE %] another TT template from a template, an absolute path to the
template is required. This method returns that absolute file system path.
usage: my $path = $self->get_plugin_dir();
=cut
sub get_plugin_dir {
my ($self) = @_;
my $base = C4::Context->config('pluginsdir');
return "$base/" . join( '/', split( '::', $self->{'class'} ) );
}
=head2 go_home
go_home is a quick redirect to the Koha plugins home page