Commit 3ee3cf10 authored by joubu's avatar joubu Committed by Kyle M Hall

Bug 17971: TT syntax for notices - Add support for plurals

On of the awesome things we will be able to do with the TT syntax is the support of plurals.

For instance we will be able to send a list of items, checkouts, etc. to the notice template.
That way we will get rid of our custom syntax like <<items.content>> or <item></item> for instance.

The existing code already has the playground for that but it is not used.

Basically the idea is to add a "loops" key which can contain a list of
object to retrieve from the DB and send to the template.
For instance:
    loops => { overdues => [ $itemnumber_1, .., $itemnumber_N ] }

will send a variable "overdues" to the template. It will contain the
Koha::Checkout objects relative to the id passed.

There is one quite big inconvenient to this approach so far: since we
are still supporting the historical syntax, the objects can be fetch by
a script, then the script will send the id to GetPreparedLetter which
will refetch them.
This must be improved, but I suggest to do that later.

Test plan:
  prove t/db_dependent/Letters/TemplateToolkit.t
should return green
Signed-off-by: Josef Moravec's avatarJosef Moravec <josef.moravec@gmail.com>
Signed-off-by: Wm. Nick Clemens's avatarNick Clemens <nick@bywatersolutions.com>
Signed-off-by: default avatarKyle M Hall <kyle@bywatersolutions.com>
parent d3cb1b0a
......@@ -691,9 +691,10 @@ sub GetPreparedLetter {
my $tables = $params{tables} || {};
my $substitute = $params{substitute} || {};
my $loops = $params{loops} || {}; # loops is not supported for history syntax
my $repeat = $params{repeat};
%$tables || %$substitute || $repeat
or carp( "ERROR: nothing to substitute - both 'tables' and 'substitute' are empty" ),
%$tables || %$substitute || $repeat || %$loops
or carp( "ERROR: nothing to substitute - both 'tables', 'loops' and 'substitute' are empty" ),
return;
my $want_librarian = $params{want_librarian};
......@@ -770,6 +771,7 @@ sub GetPreparedLetter {
{
content => $letter->{content},
tables => $tables,
loops => $loops,
}
);
......@@ -1440,6 +1442,7 @@ sub _process_tt {
my $content = $params->{content};
my $tables = $params->{tables};
my $loops = $params->{loops};
my $use_template_cache = C4::Context->config('template_cache_dir') && defined $ENV{GATEWAY_INTERFACE};
my $template = Template->new(
......@@ -1454,7 +1457,7 @@ sub _process_tt {
}
) or die Template->error();
my $tt_params = _get_tt_params( $tables );
my $tt_params = { %{ _get_tt_params( $tables ) }, %{ _get_tt_params( $loops, 'is_a_loop' ) } };
my $output;
$template->process( \$content, $tt_params, \$output ) || croak "ERROR PROCESSING TEMPLATE: " . $template->error();
......@@ -1463,9 +1466,10 @@ sub _process_tt {
}
sub _get_tt_params {
my ($tables) = @_;
my ($tables, $is_a_loop) = @_;
my $params;
$is_a_loop ||= 0;
my $config = {
article_requests => {
......@@ -1558,7 +1562,14 @@ sub _get_tt_params {
my $pk = $config->{$table}->{pk};
my $fk = $config->{$table}->{fk};
if ( $ref eq q{} || $ref eq 'HASH' ) {
if ( $is_a_loop ) {
unless ( ref( $tables->{$table} ) eq 'ARRAY' ) {
croak "ERROR processing table $table. Wrong API call.";
}
my $objects = $module->search( { $pk => { -in => $tables->{$table} } } );
$params->{ $config->{$table}->{plural} } = $objects;
}
elsif ( $ref eq q{} || $ref eq 'HASH' ) {
my $id = ref $ref eq 'HASH' ? $tables->{$table}->{$pk} : $tables->{$table};
my $object;
if ( $fk ) { # Using a foreign key for lookup
......
......@@ -3,6 +3,7 @@
# This file is part of Koha.
#
# Copyright (C) 2016 ByWater Solutions
# Copyright (C) 2017 Koha Development Team
#
# Koha is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
......@@ -18,7 +19,7 @@
# along with Koha; if not, see <http://www.gnu.org/licenses>.
use Modern::Perl;
use Test::More tests => 16;
use Test::More tests => 17;
use Test::Warn;
use MARC::Record;
......@@ -378,6 +379,24 @@ subtest 'regression tests' => sub {
};
};
subtest 'loops' => sub {
plan tests => 1;
my $code = "TEST";
my $module = "TEST";
subtest 'primary key is AI' => sub {
plan tests => 1;
my $patron_1 = $builder->build({ source => 'Borrower' });
my $patron_2 = $builder->build({ source => 'Borrower' });
my $template = q|[% FOREACH patron IN borrowers %][% patron.surname %][% END %]|;
reset_template( { template => $template, code => $code, module => $module } );
my $letter = GetPreparedLetter( module => $module, letter_code => $code, loops => { borrowers => [ $patron_1->{borrowernumber}, $patron_2->{borrowernumber} ] } );
my $expected_letter = join '', ( $patron_1->{surname}, $patron_2->{surname} );
is( $letter->{content}, $expected_letter, );
};
};
sub reset_template {
my ( $params ) = @_;
my $template = $params->{template};
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment