From: Moritz Bunkus Date: Tue, 10 Jan 2012 10:37:33 +0000 (+0100) Subject: $::form-Variablen in Druckbefehlen verfügbar machen X-Git-Tag: release-2.7.0beta1~61^2~13^2~2^2~19 X-Git-Url: http://wagnertech.de/git?a=commitdiff_plain;h=0e7795f35b2e3f839001a9fdb7e21f4dd4f2f84e;p=kivitendo-erp.git $::form-Variablen in Druckbefehlen verfügbar machen Fix für Bugs 1740 und 1761. --- diff --git a/SL/Form.pm b/SL/Form.pm index 8bd11c3cf..48744060f 100644 --- a/SL/Form.pm +++ b/SL/Form.pm @@ -1114,8 +1114,13 @@ sub parse_template { } my $result; + my $command_formatter = sub { + my ($out_mode, $out) = @_; + return $out_mode eq '|-' ? SL::Template::create(type => 'ShellCommand', form => $self)->parse($out) : $out; + }; if ($self->{OUT}) { + $self->{OUT} = $command_formatter->($self->{OUT_MODE}, $self->{OUT}); open(OUT, $self->{OUT_MODE}, $self->{OUT}) or $self->error("error on opening $self->{OUT} with mode $self->{OUT_MODE} : $!"); } else { *OUT = ($::dispatcher->get_standard_filehandles)[1]; @@ -1200,6 +1205,8 @@ sub parse_template { #print(STDERR "OUT $self->{OUT}\n"); for my $i (1 .. $self->{copies}) { if ($self->{OUT}) { + $self->{OUT} = $command_formatter->($self->{OUT_MODE}, $self->{OUT}); + open OUT, $self->{OUT_MODE}, $self->{OUT} or $self->error($self->cleanup . "$self->{OUT} : $!"); print OUT $_ while ; close OUT; diff --git a/SL/Template.pm b/SL/Template.pm index df18e706e..ab499e99d 100644 --- a/SL/Template.pm +++ b/SL/Template.pm @@ -16,6 +16,7 @@ use SL::Template::HTML; use SL::Template::LaTeX; use SL::Template::OpenDocument; use SL::Template::PlainText; +use SL::Template::ShellCommand; use SL::Template::XML; sub create { diff --git a/SL/Template/ShellCommand.pm b/SL/Template/ShellCommand.pm new file mode 100644 index 000000000..082412909 --- /dev/null +++ b/SL/Template/ShellCommand.pm @@ -0,0 +1,51 @@ +package SL::Template::ShellCommand; + +use parent qw(SL::Template::LaTeX); + +use strict; + +use String::ShellQuote; + +sub new { + my $type = shift; + + return $type->SUPER::new(@_); +} + +sub substitute_vars { + my ($self, $text, @indices) = @_; + + my $form = $self->{"form"}; + + while ($text =~ /$self->{substitute_vars_re}/) { + my ($tag_pos, $tag_len) = ($-[0], $+[0] - $-[0]); + my ($var, @option_list) = split(/\s+/, $1); + my %options = map { ($_ => 1) } @option_list; + + my $value = $self->_get_loop_variable($var, 0, @indices); + $value = $form->parse_amount({ numberformat => $::myconfig{output_numberformat} || $::myconfig{numberformat} }, $value) if $options{NOFORMAT}; + $value = $self->format_string($value); # Don't allow NOESCAPE for arguments passed to shell commands. + + substr($text, $tag_pos, $tag_len, $value); + } + + return $text; +} + +sub format_string { + my ($self, $variable) = @_; + + return shell_quote_best_effort($variable); +} + +sub get_mime_type { + return "text/plain"; +} + +sub parse { + my ($self, $text) = @_; + + return $self->parse_block($text); +} + +1; diff --git a/doc/dokumentenvorlagen-und-variablen.html b/doc/dokumentenvorlagen-und-variablen.html index 1009f31ff..e1dac111b 100644 --- a/doc/dokumentenvorlagen-und-variablen.html +++ b/doc/dokumentenvorlagen-und-variablen.html @@ -51,6 +51,9 @@ td {
  • Variablen ausgeben
  • +
  • Verwendung in Druckbefehlen +
  • +
  • Anfang und Ende der Tags verändern
  • @@ -229,6 +232,31 @@ td { zum Inhaltsverzeichnis

    +

    Verwendung in Druckbefehlen

    + +

    + In der Admininstration können Drucker definiert werden. Auch im dort + eingebbaren Druckbefehl können die hier aufgelisteten Variablen und + Kontrollstrukturen verwendet werden. Ihr Inhalt wird dabei nach den + Regeln der gängigen Shells formatiert, sodass Sonderzeichen + wie `...` nicht zu unerwünschtem Verhalten führen. +

    + +

    + Dies erlaubt z.B. die Definition eines Faxes als Druckerbefehl, für + das die Telefonnummer eines Ansprechpartners als Teil der + Kommandozeile verwendet wird. Für ein fiktives Kommando könnte das + z.B. wie folgt aussehen: +

    + +

    + send_fax --number <%if cp_phone2%><%cp_phone2%><%else%><%cp_phone1%><%end%> +

    + + + zum Inhaltsverzeichnis
    +
    +

    Anfang und Ende der Tags verändern