#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@…
comment:3 Antwort: ↓ 5 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
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.

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.