Erstellt vor 3 Jahren

Geschlossen vor 2 Jahren

Zuletzt geändert vor 2 Jahren

#1865 closed Fehler (fixed)

templatesystem $form{'tmpfile'} und chdir

Erstellt von: wulf@… Verantwortlicher: s.schoeling@…
Priorität: normal Meilenstein:
Komponente: kivitendo ERP Version: 2.7.0
Schweregrad: normal Stichworte:
Beobachter:

Beschreibung

template_meta.tempfile gibt es z.Z. nicht
aber es gibt tempfile
das ist allerdings der relative Pfad

Das Problem ist, dass LaTeX longtablex das verwendet um die
temporaere datei tabelle.tex zu schreiben
die wird aber zu einem Zeitpunkt geschrieben, wo
$PWD in ./users ist

14:49 < gorash> eventuell ist auch das chdir auf users einfach gonzo
14:49 < gorash> dann müssten aber alle pfade ohne users sein, und nicht
nur der temp pfad
14:51 < gorash> hmmmm..... as ist murks so

Änderungshistorie (5)

comment:1 Geändert vor 3 Jahren durch m.bunkus@…

  • Zusammenfassung von templatesystem $form{'tempfile'} und chdir nach templatesystem $form{'tmpfile'} und chdir geändert

comment:2 Geändert vor 3 Jahren durch m.bunkus@…

Analyse und Problembeschreibung.

Das chdir() in das temporäre Verzeichnis ist notwendig, um pdflatex laufen zu lassen. Zumindest aus Kompatibilitätsgründen will ich daran nicht rütteln.

Das aktuelle Interface bzgl. $form->{tmpfile} ist übel. Es wird in verschiedenen Rollen genutzt:

  1. Primär zur Kommunikation zwischen $form->parse_template() und den eigentlichen Template-Modulen
  2. Leider wird es ebenfalls vom Frontend der Mahnungen benutzt, um bei mehreren Aufrufen von $form->parse_template() die daraus erzeugten PDFs in eines zusammenzuschmelzen. Dazu wird der Parameter $form->{keep_tmpfile} gesetzt, damit $form->parse_template() die temporäre Datei nicht löscht.
  3. Manche Templates nutzen überhaupt kein Tempfile sondern schreiben direkt auf $form->{OUT}, was wiederum eine Datei, ein Filehandle sein kann. Noch lustiger wird es dadurch, dass in bei denjenigen, die von Haus aus keine temporäre Datei nutzen, das darüber erzwungen wird, dass in $form->{OUT} der Wert von $form->{tmpfile} geschrieben wird, sofern die Ausgabe nicht direkt an ein Ausgabegerät (Bildschirm oder Drucker) erfolgen soll -- genauer, wenn das Ergebnis per E-Mail verschickt werden soll.
  4. Es gibt LaTeX-Templates, die auf bestimmte Namensbestandteile in <%tmpfile%> prüfen (z.B. um eine Entscheidung über die Sprache zu treffen).

comment:3 Antwort: Geändert vor 3 Jahren durch m.bunkus@…

Ansätze zur Lösung.

chdir() nach users wird aus Kompatibilitätsgründen beibehalten.

Die Template-Module werden so umgestellt, dass sie ihr Ergebnis immer in einer temporären Datei hinterlassen. Der Name der zu beschreibenden Datei wird weiterhin in $form->{tmpfile} an die Template-Module übergeben. $form->{OUT} wird von den Template-Modulen nicht mehr berücksichtigt.

$form->{tmpfile} wird direkt nach dem chdir() entsprechend angepasst, sodass es zusammen mit dem aktuellen Verzeichnis einen gültigen Dateinamen ergibt. Die einfachste Möglichkeit dafür ist, in $form->{tmpfile} von Anfang (also noch vor dem chdir()) an einen absoluten Dateinamen zu hinterlegen. Dazu kann man trivial File::Spec nutzen. Alternativ kann man, ebenfalls mit File::Spec, einen relativen Pfad nach chdir() setzen und nach dem chdir() zurück zum Basispfad erneut umsetzen -- falls Kompatibilität mit der Verwendung in LaTeX-Templates eine Rolle spielen sollte.

$form->{tmpfile} bleibt rein intern zu $form->parse_template(). Für das externe Interface zum Mahnungsfrontend wird $form->{keep_tmpfile} in $form->{return_tmpfile} oder so umbenannt. Ist dieser gesetzt, wird die temporäre Datei nicht gelöscht. Ihr Dateinamen wird statt dessen von $form->parse_template() als Rückgabewert zurückgegeben.

comment:4 Geändert vor 2 Jahren durch wulf@…

  • Lösung auf fixed gesetzt
  • Status von new nach closed geändert

In d7acc048b63968c705d6575d83fe000f8cdecf35/erp:

in Dokumenten "template_meta.tmpfile" zur Verfuegung stellen
behebt #1865

(sorry fuer die falsche Mailadresse in b68213ba55ae268, war ich)

comment:5 als Antwort auf: ↑ 3 Geändert vor 2 Jahren durch wulf@…

chdir() nach users wird aus Kompatibilitätsgründen beibehalten.

$form->{tmpfile} wird direkt nach dem chdir() entsprechend angepasst, sodass es zusammen mit dem aktuellen Verzeichnis einen gültigen Dateinamen ergibt.

das passiert ja schon:

SL::Template::LaTeX->convert_to_pdf

  if (!chdir("$userspath")) {
    $self->{"error"} = "chdir : $!";
    $self->cleanup();
    return 0;
  }

  $form->{tmpfile} =~ s/\Q$userspath\E\///g;

ist zwar sinnvoll, nutzt bezueglich dieses Tickets aber nix, denn in den LaTeX-Vorlagen steht es mit Path, da ja die Variable <%tmpfile%> bereist in
SL::Template::LaTeX->parse (also vor convert_to_pdf) substituiert wurde.

Eine von $form->{tmpfile} unabhaengiger Dateiname soll aber auch nicht verwendet werden, da ja das Loeschen der temporaeren Dateien (incl. keep_temp_files = (0|1)) weiter auch fuer die ausgelagerte LaTeX-Datei greifen soll.

mein Vorschlag

Wir stellen template_meta.tmpfile (ohne ./users) zur Verfuegung, siehe commit.

Hinweis: Hilfe zur Verwendung von Tickets finden Sie in TracTickets.